Skip to content

Commit 79c8d86

Browse files
author
mbouchard21
committed
Refactoring
Also solved sigmaMin displayed in 4.3 and added legends to reports
1 parent 5424b60 commit 79c8d86

File tree

4 files changed

+197
-190
lines changed

4 files changed

+197
-190
lines changed

src/classifieur_bayes.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,11 @@ def calculateTauxErreur(dataSet, classesPreditesTrain, classesPreditesValidation
8686

8787
return [tauxErreurTrainSet, tauxErreurValidationSet]
8888

89-
def afficherTauxErreur(tauxErreurTrainSet, tauxErreurValidationSet, d):
89+
def afficherTauxErreur(tauxErreurTrainSet, tauxErreurValidationSet, d, sigma=None):
9090
print "\n######################"
9191
print "d="+str(d)
92+
if sigma is not None:
93+
print "sigma="+str(sigma)
9294
print "Taux d'erreur sur l'ensemble d'entrainement: %.2f%%" % tauxErreurTrainSet
9395

9496
if tauxErreurValidationSet != -1:

src/classifieur_bayes_gauss.py

Lines changed: 76 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -4,85 +4,79 @@
44
import pylab
55
import classifieur_bayes
66

7-
iris = np.loadtxt("iris.txt")
8-
#4.1 Mélange les exemples d'Iris et diviser l'ensemble de tous les exemples en 2.
9-
np.random.seed(123)
10-
np.random.shuffle(iris)
11-
12-
#On place 108 exemples dans l'ensemble d'entrainement et 42 dans l'ensemble de validation
13-
trainSetSize = 108
14-
classCount = 3 #Nombre de classes
15-
16-
#d = 4
17-
completeTrainSet = iris[0:trainSetSize, :]
18-
completeValidationSet = iris[trainSetSize:, :]
19-
20-
#d = 2
21-
partialTrainSet = np.zeros((trainSetSize, 3))
22-
for i in range(trainSetSize):
23-
partialTrainSet[i][0] = iris[i, 0]
24-
partialTrainSet[i][1] = iris[i, 1]
25-
partialTrainSet[i][2] = iris[i, -1]
26-
27-
partialValidationSet = np.zeros((len(iris)-trainSetSize, 3))
28-
for i in range(len(iris)-trainSetSize):
29-
partialValidationSet[i][0] = iris[i+trainSetSize, 0]
30-
partialValidationSet[i][1] = iris[i+trainSetSize, 1]
31-
partialValidationSet[i][2] = iris[i+trainSetSize, -1]
32-
33-
#4.2 a) Algorithme de classifieur de Bayes basé sur des densités paramétriques Gaussiennes diagonales
34-
# Voir classifieur_bayes.py
35-
36-
#4.2 b) Entrainement d'un classifieur de Bayes sur l'ensemble d'entrainement (d=2) et visualisation des résultats
37-
#classifieur = createClassifieurBayesGaussien(partialTrainSet)
38-
classifieur = classifieur_bayes.creerClassifieur(partialTrainSet, "gaussien", 3)
39-
40-
minX1 = min(iris[:, 0])
41-
maxX1 = max(iris[:, 0])
42-
minX2 = min(iris[:, 1])
43-
maxX2 = max(iris[:, 1])
44-
45-
x1Vals = np.linspace(minX1, maxX1)
46-
x2Vals = np.linspace(minX2, maxX2)
47-
48-
grille = []
49-
step = 0.05
50-
i = minX1
51-
while i < maxX1:
52-
j = minX2
53-
while j < maxX2:
54-
grille.append([i, j])
55-
j += step
56-
i += step
57-
grille = np.array(grille)
58-
59-
logProbabiliteGrille = classifieur.computePredictions(grille)
60-
classesPreditesGrille = logProbabiliteGrille.argmax(1)+1
61-
62-
pylab.scatter(grille[:, 0], grille[:, 1], s=50, c=classesPreditesGrille, alpha=0.25)
63-
pylab.scatter(partialTrainSet[:, 0], partialTrainSet[:, 1], c=iris[0:trainSetSize, -1], marker='v', s=100)
64-
pylab.scatter(partialValidationSet[:, 0], partialValidationSet[:, 1], c=iris[trainSetSize:, -1], marker='s', s=100)
65-
66-
#4.2 c) Calcul des erreurs en dimension d = 2
67-
logProbabiliteTrain = classifieur.computePredictions(partialTrainSet[:, :-1])
68-
classesPreditesTrain = logProbabiliteTrain.argmax(1)+1
69-
70-
logProbabiliteValidation = classifieur.computePredictions(partialValidationSet[:, :-1])
71-
classesPreditesValidation = logProbabiliteValidation.argmax(1)+1
72-
73-
tauxErreur = classifieur_bayes.calculateTauxErreur(iris, classesPreditesTrain, classesPreditesValidation)
74-
classifieur_bayes.afficherTauxErreur(tauxErreur[0], tauxErreur[1], 2)
75-
76-
#4.2 d) Calcul des erreurs en dimension d = 4
77-
classifieur = classifieur_bayes.creerClassifieur(completeTrainSet, "gaussien", 3)
78-
logProbabiliteTrain = classifieur.computePredictions(completeTrainSet[:, :-1])
79-
classesPreditesTrain = logProbabiliteTrain.argmax(1)+1
80-
81-
logProbabiliteValidation = classifieur.computePredictions(completeValidationSet[:, :-1])
82-
classesPreditesValidation = logProbabiliteValidation.argmax(1)+1
83-
84-
tauxErreur = classifieur_bayes.calculateTauxErreur(iris, classesPreditesTrain, classesPreditesValidation)
85-
classifieur_bayes.afficherTauxErreur(tauxErreur[0], tauxErreur[1], 4)
86-
87-
pylab.show()
88-
pylab.close()
7+
class ClassifieurBayesGaussien:
8+
def __init__(self, d):
9+
self.iris = np.loadtxt("iris.txt")
10+
11+
if d > len(self.iris[0]):
12+
raise Exception('Le nombre de dimensions est trop grand!')
13+
14+
#4.1 Mélange les exemples d'Iris et diviser l'ensemble de tous les exemples en 2.
15+
np.random.seed(123)
16+
np.random.shuffle(self.iris)
17+
18+
#On place 108 exemples dans l'ensemble d'entrainement et 42 dans l'ensemble de validation
19+
self.trainSetSize = 108
20+
self.classCount = 3 #Nombre de classes
21+
self.d = d
22+
23+
self.trainSet = np.zeros((self.trainSetSize, d+1))
24+
for i in range(self.trainSetSize):
25+
for j in range(d):
26+
self.trainSet[i][j] = self.iris[i, j]
27+
self.trainSet[i][d] = self.iris[i, -1]
28+
29+
self.validationSet = np.zeros((len(self.iris)-self.trainSetSize, d+1))
30+
for i in range(len(self.iris)-self.trainSetSize):
31+
for j in range(d):
32+
self.validationSet[i][j] = self.iris[i+self.trainSetSize, j]
33+
self.validationSet[i][d] = self.iris[i+self.trainSetSize, -1]
34+
35+
#4.2 a) Algorithme de classifieur de Bayes basé sur des densités paramétriques Gaussiennes diagonales
36+
# Voir classifieur_bayes.py
37+
38+
#4.2 b) Entrainement d'un classifieur de Bayes sur l'ensemble d'entrainement...
39+
self.classifieur = classifieur_bayes.creerClassifieur(self.trainSet, "gaussien", 3)
40+
41+
def getClassifieurBayesGaussienGraph(self):
42+
#4.2 b) ... visualisation des résultats
43+
minX1 = min(self.iris[:, 0])
44+
maxX1 = max(self.iris[:, 0])
45+
minX2 = min(self.iris[:, 1])
46+
maxX2 = max(self.iris[:, 1])
47+
48+
x1Vals = np.linspace(minX1, maxX1)
49+
x2Vals = np.linspace(minX2, maxX2)
50+
51+
grille = []
52+
step = 0.05
53+
i = minX1
54+
while i < maxX1:
55+
j = minX2
56+
while j < maxX2:
57+
grille.append([i, j])
58+
j += step
59+
i += step
60+
grille = np.array(grille)
61+
62+
logProbabiliteGrille = self.classifieur.computePredictions(grille)
63+
classesPreditesGrille = logProbabiliteGrille.argmax(1)+1
64+
65+
pylab.scatter(grille[:, 0], grille[:, 1], s=50, c=classesPreditesGrille, alpha=0.25)
66+
pylab.scatter(self.trainSet[:, 0], self.trainSet[:, 1], c=self.iris[0:self.trainSetSize, -1], marker='v', s=100)
67+
pylab.scatter(self.validationSet[:, 0], self.validationSet[:, 1], c=self.iris[self.trainSetSize:, -1], marker='s', s=100)
68+
pylab.title("Regions de decision")
69+
#pylab.show()
70+
pylab.savefig('bayes_gaussienne.png')
71+
pylab.close()
72+
73+
#4.2 c) d) Calcul des erreurs en dimension d
74+
def printTauxErreur(self):
75+
logProbabiliteTrain = self.classifieur.computePredictions(self.trainSet[:, :-1])
76+
classesPreditesTrain = logProbabiliteTrain.argmax(1)+1
77+
78+
logProbabiliteValidation = self.classifieur.computePredictions(self.validationSet[:, :-1])
79+
classesPreditesValidation = logProbabiliteValidation.argmax(1)+1
80+
81+
tauxErreur = classifieur_bayes.calculateTauxErreur(self.iris, classesPreditesTrain, classesPreditesValidation)
82+
classifieur_bayes.afficherTauxErreur(tauxErreur[0], tauxErreur[1], self.d)

src/classifieur_bayes_parzen.py

Lines changed: 103 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,108 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
33
import numpy as np
4-
import pylab
4+
import matplotlib.pyplot as pyplot
5+
import matplotlib.patches as mpatches
56
import classifieur_bayes
67

7-
iris = np.loadtxt("iris.txt")
8-
#4.1 Mélange les exemples d'Iris et diviser l'ensemble de tous les exemples en 2.
9-
#np.random.seed(123)
10-
np.random.shuffle(iris)
11-
12-
#On place 108 exemples dans l'ensemble d'entrainement et 42 dans l'ensemble de validation
13-
trainSetSize = 108
14-
classCount = 3 #Nombre de classes
15-
16-
#d = 4
17-
completeTrainSet = iris[0:trainSetSize, :]
18-
completeValidationSet = iris[trainSetSize:, :]
19-
20-
#d = 2
21-
partialTrainSet = np.zeros((trainSetSize, 3))
22-
for i in range(trainSetSize):
23-
partialTrainSet[i][0] = iris[i, 0]
24-
partialTrainSet[i][1] = iris[i, 1]
25-
partialTrainSet[i][2] = iris[i, -1]
26-
27-
partialValidationSet = np.zeros((len(iris)-trainSetSize, 3))
28-
for i in range(len(iris)-trainSetSize):
29-
partialValidationSet[i][0] = iris[i+trainSetSize, 0]
30-
partialValidationSet[i][1] = iris[i+trainSetSize, 1]
31-
partialValidationSet[i][2] = iris[i+trainSetSize, -1]
32-
33-
#4.3 a) Algorithme de classifieur de Bayes basé sur des densités des Parzen avec noyau isotropique
34-
# Voir classifieur_bayes.py
35-
36-
#4.3 b) Entrainement d'un classifieur de Bayes sur l'ensemble d'entrainement (d=2) et visualisation des résultats
37-
sigmas = [0.08, 9, 20]
38-
39-
for sigma in sigmas:
40-
args = {'sigma': sigma}
41-
classifieur = classifieur_bayes.creerClassifieur(partialTrainSet, "parzen", 3, args)
42-
43-
minX1 = min(iris[:, 0])
44-
maxX1 = max(iris[:, 0])
45-
minX2 = min(iris[:, 1])
46-
maxX2 = max(iris[:, 1])
47-
48-
x1Vals = np.linspace(minX1, maxX1)
49-
x2Vals = np.linspace(minX2, maxX2)
50-
51-
grille = []
52-
step = 0.05
53-
i = minX1
54-
while i < maxX1:
55-
j = minX2
56-
while j < maxX2:
57-
grille.append([i, j])
58-
j += step
59-
i += step
60-
grille = np.array(grille)
61-
62-
logProbabiliteGrille = classifieur.computePredictions(grille)
63-
classesPreditesGrille = logProbabiliteGrille.argmax(1)+1
64-
65-
pylab.scatter(grille[:, 0], grille[:, 1], s=50, c=classesPreditesGrille, alpha=0.25)
66-
pylab.scatter(partialTrainSet[:, 0], partialTrainSet[:, 1], c=iris[0:trainSetSize, -1], marker='v', s=100)
67-
pylab.scatter(partialValidationSet[:, 0], partialValidationSet[:, 1], c=iris[trainSetSize:, -1], marker='s', s=100)
68-
#pylab.show()
69-
pylab.savefig('bayes_parzen_'+str(sigma)+'.png')
70-
pylab.close()
71-
72-
def calculErreurs(trainSet, validationSet, d, nClasses, sigmas):
73-
tauxErreurs = []
74-
75-
for i in sigmas:
76-
sigma = i/100.0
77-
args = {'sigma': sigma}
78-
classifieur = classifieur_bayes.creerClassifieur(trainSet, "parzen", nClasses, args)
79-
logProbabiliteTrain = classifieur.computePredictions(trainSet[:, :-1])
80-
classesPreditesTrain = logProbabiliteTrain.argmax(1)+1
81-
82-
logProbabiliteValidation = classifieur.computePredictions(validationSet[:, :-1])
83-
classesPreditesValidation = logProbabiliteValidation.argmax(1)+1
84-
85-
tauxErreurs.append(classifieur_bayes.calculateTauxErreur(iris, classesPreditesTrain, classesPreditesValidation))
86-
87-
tauxErreurs = np.array(tauxErreurs)
88-
sigmaMin = np.argmin(tauxErreurs[1, :])+1
89-
90-
print "Meilleur sigma: "+str(float(sigmaMin)/100)
91-
classifieur_bayes.afficherTauxErreur(tauxErreurs[np.argmin(tauxErreurs[:, 1]), 0], tauxErreurs[np.argmin(tauxErreurs[:, 1]), 1], d)
92-
93-
for i in range(len(sigmas)):
94-
sigmas[i] /= 100.0
95-
96-
pylab.plot(sigmas, tauxErreurs[:, 0])
97-
pylab.plot(sigmas, tauxErreurs[:, 1])
98-
pylab.savefig('bayes_parzen_'+str(d)+'d.png')
99-
#pylab.show()
100-
pylab.close()
101-
102-
#4.2 c) Calcul des erreurs en dimension d = 2
103-
sigmas = range(1, 2000, 20)
104-
calculErreurs(partialTrainSet, partialValidationSet, 2, 3, sigmas)
105-
106-
107-
#4.2 d) Calcul des erreurs en dimension d = 4
108-
sigmas = range(1, 20000, 200)
109-
calculErreurs(completeTrainSet, completeValidationSet, 4, 3, sigmas)
8+
class ClassifieurBayesParzen:
9+
def __init__(self, d):
10+
self.iris = np.loadtxt("iris.txt")
11+
#4.1 Mélange les exemples d'Iris et diviser l'ensemble de tous les exemples en 2.
12+
np.random.seed(123)
13+
np.random.shuffle(self.iris)
14+
15+
#On place 108 exemples dans l'ensemble d'entrainement et 42 dans l'ensemble de validation
16+
self.trainSetSize = 108
17+
self.classCount = 3 #Nombre de classes
18+
self.d = d
19+
20+
self.trainSet = np.zeros((self.trainSetSize, d+1))
21+
for i in range(self.trainSetSize):
22+
for j in range(d):
23+
self.trainSet[i][j] = self.iris[i, j]
24+
self.trainSet[i][d] = self.iris[i, -1]
25+
26+
self.validationSet = np.zeros((len(self.iris)-self.trainSetSize, d+1))
27+
for i in range(len(self.iris)-self.trainSetSize):
28+
for j in range(d):
29+
self.validationSet[i][j] = self.iris[i+self.trainSetSize, j]
30+
self.validationSet[i][d] = self.iris[i+self.trainSetSize, -1]
31+
32+
#4.3 a) Algorithme de classifieur de Bayes basé sur des densités des Parzen avec noyau isotropique
33+
# Voir classifieur_bayes.py
34+
35+
def getClassifieurBayesGaussienGraphs(self):
36+
#4.3 b) Entrainement d'un classifieur de Bayes sur l'ensemble d'entrainement visualisation des résultats
37+
sigmas = [0.08, 0.5, 10]
38+
39+
for sigma in sigmas:
40+
args = {'sigma': sigma}
41+
classifieur = classifieur_bayes.creerClassifieur(self.trainSet, "parzen", 3, args)
42+
43+
minX1 = min(self.iris[:, 0])
44+
maxX1 = max(self.iris[:, 0])
45+
minX2 = min(self.iris[:, 1])
46+
maxX2 = max(self.iris[:, 1])
47+
48+
x1Vals = np.linspace(minX1, maxX1)
49+
x2Vals = np.linspace(minX2, maxX2)
50+
51+
grille = []
52+
step = 0.05
53+
i = minX1
54+
while i < maxX1:
55+
j = minX2
56+
while j < maxX2:
57+
grille.append([i, j])
58+
j += step
59+
i += step
60+
grille = np.array(grille)
61+
62+
logProbabiliteGrille = classifieur.computePredictions(grille)
63+
classesPreditesGrille = logProbabiliteGrille.argmax(1)+1
64+
65+
pyplot.scatter(grille[:, 0], grille[:, 1], s=50, c=classesPreditesGrille, alpha=0.25)
66+
pyplot.scatter(self.trainSet[:, 0], self.trainSet[:, 1], c=self.iris[0:self.trainSetSize, -1], marker='v', s=100)
67+
pyplot.scatter(self.validationSet[:, 0], self.validationSet[:, 1], c=self.iris[self.trainSetSize:, -1], marker='s', s=100)
68+
pyplot.title("Regions de decision (sigma = "+str(sigma)+")")
69+
#pylab.show()
70+
pyplot.savefig('bayes_parzen_'+str(sigma)+'.png')
71+
pyplot.close()
72+
73+
def calculErreurs(self, sigmas):
74+
tauxErreurs = []
75+
76+
for i in sigmas:
77+
sigma = i/100.
78+
args = {'sigma': sigma}
79+
classifieur = classifieur_bayes.creerClassifieur(self.trainSet, "parzen", 3, args)
80+
logProbabiliteTrain = classifieur.computePredictions(self.trainSet[:, :-1])
81+
classesPreditesTrain = logProbabiliteTrain.argmax(1)+1
82+
83+
logProbabiliteValidation = classifieur.computePredictions(self.validationSet[:, :-1])
84+
classesPreditesValidation = logProbabiliteValidation.argmax(1)+1
85+
86+
tauxErreurs.append(classifieur_bayes.calculateTauxErreur(self.iris, classesPreditesTrain, classesPreditesValidation))
87+
88+
tauxErreurs = np.array(tauxErreurs)
89+
sigmaMinIndex = np.argmin(tauxErreurs[:, 1])
90+
sigmaMin = sigmas[sigmaMinIndex]/100.
91+
92+
classifieur_bayes.afficherTauxErreur(tauxErreurs[np.argmin(tauxErreurs[:, 1]), 0], tauxErreurs[np.argmin(tauxErreurs[:, 1]), 1], self.d, sigmaMin)
93+
94+
for i in range(len(sigmas)):
95+
sigmas[i] /= 100.0
96+
97+
pyplot.plot(sigmas, tauxErreurs[:, 0], c="red")
98+
pyplot.plot(sigmas, tauxErreurs[:, 1], c="green")
99+
pyplot.xlabel("Sigma")
100+
pyplot.ylabel("Taux d'erreur")
101+
pyplot.title("Courbes d'apprentissage")
102+
red = mpatches.Patch(color="red", label="Erreur d'apprentissage")
103+
green = mpatches.Patch(color="green", label="Erreur de validation")
104+
pyplot.legend(handles=[red, green])
105+
pyplot.savefig('bayes_parzen_'+str(self.d)+'d.png')
106+
#pyplot.show()
107+
pyplot.close()
108+

0 commit comments

Comments
 (0)