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
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()
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
J'utilise ensuite les fonction zip et sort pour associer etiquettes et images.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
        pairs = zip(labelsList,tabImages)
        pairs.sort()
ACP:
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.

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)
Calcul de la matrice de covariance pour l'ACP:
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
Apres calcul de la base de vecteurs propres, les images d’entraînements sont projetées dans les nouvelles dimensions

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.
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))
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.
Si vous avez une idee, n'hesitez pas a m'en faire part.

merci à vous