Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
961 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  Dév d'une ACP : pb de calcul de vecteurs propres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Dév d'une ACP : pb de calcul de vecteurs propres

n°1590028
rufo
Pas me confondre avec Lycos!
Posté le 23-07-2007 à 12:08:16  profilanswer
 

Je suis en train de développer une ACP (Analyse en Composantes Principales : http://fr.wikipedia.org/wiki/Analy [...] rincipales ) en PHP (oui, je sais, c'est pas le langage le plus approprié pour faire du calcul et ça va ramer) et je galère un peu (les maths n'étant pas ce que je maîtrise le mieux :D).
Pour l'instant, j'ai déjà développé les fonction suivantes pour le calcul matriciel :
- calcul de la transposée d'une matrice,
- calcul de la matrice centrée sur son centre de gravité,
- calcul de la matrice réduite,
- calcul de la somme de 2 matrices,
- calcul du produit de 2 matrices,
- calcul du produit d'une matrice par un scalaire,
- calcul de la matrice des covariances,
- calcul de la matrice des corrélations,
- calcul du déterminant d'une matrice (algo basé sur les comatrices : http://fr.wikipedia.org/wiki/D%C3% [...] atiques%29 et http://fr.wikipedia.org/wiki/Comatrice ),
- calcul de la trace d'une matrice,
- calcul du polynôme caractéristique d'une matrice (algo de Faddeev-Leverrier : http://fr.wikipedia.org/wiki/Algor [...] -Leverrier ).
 
Pour l'instant, dans la méthode de l'ACP, j'arrive bien à calculer la matrice des covariances et le polynôme caractéristique (je l'appelle P(x)). Là où ça se corse, c'est pour calculer les valeurs propres et les vecteurs propres.
Pour calculer les valeurs propres d'une matrice, je suis parti sur P(x) = 0. Il faut donc implémenter une fonction de résolution d'équation. Pour ça, j'ai développé des fonctions qui :  
- calcule la valeur de P(x) pour x donné en paramètre,
- calcule les coeffs du polynôme qui est la dérivée de P(x),
- calcule les racines de P(x).
 
Je détaille un peu plus cette dernière fonction

