Code
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.transform import Rotation as R
import plotly.express as px
import plotly.graph_objects as go
import pandas as pdWilson Toussile1 2
ENSPY
1ENSPY, 2ESSFAR
L’Analyse en Composantes Principales (ACP) est une technique fondamentale en apprentissage automatique et en analyse de données. C’est un outil puissant pour la réduction de dimensionnalité, la visualisation de données et l’extraction de caractéristiques.
Dans de nombreuses applications réelles, les données sont représentées par un grand nombre de variables. Cette haute dimensionnalité peut poser plusieurs défis :
L’Analyse en Composantes Principales (ACP) offre des solutions à ces problèmes, ce qui explique son importance dans de nombreux domaines. Les principaux enjeux de l’ACP sont :
Imaginez un ensemble de données où chaque observation est représentée par un point dans un espace à trois dimensions. Supposons que, malgré leur représentation en 3D, ces points soient en réalité situés près d’un plan 2D. Dans ce cas, l’information essentielle de nos données (leur dispersion, leurs relations) peut être capturée par deux axes principaux, correspondant aux directions de plus grande variance. La troisième dimension, perpendiculaire au plan, apporte alors peu d’information.
n1 = 50
n2 = 50
n_points = n1 + n2
# Définir les variances
variance_x = 15
variance_y = 5
# Générer des données 2D selon une loi normale
x = np.r_[np.random.normal(10, np.sqrt(variance_x), n1), np.random.normal(-10, np.sqrt(variance_x), n2)]
y = np.r_[np.random.normal(10, np.sqrt(variance_y), n1), np.random.normal(-10, np.sqrt(variance_y), n2)]
z = np.random.normal(0, 0.5, n_points)
# Créer les coordonnées 2D
points_2d = np.column_stack((x, y, z))
# Définir une rotation (par exemple, autour de l'axe X)
rotation_angle = np.pi / 4 # 45 degrés
rotation_vector = np.array([1, 0, 0]) # Axe X
rotation = R.from_rotvec(rotation_angle * rotation_vector)
rotation_matrix = rotation.as_matrix()
# Appliquer la rotation
points_3d = points_2d.dot(rotation_matrix)
# Centrer les données
centered_data = points_3d - np.mean(points_3d, axis=0)
# Calculer la matrice de covariance
cov_matrix = np.cov(centered_data.T)
# Calculer les valeurs propres et vecteurs propres
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# Trier les valeurs propres par ordre décroissant
sorted_indices = np.argsort(eigenvalues)[::-1]
sorted_eigenvalues = eigenvalues[sorted_indices]
sorted_eigenvectors = eigenvectors[:, sorted_indices]L’essentiel de l’information se trouve dans un plan
# Projeter les données sur les deux premiers axes
reduced_data = centered_data.dot(sorted_eigenvectors[:, :2])
# Visualiser les données réduites
plt.figure(figsize=(8, 8))
plt.scatter(reduced_data[:, 0], reduced_data[:, 1])
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('Données projetées sur les deux premiers axes')
plt.show()
L’ACP va nous permettre d’identifier les axes principaux (contenant l’essentielle de l’information), et de projeter nos données sur ceux-ci. Dans notre exemple, elle réduira la dimensionnalité de \(3\) à \(2\) en conservant le maximum d’information. En effet, , la \(3\)-ième dimension ne contient que du bruit,
Cette réduction de dimension est extrêmement utile lorsqu’on travaille sur des données de très grande dimension (plusieurs centaines ou milliers de variables). L’ACP permet alors de simplifier leur analyse, de visualiser les données plus facilement, et parfois même d’améliorer les performances de certains algorithmes d’apprentissage automatique.