Dév d'une ACP : pb de calcul de vecteurs propres - Algo - Programmation
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... )
Si qq'un peu m'aider à comprendre ces algos... merci par avance
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
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
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.
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 ?
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?
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...
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
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
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 ).
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
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