IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Matrice de covariance non inversible


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 55
    Points : 37
    Points
    37
    Par défaut 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 : 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

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Une matrice de covariance non inversible signifie généralement que tu as moins de points de données que de dimensions dans ton problème. Pour tout de même faire quelque chose avec ça tu peux prendre la pseudo inverse de ta matrice de covariance.

    Si tu fais la décomposition en valeurs propres de ta matrice de covariance cela revient à prendre 1/lamda si lamda est supérieur à 0 et zéro si lambda est égal à zero (en pratique inférieur à un réel petit).

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Une raison possible serait que certains pixels prennent toujours la même valeur pour toutes tes images (typiquement les coins doivent etre blancs tout letemps non ?)

    Mais de toute façon, tu voulais filtrer des dimensions, donc ce n'est pas un problème, ta matrice de variance meme si elle etait pleine initialement ne le serait plus après le filtre par ACP.

    Pour obtenir une matrice de variance filtrée par ACP qui soit de plein rang, au lieu de mettre des 0 sur les vecteurs propres que tu abandonnes, il suffit de mettre l'inertie restante divisée par le nombre d'axes abandonnés (cela conserve aussi al trace de la matrice).

    C'est une solution que j'utilise souvent, mais en général elle n'est pas nécessaire, car la matrice de variance restreinte aux facteurs conservés est inversible, et en général c'est elle qui est utilisée dans les diverses formules.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    bonjour,
    merci pour vos réponses.
    En fait c'était simplement qu'il fallait transposer le tableau de vecteurs propres retourné par la fonction eigh, car on a besoin d'avoir les vectors propres disposes ligne par ligne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Matrice covariance non définie positive
    Par diego45 dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/09/2014, 14h19
  2. inverse de matrice de covariance
    Par titou_170 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 24/11/2010, 20h24
  3. Inversion matrice bande (et non pas "résolution")
    Par mathieu1 dans le forum Fortran
    Réponses: 10
    Dernier message: 15/04/2010, 09h38
  4. [E-07] inverse matrice - matrice non inversible - gestion d'erreur
    Par Lnmex dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2008, 23h51
  5. Calcul matrice variance-covariance
    Par Alucard9800XT dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/05/2007, 12h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo