ACP pondérée

ACP pondérée calculée sur un nuage de points

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.

Nuage de points pondéré

Considérons l'ensemble des points suivants :

Nuage de points non pondéré

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 :

ACP du nuage de point non pondéré

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 :

Nuage de points pondéré

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 valeur du poids est une fonction gaussienne des coordonnées x de chaque point.

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 :

Points pondérés et gaussienne utilisée pour calculer les poids

Centre pondéré

Centre pondéré de l'ACP

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.

Covariance

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

Décomposition en valeurs singulières

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.

Résultats

Vérifions si notre ACP est correcte :

ACP calculée sur un leu de points pondérés

Le résultat ne fait aucun doute si l'on compare avec l'ACP non pondérée :

ACP pondérée et non pondérée du même jeu de points

Téléchargement

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

Voir aussi


Dernière mise à jour : 20/01/2023