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
Code :
- test du degré de P(x)
- {
- cas degré = 1:
- return racine degré 1
- break;
-
- cas degré = 2:
- return racines degré 2 suivant la méthode du delta >= 0
- break;
- cas degré > 2:
- 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
-
- méthode de Bernoulli pour trouver la plus grande racine R0 (elle est la plus grande au signe près)
-
- 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 )
- Pour i = 1 à degré faire
- recherche d'un racine tant que que x reste dans l'intervalle des racines trouvé précédemment
- fin pour
-
- s'il manque des racines alors
- 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)
- recherche 1 racine manquante via la méthode de Newton ( http://fr.wikipedia.org/wiki/Algor [...] e_fonction )
- si nouvelle racine Ri trouvée alors
- 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)
- fin si
- fin si
-
- return racines trouvées
- break;
- }
|
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