def __init__(self, d): self.iris = np.loadtxt("iris.txt") if d > len(self.iris[0]): raise Exception("Le nombre de dimensions est trop grand!") # 4.1 Mélange les exemples d'Iris et diviser l'ensemble de tous les exemples en 2. np.random.seed(123) np.random.shuffle(self.iris) # On place 108 exemples dans l'ensemble d'entrainement et 42 dans l'ensemble de validation self.trainSetSize = 108 self.classCount = 3 # Nombre de classes self.d = d self.trainSet = np.zeros((self.trainSetSize, d + 1)) for i in range(self.trainSetSize): for j in range(d): self.trainSet[i][j] = self.iris[i, j] self.trainSet[i][d] = self.iris[i, -1] self.validationSet = np.zeros((len(self.iris) - self.trainSetSize, d + 1)) for i in range(len(self.iris) - self.trainSetSize): for j in range(d): self.validationSet[i][j] = self.iris[i + self.trainSetSize, j] self.validationSet[i][d] = self.iris[i + self.trainSetSize, -1] # 4.2 a) Algorithme de classifieur de Bayes basé sur des densités paramétriques Gaussiennes diagonales # Voir classifieur_bayes.py # 4.2 b) Entrainement d'un classifieur de Bayes sur l'ensemble d'entrainement... self.classifieur = classifieur_bayes.creerClassifieur(self.trainSet, "gaussien", 3)
def getClassifieurBayesGaussienGraphs(self): #4.3 b) Entrainement d'un classifieur de Bayes sur l'ensemble d'entrainement visualisation des résultats sigmas = [0.01, 0.5, 10] for sigma in sigmas: args = {'sigma': sigma} classifieur = classifieur_bayes.creerClassifieur(self.trainSet, "parzen", 3, args) minX1 = min(self.iris[:, 0]) maxX1 = max(self.iris[:, 0]) minX2 = min(self.iris[:, 1]) maxX2 = max(self.iris[:, 1]) x1Vals = np.linspace(minX1, maxX1) x2Vals = np.linspace(minX2, maxX2) grille = [] step = 0.05 i = minX1 while i < maxX1: j = minX2 while j < maxX2: grille.append([i, j]) j += step i += step grille = np.array(grille) logProbabiliteGrille = classifieur.computePredictions(grille) classesPreditesGrille = logProbabiliteGrille.argmax(1)+1 pyplot.scatter(grille[:, 0], grille[:, 1], s=50, c=classesPreditesGrille, alpha=0.25) pyplot.scatter(self.trainSet[:, 0], self.trainSet[:, 1], c=self.iris[0:self.trainSetSize, -1], marker='v', s=100) pyplot.scatter(self.validationSet[:, 0], self.validationSet[:, 1], c=self.iris[self.trainSetSize:, -1], marker='s', s=100) pyplot.title("Regions de decision (sigma = "+str(sigma)+")") #pylab.show() fileTitle = 'bayes_parzen_'+str(sigma)+'.png' pyplot.savefig(fileTitle) print("[Created] file : " + fileTitle) pyplot.close()
def calculErreurs(self, sigmas): tauxErreurs = [] for i in sigmas: sigma = i/100. args = {'sigma': sigma} classifieur = classifieur_bayes.creerClassifieur(self.trainSet, "parzen", 3, args) logProbabiliteTrain = classifieur.computePredictions(self.trainSet[:, :-1]) classesPreditesTrain = logProbabiliteTrain.argmax(1)+1 logProbabiliteValidation = classifieur.computePredictions(self.validationSet[:, :-1]) classesPreditesValidation = logProbabiliteValidation.argmax(1)+1 tauxErreurs.append(classifieur_bayes.calculateTauxErreur(self.iris, classesPreditesTrain, classesPreditesValidation)) tauxErreurs = np.array(tauxErreurs) sigmaMinIndex = np.argmin(tauxErreurs[:, 1]) sigmaMin = sigmas[sigmaMinIndex]/100. classifieur_bayes.afficherTauxErreur(tauxErreurs[np.argmin(tauxErreurs[:, 1]), 0], tauxErreurs[np.argmin(tauxErreurs[:, 1]), 1], self.d, sigmaMin) for i in range(len(sigmas)): sigmas[i] /= 100.0 pyplot.plot(sigmas, tauxErreurs[:, 0], c="red") pyplot.plot(sigmas, tauxErreurs[:, 1], c="green") pyplot.xlabel("Sigma") pyplot.ylabel("Taux d'erreur") pyplot.title("Courbes d'apprentissage") red = mpatches.Patch(color="red", label="Erreur d'apprentissage") green = mpatches.Patch(color="green", label="Erreur de validation") pyplot.legend(handles=[red, green]) fileTitle = 'bayes_parzen_'+str(self.d)+'d.png' pyplot.savefig(fileTitle) print("[Created] file : " + fileTitle) #pyplot.show() pyplot.close()