Commit 32f4375b authored by Massih-Reza Amini's avatar Massih-Reza Amini
Browse files

message

parent 86c684f5
......@@ -2,48 +2,155 @@
# Perceptron
%% Cell type:markdown id: tags:
Nous allons nous intéresser à l'implémentation de l'algorithme du perceptron (Rosenblatt, 68) dont le pseudo-code est le suivant:
Nous allons nous intéresser à l'algorithme du perceptron (Rosenblatt, 58) dont le pseudo-code est le suivant:
`input: Train, eta, m, MaxEp
init : w
epoque=0
err=1
while epoque<=MaxEp and err!=0
err=0
for i in 1:m
choisir un exemple (x,y) de Train de façon aléatoire
dp <- w*x
prendre le i-ième exemple (x,y) de Train
dp <- produit_scalaire(x,w)
if (dp <= 0)
w <- w + eta*y*x
err <- err+1
epoque <- epoque+1
output: w`
1. Créer une liste de 4 éléments correspondant à l'exemple ET logique; chaque élément de la liste est une liste dont la dernière caractéristique est la classe de l'exemple et les premières caractéristiques leurs coordonnées.
2. Coder le programme du Perceptron
Le but étant de l'appliquer à quelques bases de la collection UCI (http://archive.ics.uci.edu/ml/index.php). En commençant par la base sonar qui constient 208 exemples en dimension 60 séparés par `,` et la dernière élément correspond à la classe de l'exemple.
Indication: Vous pouvez écrire une fonction qui calcule le produit scalaire entre un exemple $\mathbf{x}=(x_1,\ldots,x_d)$ et le vecteur poids $\mathbf{w}=(w_0,w_1,\ldots,w_d)$:
$\langle \mathbf{w},\mathbf{x} \rangle=w_0+\sum_{j=1}^d w_j x_j$; et une autre qui pour une matrice de données qui n'ont pas servi à apprendre le vecteur poids $\mathbf{w}$, calcule le taux d'erreur sur cette base.
Pour cela nous allons nous appuyer sur les fonctions suivantes:
3. Appliquer le programme du perceptron sur la base du ET logique, calculer le taux d'erreur du modèle sur cette base.
4. Nous allons maintenant nous intéresser au comportement du modèle sur la base sonar de la collection UCI (http://archive.ics.uci.edu/ml/index.php). Cette base contient 208 exemples en dimension 60 séparés par `,` et la dernière élément correspond à la classe de l'exemple.
1. Télécharger la collection avec la fonction read_table de la librairie pandas (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_table.html). Les options nécessaires sont `sep=','` et `header=None`
2. Créer une liste de listes correspondant à la collection; pour cela initialiser la première liste et en parcourant chaque ligne de la matrice de données; créer une liste associée en remplaçant le dernier élément par `-1` ou `+1` et insérer la dans la première liste.
Indication: Utiliser la fonction `loc`.
3. Scinder la liste en deux listes `x_train` (75%) and `x_test` (25%) en la mélangeant aléatoirement au préalable.
Indication: Utiliser les fonctions `shuffle` de la librairie `random` et `train_test_split` de la librairie `sklearn.model_selection`
4. Appliquer l'algorithme du perceptron avec un pas d'apprentissage fixe $\eta=0.1$
5. Trouver le meilleur pas d'apprentissage avec faisant $K=5$ validation croisée sur la partie `x_train`.
6. Télécharger les bases https://archive.ics.uci.edu/ml/datasets/spambase, https://archive.ics.uci.edu/ml/datasets/heart+Disease, https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Original%29, https://archive.ics.uci.edu/ml/datasets/Ionosphere et tourner l'algorithme du perceptron en choisissant le meilleur pas avec la validation croisée.
7. Reporter dans le tableau ci-dessous la moyenne des taux d'erreur en répétant chaque expérience 20 fois
* La fonction `ConstTrainTest` qui va télécharger la collection avec la fonction read_table de la librairie pandas (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_table.html), et crée une liste de listes qui contient chacune le vecteur représentatif d'un exemple en ajoutant sa classe en fin de la liste. En sortie, cette fonction retourne deux bases d'apprentissage et de test avec des proportions données:
%% Cell type:code id: tags:
``` python
import pandas as pd
import random
from sklearn.model_selection import train_test_split
def ConstTrainTest(filename,perTest):
tag_df=pd.read_table(filename,sep=',',header=None)
print(len(tag_df))
Dic={'R': -1, 'M': +1}
X=[]
for e in range(len(tag_df)):
x=list(tag_df.loc[e,:])
cls=x.pop()
x.insert(len(x),Dic[cls])
X.append(x)
random.shuffle(X)
x_train ,x_test = train_test_split(X,test_size=perTest)
return x_train,x_test
```
%% Cell type:markdown id: tags:
* La fonction `dotproduct` qui calcule le produit scalaire entre un exemple $\mathbf{x}=(x_1,\ldots,x_d)$ et le vecteur poids $\mathbf{w}=(w_0,w_1,\ldots,w_d)$: $\langle \mathbf{w},\mathbf{x} \rangle=w_0+\sum_{j=1}^d w_j x_j$
%% Cell type:code id: tags:
``` python
def dotproduct(x,w):
res=w[0]
for i in range(len(x)-1):
res+=w[i+1]*x[i]
return res
```
%% Cell type:markdown id: tags:
1. Appelez la fonction la fonction `ConstTrainTest` pour créer les bases d'apprentissage (Train) et de test (Test) avec une proportion 75% et 25%.
%% Cell type:code id: tags:
``` python
Train,Test=ConstTrainTest('sonar.txt',0.25)
```
%% Cell type:markdown id: tags:
* L'algorithtme du perceptron prend en entrée la base Train, le nombre maximum d'époques et un pas d'apprentissage eta et donne en sortie le vecteur poids et l'erreur commise à la dernière époque:
%% Cell type:code id: tags:
``` python
def perceptron(Train,MaxEpoch,eta):
W=[0.0 for i in range(len(Train[0]))]
epoch=0
err=1
d=len(Train[0])-1
E=[]
while (epoch<MaxEpoch and err!=0):
err=0
for x in Train:
dp=dotproduct(x,W)
if(x[d]*dp<=0):
err+=1
W[0]+=eta*x[d]
for i in range(d):
W[i+1]+=eta*x[d]*x[i]
E.append(err)
epoch+=1
return W,E
```
%% Cell type:markdown id: tags:
2. Tournez l'algorithme sur la base Train avec 1000 époques et un pas de eta=0.1
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
3. Modifiez le code pour avoir la liste des erreurs commises à chaque époque. On appelera cette liste E. Le but étant d'afficher les erreurs en s'aidant de la fonction suivante:
%% Cell type:code id: tags:
``` python
import matplotlib.pyplot as plt
def plotting(X,Y,strtitle,strxlabel,strylabel):
plt.plot(X, Y)
plt.yscale('linear')
plt.title(strtitle)
plt.xlabel(strxlabel)
plt.ylabel(strylabel)
plt.grid(True)
```
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
4. Téléchargez les bases https://archive.ics.uci.edu/ml/datasets/spambase, https://archive.ics.uci.edu/ml/datasets/heart+Disease, https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Original%29, https://archive.ics.uci.edu/ml/datasets/Ionosphere et reportez dans le tableau ci-dessous les erreurs du modèles sur les bases tests (on gardera les mêmes paramètres qu'avant)
| Collection | Perceptron |
|------------|------------|
| Breast | |
| Ionosphere | |
| Heart | |
| Sonar | |
| Spam | |
%% Cell type:code id: tags:
``` python
```
......
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment