Matrice de covariance non inversible
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:
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:
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:
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:
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:
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