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

Méthodes exploratoires Discussion :

PCA et varimax


Sujet :

Méthodes exploratoires

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 453
    Par défaut PCA et varimax
    Bonjour,

    On m'a conseillé d'expliquer mon problème dans cette rubrique alors voici...

    J'ai utilisé une ACP pour rechercher ce qui varie le plus dans mes images de 100x100pixels. Donc j'ai utilisé princomp sur une matrice de 3150 observations par 10000. J'obtiens donc COEFF, LATENT et SCORE. Maintenant j'aurais voulu faire une rotation varimax sur mes données. Donc première question:

    1. Il est juste de faire une PCA spatial puis une rotation varimax mais dans ce cas il faut bien faire une rotation sur les loadings (COEFF) ET sur les scores n'est ce pas? puis ensuite la PCA temporelle sur les scores qui ont subis la rotation? Et pour finir une rotation sur les SCORE et les COEFF de cette PCA temporelle?

    2. J'ai donc essayé ca:

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    COEFFnew = rotatefactors(COEFF);
    SCOREnew = rotatefactors(SCORE);
    Malheureusement j'ai ce message d'erreur:

    ??? Error using ==> svd
    Input to SVD must not contain NaN or Inf.

    Error in ==> rotatefactors>orthomax at 205
    [L, D, M] = svd(A' * (d*B.^3 - gamma*B * diag(sum(B.^2))));

    Error in ==> rotatefactors at 152
    [B, T] = orthomax(A, 1, normalize, reltol, maxit);
    Est-ce que je fais quelque chose de faux? Comment puis-je résoudre ce problème?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Cette discussion fait suite à celle-ci : Matlab et varimax

    Citation Envoyé par soeursourire Voir le message
    On m'a conseillé d'expliquer mon problème dans cette rubrique alors voici...
    Devinez qui ?

  3. #3
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!
    Dut t'a dit de passer sur le forum Algo et il a tout à fait raison. Mais maintenant, tu ne sembles pas t'être rendu compte que tu n'étais plus sur le forum Matlab. Tu me sembles présenter un problème de méthodologie que l'on rencontre très souvent sur ce site: tu cherches à savoir comment programmer avant de te demander ce que tu dois programmer. Tu as un problème (de traitement d'images, si j'ai bien compris). Commence par déterminer quels algorithmes tu dois appliquer à tes données, et quand tu seras absolument certain d'avoir achevé cette étape. Ensuite, tu pourras commencer à écrire ton programme, en évitant d'utiliser des "boîtes noires" (c'est peut-être plus rapide, mais on risque de ne pas comprendre ce qu'on fait).
    Jean-Marc Blanc

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 453
    Par défaut
    Ben pourtant ca me parait clair dans ma tete ce que je veux faire... J'ai tout un tas d'images qui ont été enregistrées sous 3 conditions differentes (50 images par observation). Je veux donc
    1. Faire une ACP spatiale sur toutes mes observations avec mes pixels comme variables pour voir OU je trouve des variations dans l'image (ce serait bien d'avoir des zones differentes selon les conditions). -> LOADINGS + SCORES
    2. Faire une rotation varimax sur les résultats de ces données
    3. Faire une ACP temporelle sur les résultats de l'ACP précédentes pour voir QUAND ces variations se passent dans le temps ->LOADINGS + SCORES
    4. De nouveau une rotation varimax sur les resultats pour que ce soit plus clair..

  5. #5
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!
    pourtant ca me parait clair dans ma tete
    Pour moi, ce n'est pas du tout clair. J'explicite pourquoi:
    100x100pixels
    une matrice de 3150 observations par 10000
    D'abord, ce n'est pas une matrice 3150x10000 mais un tableau, semble-t-il plutôt 3150x100x100.
    J'ai utilisé une ACP
    Comment, par quel algorithme?
    COEFF, LATENT et SCORE
    Comment as-tu défini et calculé ces trois variables?
    faire une rotation varimax
    Quelles sont les formules qui définissent cette rotation?
    ??? Error using ==> svd
    Input to SVD must not contain NaN or Inf.

    Error in ==> rotatefactors>orthomax at 205
    [L, D, M] = svd(A' * (d*B.^3 - gamma*B * diag(sum(B.^2))));

    Error in ==> rotatefactors at 152
    [B, T] = orthomax(A, 1, normalize, reltol, maxit);
    Tu sembles avoir utilisé la fonction rotatefactors sans trop te demander ce qu'il y avait dedans. Or les messages d'erreur montrent de manière évidente que cette fonction fait appel à la fonction svd (valeurs singulières). C'est donc à toi de décortiquer rotatefactor pour voir pourquoi la matrice à laquelle tu appliques svd est erronée.

    Jean-Marc Blanc

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 453
    Par défaut
    Effectivement ce n'etait pas clair..
    Alors mes images font 100pixels de hauteur par 100pixels de largeur mais je les transforme en vecteur colonne. Et oui j'ai donc un tableau de 3150 par 10000.
    J'utilise princomp pour calculer mon ACP et COEFF SCORE et LATENT sont les resultats de cette ACP.
    J'utilise bien rotatefactors qui par defaut utilise la rotation varimax. Et svd y'a pas le code avec dans Matlab apparemment.. ce qui est un peu embêtant pour traquer ce qui ce passe dans la fonction non?

  7. #7
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!
    Et svd y'a pas le code avec dans Matlab apparemment.. ce qui est un peu embêtant pour traquer ce qui ce passe dans la fonction non?
    Non, car ce que tu dois traquer, ce n'est pas ce qui se passe dans la fonction svd, mais ce qui se passe avant. C'est la matrice que rotatefactors passe en paramètre à svd qui est "pourrie". Comme cette matrice est très grosse, tu ne vas évidemment pas l'afficher ou l'imprimer au complet. Tu devrais plutôt la balayer par deux boucles imbriquées pour déterminer quels termes sont des NaN et tenter d'expliquer pourquoi.

    A part ça, tu me sembles souffrir du défaut classique de nombreux utilisateurs de Matlab: faire appel à des "boîtes à outils" sans être capable de forger les outils soi-même:
    J'utilise princomp
    J'utilise bien rotatefactors
    qui par defaut utilise la rotation varimax
    Ce n'est peut-être pas ta faute, mais c'est souvent dangereux.

    Jean-Marc Blanc

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 453
    Par défaut
    Apparemment le problème arrive quand la fonction corrcoef est appelés pourtant je n'ai pas de NaN ni de Inf dans ma matrice à ce moment là et la valeur minimale est -5.9883 et ma valeur maximale est 3.8860.
    Le résultat de corrcoef rend une matrice remplie de NaN...

  9. #9
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!
    J'ai l'impression que tes difficultés ne sont pas d'origine informatique, mais tiennent à la manière dont tu as modélisé ton problème. Recommençons donc au début:
    Tu as une suite de 3150 images de 100*100 pixels chacune. Tu veux analyser ce qui se passe lorsqu'on parcourt ces 3150 images. Tu as donc un tableau de valeurs à 3 indices: le numéro de l'image, la position horizontale et la position verticale du pixel considéré. Ce tableau n'est pas une matrice.
    Ensuite, tu constitues des paquets de 10000 valeurs correspondant à l'ensemble des pixels d'une image, puis un tableau de 3150 de ces paquets, que tu appelles une matrice alors qu'à mon avis, ce n'en est pas une. Intuitivement, cette manière de faire me semble absurde pour la raison suivante:
    En général, une image présente une forme de continuité: les pixels proches les uns des autres ont statistiquement plus de chances de présenter des teintes voisines. Mais, avec ta manière de faire, tu imposes une continuité similaire entre des pixels situés sur les côtés opposés de ton image, ce que rien ne justifie.
    Suite au prochain numéro.
    Jean-Marc Blanc

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 453
    Par défaut
    En fait non j'ai un tableau à 2indices: le numero d'image et la position du pixel (mes images en 2D sont transformées en vecteur 1D, si I1 est de taille 100 par 100 ).

    pix1 pix2 .... pix10000
    img1
    img2
    img3
    ...
    img3150

    Sinon j'ai peut-être trouvé comment résoudre mon problème mais je ne suis pas sûre que ce soit correcte. Je pensais faire comme suite.
    1. Une ACP Spatiale avec la fonction princomp de Matlab:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [COEFFs SCOREs LATENTs] = princomp(data(:,:),'econ');
    En regardant les valeurs de LATENTs je sais que j'ai 23 composantes principales qui expliquent 90% de la variance. Donc je garde uniquement ces 23 PC.

    2. Rotation varimax en utilisant la fonction doVarimax de Joseph Dien (ERP_toolbox). Mais c'est là que je ne suis pas sûre, est-ce que c'est correct de faire cette rotation varimax sur les loadings ET sur les factor scores?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    COEFFs = COEFFs(:,1:23);
    SCOREs = SCOREs(:,1:23);
    CRot = doVarimax(COEFFs);
    SRot = doVarimax(SCOREs);
    3. Je continue de meme pour faire mon ACP temporelle

    Voili voila...

  11. #11
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    En fait non j'ai un tableau à 2indices: le numero d'image et la position du pixel (mes images en 2D sont transformées en vecteur 1D
    C'est ça qui me semble faux, mais, comme modérateur, je n'ai pas la compétence de t'obliger à faire juste.
    Jean-Marc Blanc

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 453
    Par défaut
    Ben non je mets mes images en vecteurs parce que je m'interesse ensuite à chaque pixel individuellement pour savoir grâce à une ACP quels sont les pixels qui varient dans la meme direction... qui reagissent de la meme facon.

    J'ai vu qu'il y avait une fonction erpPCA qui fait la PCA la rotation varimax sur les loadings et en extrait les factors scores. Mais de nouveau j'ai un problème de mémoire dans ce cas. Il faudrait que je puisse comprendre comment ces factors scores peuvent être extraits à partir des loadings et score non rotated, et des loadings rotated?

  13. #13
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!

    Considérons les deux problèmes suivants:
    1. On a un panneau carré portant 10000 (=100*100) ampoules électriques dont la luminosité varie, en fonction du temps, d'une manière totalement indépendante les unes des autres. On en a pris 3150 photographies au moyen desquelles on veut analyser l'évolution de l'éclairage.
    2. On a, dans l'espace 3D, un objet qui peut se mouvoir et/ou se déformer. On en a pris 3150 photographies au moyen desquelles on veut étudier le mouvement et/ou la déformation de l'objet.

    Quelle est ton opinion sur ces deux problèmes et lequel est le plus proche de ce que tu cherches à faire?

    Physiquement, la luminosité est une fonction de trois variables f(x,y,t). Les deux premières sont des longueurs et la troisième un temps. Tu les remplaces par une fonction de deux variables g(z,t). La notion d'ACP a-t-elle un sens lorsque les deux variables sont des grandeurs physiques de nature différente?

    Je ne sais pas dans quel cadre tu fais ce projet, mais tu me sembles avoir une méthodologie complètement défectueuse. Une méthodologie correcte me semble suivre la séquence suivante:
    1. Définir avec précision le problème physique: quel est l'objet étudié et quels sont les phénomènes dont il est le siège?
    2. Modéliser les phénomènes, c'est-à-dire écrire mathématiquement les lois qui les régissent, tout d'abord dans le cas général, puis dans le cas particulier de l'objet étudié.
    3. Choisir les algorithmes qui permettront de résoudre au mieux le problème mathématique.
    4. Choisir les outils logiciels les mieux adaptés pour appliquer ces algorithmes.
    5. Programmer l'application de ces algorithmes en prévoyant déjà tous les tests de plausibilité à effectuer en cours d'exécution des programmes.

    Or qu'as-tu fait? Tu commences par décider d'utiliser Matlab, ce qui t'a peut-être été imposé, et surtout des fonctions comme princomp, rotatefactors, varimax, erpPCA qui semblent tomber du ciel et dont manifestement tu ne connais pas le fonctionnement.
    Tu utilises des mots chinois tels que COEFF, LATENT, SCORE, etc. dont nul ne connait la signification.

    Alors, au vu de ce qui précède, commence par clarifier tes idées, adopte une méthodologie cohérente et tout ira pour le mieux dans le meilleur des mondes.

    Jean-Marc Blanc

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 453
    Par défaut
    Solution:
    - ôter les pixels à 0 de l'analyse, pixels correspondant au background dans mes images
    - réduire encore la taille de mes images.

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

Discussions similaires

  1. PCA Varimax en C++
    Par soeursourire dans le forum C++
    Réponses: 5
    Dernier message: 27/01/2009, 17h39
  2. Matlab et varimax
    Par soeursourire dans le forum MATLAB
    Réponses: 13
    Dernier message: 15/01/2009, 17h32
  3. [princomp] Etude ACP (ou PCA)
    Par nonoprig dans le forum MATLAB
    Réponses: 0
    Dernier message: 07/02/2008, 18h22
  4. Algorithmes PCA et PLS
    Par Tintou dans le forum MATLAB
    Réponses: 3
    Dernier message: 20/07/2007, 10h02
  5. PCA centrer réduir
    Par ancrou dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/07/2007, 12h42

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