Plusieurs capteurs enregistrent chacun un mélange de plusieurs sources : deux voix dans une pièce, deux machines sur une même dalle. L'ICA retrouve les sources d'origine sans connaître le mélange, en cherchant des composantes statistiquement indépendantes. Là où l'ACP ne fait que décorréler, l'ICA sépare.
Le problème du cocktail : deux micros enregistrent deux conversations mêlées. L'oreille sait isoler une voix ; l'ICA fait de même en cherchant les signaux les plus indépendants possible.
Chaque capteur enregistre une somme pondérée des sources : capteur = a x moteur + b x presse. Les sources et les poids sont inconnus.
On décorrèle les capteurs et on les ramène à une variance de 1, comme une ACP. Il ne reste alors qu'une rotation à trouver.
Un mélange de sources indépendantes ressemble plus à une loi normale que chaque source prise seule. FastICA tourne les axes jusqu'à trouver les composantes les moins gaussiennes : ce sont les sources.
Sur une même dalle, un moteur tourne à 3 cycles par seconde et une presse frappe selon un cycle en dents de scie. Chaque capteur enregistre un mélange des deux, plus du bruit. Les signaux sont simulés, ce qui permet de vérifier la séparation.
L'ICA renvoie deux signaux : l'un correspond au moteur, l'autre à la presse. Le technicien surveille alors chaque machine séparément, par exemple l'amplitude du moteur seul, sans être gêné par la presse voisine.
Sur la simulation, chaque composante de l'ICA est corrélée à 0,99 avec une source et à 0,01 avec l'autre. L'ACP laisse des composantes mélangées, corrélées entre 0,6 et 0,8 aux deux sources. En conditions réelles, sans vérité connue, on vérifie que chaque composante a une signature physique plausible : fréquence, rythme.
Noms donnés pour R (fastICA) et Python (scikit-learn).
Nombre de sources à extraire, au plus le nombre de capteurs. Si on en demande trop, certaines composantes ne sont que du bruit.
La fonction qui mesure l'écart à la loi normale : logcosh par défaut, qui convient à la plupart des signaux ; exp pour des sources très piquées.
Le blanchiment préalable. En Python, whiten="unit-variance" est le cas standard. En R, fastICA blanchit toujours les données avant de chercher la rotation.
# Deux machines, deux capteurs : ICA en R
library(fastICA)
set.seed(42)
temps <- seq(0, 10, length.out = 2000) # 10 secondes d'enregistrement
# Sources cachées : un moteur (sinusoïde) et une presse (dents de scie)
moteur <- sin(2 * pi * 3 * temps)
presse <- 2 * ((1.3 * temps) %% 1) - 1
sources <- cbind(moteur, presse)
# Chaque capteur enregistre un mélange des deux machines, plus du bruit
melange <- matrix(c(1, 0.6, 0.5, 1), nrow = 2, byrow = TRUE)
capteurs <- sources %*% t(melange) + matrix(rnorm(4000, sd = 0.05), ncol = 2)
ica <- fastICA(capteurs, n.comp = 2)
acp <- prcomp(capteurs)$x
# Corrélation (valeur absolue) source vraie / composante trouvée : 1 = séparation parfaite
print(round(abs(cor(sources, ica$S)), 2))
print(round(abs(cor(sources, acp)), 2))
# Deux machines, deux capteurs : ICA en Python
import numpy as np
from sklearn.decomposition import FastICA, PCA
rng = np.random.default_rng(42)
t = np.linspace(0, 10, 2000) # 10 secondes d'enregistrement
# Sources cachées : un moteur (sinusoïde) et une presse (dents de scie)
moteur = np.sin(2 * np.pi * 3 * t)
presse = 2 * ((1.3 * t) % 1) - 1
sources = np.column_stack([moteur, presse])
# Chaque capteur enregistre un mélange des deux machines, plus du bruit
melange = np.array([[1.0, 0.6], [0.5, 1.0]])
capteurs = sources @ melange.T + 0.05 * rng.normal(size=(2000, 2))
ica = FastICA(n_components=2, whiten="unit-variance", random_state=42)
estimees = ica.fit_transform(capteurs)
acp = PCA(n_components=2).fit_transform(capteurs)
# Corrélation (valeur absolue) source vraie / composante trouvée : 1 = séparation parfaite
for nom, S in [("ICA", estimees), ("ACP", acp)]:
corr = np.abs(np.corrcoef(sources.T, S.T)[:2, 2:])
print(nom, "moteur :", corr[0].round(2), "presse :", corr[1].round(2))
L'ACP cherche des axes non corrélés, classés par variance expliquée. L'ICA cherche des composantes statistiquement indépendantes, une condition plus forte. Sur des signaux mélangés, l'ACP rend des composantes encore mélangées, l'ICA retrouve les sources.
Parce que le mélange est inconnu : multiplier une source par -1, ou échanger deux sources, donne exactement les mêmes capteurs. L'ICA ne peut pas trancher. On identifie chaque composante après coup, par sa forme ou sa corrélation avec un signal connu.
L'algorithme le plus utilisé pour calculer une ICA, proposé par Aapo Hyvärinen à la fin des années 1990. Il maximise la non-gaussianité des composantes par une méthode de point fixe, rapide et sans pas d'apprentissage à régler.
Trouve des axes non corrélés, classés par variance. Suffit pour compresser, pas pour démêler des sources.
Voir la fiche → l'autre modèle de facteurs cachésSuppose des facteurs gaussiens et une part propre à chaque variable. Taillée pour les questionnaires, pas pour les signaux.
Voir la fiche → séparation à valeurs positivesSépare aussi des sources, mais positives : spectres audio, comptages, images.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus