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

Mathématiques Discussion :

Algorithme pour l'ACP


Sujet :

Mathématiques

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Algorithme pour l'ACP
    Hello,

    Voilà je suis en train de coder un algorithme pour réaliser une ACP sur une matrice quelconque.

    Aprés avoir regardé un peu dans des bouquins, j'ai retenu que le calcul d'une ACP nécessite dans un premier temps le calcul des vecteurs propres de la matrice de covariance des colonnes de données. L'algorithme semble donc assez simple a implémenter (j'ai utilisé le package Jama en java pour les opérations sur les matrices).

    Partant d'une matrice 12x3 toute bête (centrée), j'obtient comme vecteurs propres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      0.13   -0.12   -0.98    
      0.81   -0.56    0.18   
      0.58    0.82   -0.02
    Pour valider mon algo, je décide de vérifier avec R, et j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    > prcomp(xr)
    Rotation:
               PC1        PC2         PC3
    [1,] 0.1321494  0.1200675  0.98393105
    [2,] 0.8072815  0.5629607 -0.17712125
    [3,] 0.5751810 -0.8177158  0.02253337
    Les valeurs sont OK, mais il y a un problème de signe sur PC2 et PC3 qui sont inversés entre R et mon algo...

    Je décide donc de reproduire mon algorithme à l'aide de R et j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    > eigen(t(xr)%*%xr)               // %*% = Multiplication de matrice, t(M) transposé de la matrice
    $vectors
               [,1]       [,2]        [,3]
    [1,] -0.1321494 -0.1200675  0.98393105
    [2,] -0.8072815 -0.5629607 -0.17712125
    [3,] -0.5751810  0.8177158  0.02253337
    Et la, eh bien encore des résultats différents des deux autres en terme de signe... PCA1 diffère de mon algo et de prcomp avec les signe inversés, PCA2 et 3 sont les même que mon algo, mais ont des signes inversés par rapport à R...

    Voilà, n'étant pas spécialiste de l'algèbre linéaire, si quelqu'un a des explications, je suis preneur

    Merci d'avance!

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonsoir,

    il me semble (donc à confirmer) que tu obtiens en fait deux vecteurs qui te servent à déterminer un axe (un point plus un vecteur). Donc quelque soit le signe de tes vecteurs, ils représenteront correctement l'axe.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par vinzzzz Voir le message
    Et la, eh bien encore des résultats différents des deux autres en terme de signe... PCA1 diffère de mon algo et de prcomp avec les signe inversés, PCA2 et 3 sont les même que mon algo, mais ont des signes inversés par rapport à R...

    Voilà, n'étant pas spécialiste de l'algèbre linéaire, si quelqu'un a des explications, je suis preneur
    C'est juste que les vecteurs propres sont définis à un facteur près. Tu devrais regarder la valeur propre associée pour pouvoir comparer tes résultats entre eux.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Bonsoir,

    il me semble (donc à confirmer) que tu obtiens en fait deux vecteurs qui te servent à déterminer un axe (un point plus un vecteur). Donc quelque soit le signe de tes vecteurs, ils représenteront correctement l'axe.
    Oui c'est ce qu'il me semble aussi... En gros j'immagine que lorsque je projetterai mes données sur les deux axes principaux, ca me donnera le même type de tracé, mais ayant une orientation différente suivant le signe...


    Concernant les valeurs propres, elles sont différente en quantité, mais si on les comparent entre elles, les proportions de variance expliquées restent les mêmes...

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par vinzzzz Voir le message
    Concernant les valeurs propres, elles sont différente en quantité, mais si on les comparent entre elles, les proportions de variance expliquées restent les mêmes...

    ???

    Si tu obtiens les mêmes vecteurs propres (au signe près), tu devrais obtenir également les mêmes valeurs propres (au signe près).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Un vecteur propre d'une matrice M, c'est un vecteur qui vérifie

    MX=aX (a réel, c'est la valeur propre).

    Donc, si X est un vecteur propre, -X (mais également pX pour tout p réel) en est également un. Par convention, les algorithmes de diagonalisation renvoient des vecteurs propres de norme 1, mais l'orientation de chaque vecteur est laissée à la discrétion du programme. C'est ce que tu observes ici: d'une implémentation à l'autre, les axes sont les mêmes, mais leur orientation change.

    La valeur propre, elle, ne doit pas changer d'une implémentation l'autre, si elle le fait, tu as un gros problème !

    @vinzz : l'écart "proportionnel" que tu observes vient probablement du fait que l'un des deux programmes (ou les deux...) ne renvoie pas les valeurs propres, mais leur produit par quelque chose (une notion d'"inertie totale"?).

    @pseudocode : les valeurs propres, c'est jamais au signe près : dans une matrice de variance covariance, elles vont toutes être positives ou nulles. Si l'algorithme donne des valeurs propres négatives, ca sent le soufre!

    Francois
    Dernière modification par Invité ; 19/07/2009 à 14h20.

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Lorsque tu obtiens tes valeurs et vecteurs propres, tu te sers de la valeur absolue des valeurs propres afin de déterminer l'importance des vecteurs propres.
    L'axe principal est alors porté par le vecteur propre dont la valeur propre est la plus grande. Il me semble que tu peux aussi classer les vecteurs propres suivant leur norme.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Les valeurs propres sont toujours positives (ou nulles), parce que l'ACP s'effectue sur une matrice de variance covariance. Il n'y aura jamais besoin de valeur absolue.

    Quant aux vecteurs propres, l'ACP et les algos de diagonalisation les renvoient normés (sinon les relations de passage deviennent un peu compliquées).

    Mais certains logiciels renvoient également les vecteurs propres multipliés par leur valeur propre (ou sa racine carrée), et dans ce cas trier ces vecteurs selon leur norme revient à les trier par valeur propre...

    Francois
    Dernière modification par Invité ; 20/07/2009 à 09h45.

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par fcharton Voir le message
    @pseudocode : les valeurs propres, c'est jamais au signe près : dans une matrice de variance covariance, elles vont toutes être positives ou nulles.
    Effectivement. J'ai oublié qu'on travaillait sur une matrice de covariance.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Merci de vos réponses

    Prenons la matrice suivante (dans R)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    > m
          [,1] [,2] [,3]
     [1,]    1    9    3
     [2,]    2    5    5
     [3,]    5    7    3
     [4,]    4    8    8
     [5,]    8    2   25
     [6,]    1    1    7
     [7,]    2    6    5
     [8,]    3    4    4
     [9,]    6    9    2
    [10,]    4    2    6
    Voici les deux résultats obtenus avec prcomp et en faisant sois même l'algorithme:

    Avec prcomp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    > prcomp(m)
    sdev
    [1] 6.983673 2.705171 1.538155
     
    Rotation:
                PC1       PC2        PC3
    [1,] -0.1953558 0.4535368 -0.8695634
    [2,]  0.2405014 0.8817281  0.4058505
    [3,] -0.9507866 0.1298459  0.2813269
    En faisant les calculs sois même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    > mc=scale(m, scale=FALSE)  # On centre les données pour faire comme prcomp
    > eigen(t(mc)%*%mc))
    $values
    [1] 438.94517  65.86156  21.29327
     
    $vectors
               [,1]      [,2]       [,3]
    [1,]  0.1953558 0.4535368  0.8695634
    [2,] -0.2405014 0.8817281 -0.4058505
    [3,]  0.9507866 0.1298459 -0.2813269
    Dans la doc de prcomp, il est écrit:
    sdev: the standard deviations of the principal components (i.e., ,the square roots of the eigenvalues of the covariance/correlation matrix, though the calculation is actually done with the singular values of the data matrix)
    Donc pour obtenir les valeurs propres, il faut récupérer le carré de ces valeurs, ce qui nous donne malgrès tout des résultats différents de mes calculs. Donc ici mêmes vecteurs propres, mais valeurs propres différentes même si leurs proportions sont gardées...

    En revanche, si je remplace:
    par
    La j'obtient les mêmes valeurs propres que prcomp. Donc je suppose que c'est l'algorithme initial (que j'ai récupéré d'un ancien code) qui n'est pas bon?

  11. #11
    Invité
    Invité(e)
    Par défaut
    A priori, cela signifie que cov(mc) est différent de t(mc)%*%mc. Faudrait regarder le manuel.

    En faisant le rapport entre les résultats de la seconde méthode et les carrés de la première, on trouve un rapport de 9, qui est le carré de 3, nombre de dimensions de la matrice de variance covariance...

    De là à supposer que cov(mc) = 1/n^2 t(mc)%*%mc...

    Francois
    Dernière modification par Invité ; 22/07/2009 à 01h59.

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Novembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    bonjour,
    j'ai implémentée ACP jusqu’a avoir les valeurs propres alors je veux représenter les axes principaux d'inertie qui sont ces valeurs propres. pouvez-vous m'aider dans la résolution de ce problème et merci

  13. #13
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Comment tu fais pour avoir une PCA 3x3 avec 12 points au juste ?....

    Sinon, pour les valeurs propres, on a : Gu=lu
    donc on a : l=u'Gu

    où G est une matrice, l une valeur propre, u un des vecteurs associés à l. et ' est la transposée.

Discussions similaires

  1. algorithme pour arbre
    Par d-a-v-e dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 06/02/2006, 21h16
  2. algorithme pour calcul de probabilité
    Par filsdugrand dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 14/12/2005, 14h11
  3. Quel algorithme pour insertion d'objets "triés" da
    Par phplive dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2005, 09h27
  4. Algorithme pour trier trois nombres
    Par legosam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 17/01/2005, 21h47
  5. Algorithme pour chiffres significatifs en Assembleur
    Par lutin2003 dans le forum Assembleur
    Réponses: 5
    Dernier message: 09/09/2004, 10h47

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