Code :
  1. test du degré de P(x)
  2. {
  3.     cas degré = 1:
  4.         return racine degré 1
  5.         break;
  6.  
  7.     cas degré = 2:
  8.         return racines degré 2 suivant la méthode du delta >= 0
  9.         break;
  10.     cas degré > 2:
  11.         calcul du polynôme de Laguerre (http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Laguerre) pour connaître l'intervalle des racines
  12.        
  13.         méthode de Bernoulli pour trouver la plus grande racine R0 (elle est la plus grande au signe près)
  14.        
  15.         Cette racine sert pour initialiser la suite de la recherche des autres racines via l'algo de Laguerre ( http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Laguerre )
  16.         Pour i = 1 à degré faire
  17.              recherche d'un racine tant que que x reste dans l'intervalle des racines trouvé précédemment
  18.         fin pour
  19.          
  20.         s'il manque des racines alors
  21.             tant que nb de tentatives de trouver 1 nouvelle racine différente de celles déjà trouvées n'a pas été dépassé (fixé à degré * 4)
  22.                 recherche 1 racine manquante via la méthode de Newton ( http://fr.wikipedia.org/wiki/Algor [...] e_fonction )
  23.                si nouvelle racine Ri trouvée alors
  24.                     l'utiliser comme point de départ pour trouver la prochaine racine en faisant Ri+1 = Ri + rand(nb dans intervalle trouvé précédemment)
  25.                fin si
  26.         fin si
  27.      
  28.         return racines trouvées
  29.         break;
  30. }


 
Ca marche plutôt bien, j'ai même ajouté qq mécanismes pour corriger les erreurs d'arrondis, histoire d'avoir par ex, 1 ou lieu de 0.99951.
 
Mon pb, actuellement est d'arriver à calculer les vecteurs propres de ma matrice des covariances. Je sais qu'il faut que pour chaque valeur propre trouvée, je résolve un système d'équation, mais je ne sais pas trop comme m'y prendre :(
Qq'un a déjà implémenté ce genre de calcul? Merci par avance :jap:

mood
Publicité
Posté le 23-07-2007 à 12:08:16  profilanswer
 

n°1590084
Joel F
Real men use unique_ptr
Posté le 23-07-2007 à 13:16:16  profilanswer
 

décomposition SVD, cf Wikipedia.

n°1590234
rufo
Pas me confondre avec Lycos!
Posté le 23-07-2007 à 15:12:32  profilanswer
 

Tu fais bien référence à cet article : http://fr.wikipedia.org/wiki/D%C3% [...] i%C3%A8res
 
Comme je l'ai précisé, les maths et moi...bof. J'ai du mal à comprendre. En cherchant, j'ai trouvé ceci : l'algo de Lanczos ( http://en.wikipedia.org/w/index.ph [...] &oldid=cur )
Là, y'a l'algo de décrit, mais j'ai du mal à comprendre la notation :(
 
J'ai bien trouvé une implémentation en java : http://www.idiom.com/~zilla/Comput [...] VD_NR.java
Mais ça a l'air d'être codé un peu à l'arraché et j'aurais préféré trouvé l'algo décrit de manière plus claire (quoi? moi, un boulet, mais non... :whistle: )
 
Si qq'un peu m'aider à comprendre ces algos... merci par avance ;)

n°1590764
rufo
Pas me confondre avec Lycos!
Posté le 24-07-2007 à 13:22:21  profilanswer
 

un petit up.

n°1590810
rufo
Pas me confondre avec Lycos!
Posté le 24-07-2007 à 14:17:56  profilanswer
 

Bon, ça marche pas trop mal mon calcul de vecteurs propres. J'essaye de résoudre (V - ri*I)ui = 0
ou :
- V est ma matrice des covariances,  
- ri est ma valeur propre indice i (classées dans l'ordre décroissant mes valeurs propres)
- I est la matrice identité de taille de V
- ui est le vecteur propre indice i que je cherche
 
Ca se résume donc à résoudre un système d'équations linéaires. J'utilise Gauss-Jordan et si je trouve ui = {0...0} alors je passe sur l'algo Gauss-Seidel ( http://fr.wikipedia.org/wiki/M%C3% [...] uss-Seidel )
 
A la fin, j'ai une approximation pas trop mal de mes vecteurs propres normalisés :) mais bon, j'aimerais bien comprendre la méthode de la décomposition SVD... Si qq'un pouvait m'expliquer :hello:


Message édité par rufo le 24-07-2007 à 15:06:42
n°1591049
Joel F
Real men use unique_ptr
Posté le 24-07-2007 à 19:21:22  profilanswer
 

Bah y a tout dans la page wiki, je vosi pas comment on peut t'expliquer autrement :o

n°1592175
rufo
Pas me confondre avec Lycos!
Posté le 27-07-2007 à 09:04:35  profilanswer
 

A propos du résultat d'une ACP, j'obtiens autant de vecteurs propres que la taille de ma matrice des covariances, sachant que le premier vecteur propre correspond au premier axe (ou 1ère composante) qui porte le plus gros % d'info (de variance expliquée). Est-ce qu'il y a un moyen de connaître le % d'influence de chaque composante de ma matrice initiale dans ce 1er axe?
 
ex : j'ai en entré un tableau de 11 élèves avec leur classement dans 3 matières (Maths, Français et Physique).
A l'issue de mon ACP, j'obtiens 3 vecteurs propres. Est-ce-que je peux savoir le % d'influence qu'on les 3 matières sur la 1ère composante de l'acp?
 
Merci.

n°1597798
joneal
Posté le 09-08-2007 à 16:28:39  profilanswer
 

la version anlaise explique plus le lien ACP-SVD :
http://en.wikipedia.org/wiki/Karhu [...] _transform
 
pour le calcul de la SVD, moi je ne refairais pas l'algo. j'utiliserais une lib classique tel que lapack (cf dgesvd)
mais je ne sais pas si tu peux interfacer cette lib avec php ?
 
 

n°1597836
rufo
Pas me confondre avec Lycos!
Posté le 09-08-2007 à 16:51:24  profilanswer
 

merci pour le lien, je vais regarder.
 
Sinon, je doute que lapack puisse fonctionner avec php :/ Je crois que c'est un truc codé en fortran, non?

n°1597932
joneal
Posté le 09-08-2007 à 18:33:17  profilanswer
 

c'est programmé en fortran mais rien d'interdit d'en faire une .dll (ou .so sous linux) pour l'appele depuis ton language
 
pour php :
ce lien  
http://www.phpfreaks.com/phpmanual [...] faq.com.q1
dit qu'on ne peut appeler une dll en php mais par contre on peut utiliser les dll COM s'ils sont idspatch-ables
mais la peut-etre que cela depasse tes competences...
 

mood
Publicité
Posté le 09-08-2007 à 18:33:17  profilanswer
 

n°1598039
rufo
Pas me confondre avec Lycos!
Posté le 10-08-2007 à 09:17:31  profilanswer
 

non, c'est bon pour COM, j'ai déjà fait des scripts php pour importer dans Mysql des données provenant de docs complexes Excel. Mais là, mon serveur est sous Linux , donc, faut faire un .so.
Comme c'était juste pour "m'amuser" ce codage d'acp en php, je vais voir si je poursuis. En effet, si je veux mettre en prod, y'a des outils plus appropriés et bien mieux faits comme Tanagra (soft libre). Mais je vais regarder ton lien, ça peut toujours servir pour autre chose. Merci de ton aide en tout cas :)

n°1605296
rufo
Pas me confondre avec Lycos!
Posté le 28-08-2007 à 15:18:45  profilanswer
 

Pour ceux que ça intéresse, j'ai fini pas trouver une lib sur le calcul matriciel basée sur JAMA (traduite en php) : http://www.phpmath.com/build01/JAMA/downloads/
 
Doc : http://math.nist.gov/javanumerics/jama/
 
Ca marche bien :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  Dév d'une ACP : pb de calcul de vecteurs propres

 

Sujets relatifs
Récupérer valeurs sur un site web après un temps de calculCalcul d'un table de hachage
calcul du prochain mardi , mercredi ...Dev Java sur PDA
[résolu]Calcul avec Batch[RESOLU]Calcul nombre de jours ouvrables entre 2 dates
calcul de min et de maxCalcul de durée totale/de session
Calcul de nombres complexes [RESOLU]calcul d'un angle entre 2 vecteurs en c++ (en respectant le signe)
Plus de sujets relatifs à : Dév d'une ACP : pb de calcul de vecteurs propres


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR