Cette page explique le fonctionnement de l'ACP pondérée dans le cas d'un système multidimensionel avec une distribution gaussienne. Nous allons expliquer comment calculer l'ACP d'un nuage de points pondéré. Précisément, nous allons calculer :
Cette page est la suite d'un autre article sur le calcul de l'ACP non pondérée. Si le lecteur n'est pas familier avec l'analyse en composante principale, il est fortement recommandé de commencer par la lecture de cette page.
Le script Matlab utilisé sur cette page peut être téléchargé depuis la section Téléchargement de cette page.
Considérons l'ensemble des points suivants :
Cet ensemble de \( N \) points a été tiré au hasard avec les propriétés suivantes :
Le centre du jeu de points est donné par:
$$ C = \begin{bmatrix} 2 && 7 \end{bmatrix} $$
La covariance du jeu de points est donnée par :
$$ \Sigma= \begin{bmatrix} 1 && 0\\ 0 && 1 \end{bmatrix} $$
Consultez cette page pour obtenir davanatage de détail sur les covariances.
En lisant cette page, le lecteur comprendra que l'ACP non pondérée est affichée sur la figure suivante :
Que se passerait-il si on associait maintenant un poids à chaque point ? La figure suivante montre un ensemble de points ayant les mêmes propriétés que le précédent, sauf que chaque point a un poids associé. La taille de chaque point représente son poids :
Comme vous pouvez le voir, les points sur la gauche ont des poids plus importants, ce qui modifie l'ACP.
Dans la suite, nous considérerons que l'ensemble des points a les coordonnées suivantes :
$$ X = \begin{bmatrix} x_1 && y_1 \\ x_2 && y_2 \\ x_3 && y_3 \\ ... && ...\\ x_n && y_n \end{bmatrix} $$
Le code matlab ci-dessous permet de calculer l'ensemble des points:
% Dimension
D = 2;
% Number of samples
N = 1000;
% Offset
Offset = [2,7];
%% Sample
% Samples, each column is a random variable
X = randn(N,D);
% Offset
X = X + Offset ;
À chaque \( x_i, y_i \), un poids est associé:
$$ W = \begin{bmatrix} w_1 \\ w_2 \\ w_3 \\ ... && ...\\ w_n \end{bmatrix} $$
Dans l'exemple présenté sur cette page, les poids sont calculés avec une distribution gaussienne sur l'axe des abscisses. Plus les points sont proches de l'axe des y, plus le poids est élevé :
La formule utilisée pour calculer les poids est la suivante ( \( \mu=0.7 \) ) :
$$ w_i = 0.01 + \dfrac{1}{\mu \sqrt{2\pi}} e^{\frac{x_i^2}{2\mu^2}} $$
En superposant les poids et la gaussienne, on comprend mieux le principe du calcul des poids :
Le calcul du centre de l'ensemble des points est similaire à la moyenne pondérée des coordonnées \( x \) et \( y \) :
$$ \hat{C} = \begin{bmatrix} x_c && y_c \end{bmatrix} = \begin{bmatrix} \dfrac{ \sum_{i=1}^n w_i.x_i}{\sum_{i=1}^n w_i} && \dfrac{ \sum_{i=1}^n w_i.y_i}{\sum_{i=1}^n w_i} \end{bmatrix} $$
Le code Matlab suivant calcule le centre du jeu de points :
>> C_w = sum(w.*X) / sum(w)
C_w =
0.7999 6.9403
Le centre est proche de 7 pour les coordonnées y (offset défini précédemment). Pour les coordonnées x, comme les poids proches de zéro sont plus élevés, cela attire le centre vers l'axe des ordonnées.
L'étape suivante consiste à calculer la matrice de covariance de l'ensemble des points centrés. Avant de calculer la covariance, nous devons centrer l'ensemble des points que nous appellerons \( X_c \) :
$$ X_c = \begin{bmatrix} x_1-x_c && y_1-y_c \\ x_2-x_c && y_2-y_c \\ x_3-x_c && y_3-y_c \\ ... && ...\\ x_n-x_c && y_n-y_c \end{bmatrix} $$
Cette matrice de covariance pondérée est obtenue en calculant le produit suivant :
$$ \Sigma = \dfrac{1}{\sum_{i=1}^n w_i} \times w_i X_c^\top \times X_c $$
Dans Matlab, la covariance est calculée avec le code suivant :
>> sigma_w = (w.*(X-C_w))'*(X-C_w) / sum(w)
sigma_w =
0.6491 -0.0246
-0.0246 1.0454
Maintenant que la covariance pondérée est calculée, ce qui suit est similaire à l'ACP non pondérée.
Sur Matlab, la meilleure option est d'utiliser la fonction svd()
:
>> [U,S,D] = svd(sigma_w)
U =
-0.0617 0.9981
0.9981 0.0617
S =
1.0469 0
0 0.6475
D =
-0.0617 0.9981
0.9981 0.0617
\( U \) est la matrice de rotation, \(S\) contient les écarts-types.
Vérifions si notre ACP est correcte :
Le résultat ne fait aucun doute si l'on compare avec l'ACP non pondérée :
Ci-dessous, vous pouvez télécharger le script utilisé pour créer les figures de cette page et la vérification des équations :
weighted_principal_component_analysis.m