Bonjour,
J'essaye actuellement d'implémenter le classifieur bayesien naif en python avec la librairie numpy. Le but est de pouvoir classer des images qui contiennet des chiffres manuscrits (les chiffres vont de 0 a 9, et il y a un chiffre par image). Les images ont des dimensions 28x28. J'essaye de reduire leurs dimensions en utilisant l'ACP (j'ai essayé en reduisant a 50 ou 150 dimensions)
Mais j'ai un gros problème avec mes matrices de covariances qui ont toujours un déterminant égal a zéro, du coup je ne peux jamais calculer l'inverse des matrices de covariances, ni calculer les vraisemblances de mes observations.
Je ne sais vraiment pas d'où vient le problème. Je vais donc vous détailler les principales étapes de mon code en espérant que quelqu'un comprenne le problème.
Extraction des images:
Ci-dessous voici comment je stocke mes images dans des listes
Je possède aussi une liste d’étiquettes, ce sont les classes (chiffres de 0 à 9) associées aux images. Stockée dans la liste labelsList
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #filePath est le chemin de l'image img=Image.open(filePath) #imgIntensity est un tableau contenant 28 tableaux, chacun contenant une ligne de 28 elements imgIntensity = asarray(img) flatImg = imgIntensity.flatten() #l'image est maintenant un vecteur horizontal a 28x28 composantes #conversion en liste tabImages[index] = flatImg.tolist()
J'utilise ensuite les fonction zip et sort pour associer etiquettes et images.
ACP:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 pairs = zip(labelsList,tabImages) pairs.sort()
Je veux réduire la dimension de mes données. Ici la matrice de covariance a un determinant nul. Ca ne me parait pas trop normal.
Calcul de la matrice de covariance pour l'ACP:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 labelsList=[x[0] for x in pairs ] #recupere les etiquettes imgTab= [x[1] for x in pairs ] #recupere les images imgMat= mat(imgTab) #conversion en matrice, chaque ligne de la matrice contient une image (chacune sous forme de vecteur horizontal)
Apres calcul de la base de vecteurs propres, les images d’entraînements sont projetées dans les nouvelles dimensions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 mat_cov=cov(imgMat.T) #cette matrice a un determinant nul! valP,vectP = linalg.eigh(mat_cov) #recupere valeurs et vecteurs propres #Mise sous forme de liste listValP= valP.tolist() listVectP = vectP.tolist() pairs= zip(listValP,listVectP ) #association valeurs propres et vecteurs propres dans des doublets pairs.sort(reverse=True) #Tri dans l'ordre decroissant
Le classifier bayesien, PARTIE: calcul des paramètres moyennes et matrices de covariances de chaque classe. Les images sont ici des images différentes que les images d’entraînements.
Voilà, j'ai ici mis les principales parties de mon code. Je n'arrive pas du tout a voir ou est le problème avec les matrices de covariances.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 for k in range(10): nbInstances=labelsList.count(k) #compte le nombre d'instances de la classe #imgList est trie de sorte que les images d'une meme classe soit consecutives. Celles de la classe 0 sont en premier. eltsClasse=mat([x for x in imgList[index:(index+nbInstances)]]) index+=nbInstances moy=eltsClasse.mean(0) moyClasseList[k]=moy #stocke la moyenne de cette classe covMat=cov(eltsClasse, rowvar=0) #Le déterminant est toujours nul pour toutes les classes!!! varClasseList[k]=covMat[k][k] #stocke matrice de covariance print 'shape eltsClasse '+str(shape(eltsClasse))+' det:'+str(linalg.det\ (covMat))
Si vous avez une idee, n'hesitez pas a m'en faire part.
merci à vous
Partager