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

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

Marsh Posté le 23-07-2007 à 12:08:16    

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:

Reply

Marsh Posté le 23-07-2007 à 12:08:16   

Reply

Marsh Posté le 23-07-2007 à 13:16:16    

décomposition SVD, cf Wikipedia.

Reply

Marsh Posté le 23-07-2007 à 15:12:32    

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 ;)

Reply

Marsh Posté le 24-07-2007 à 13:22:21    

un petit up.

Reply

Marsh Posté le 24-07-2007 à 14:17:56    

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
Reply

Marsh Posté le 24-07-2007 à 19:21:22    

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

Reply

Marsh Posté le 27-07-2007 à 09:04:35    

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.

Reply

Marsh Posté le 09-08-2007 à 16:28:39    

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 ?
 
 

Reply

Marsh Posté le 09-08-2007 à 16:51:24    

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?

Reply

Marsh Posté le 09-08-2007 à 18:33:17    

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...
 

Reply

Marsh Posté le 09-08-2007 à 18:33:17   

Reply

Marsh Posté le 10-08-2007 à 09:17:31    

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 :)

Reply

Marsh Posté le 28-08-2007 à 15:18:45    

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 :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed