Il est vrai que la classification K-means et PCA semblent avoir des objectifs très différents et qu’à première vue, ils ne semblent pas être liés. Cependant, comme l'explique le document King-Clustering de Ding & He 2004 sur l' analyse en composantes principales , il existe un lien étroit entre elles.
L'intuition est que PCA cherche à représenter tous les vecteurs de données sous forme de combinaisons linéaires d'un petit nombre de vecteurs propres et à le faire pour minimiser l'erreur de reconstruction au carré moyen. En revanche, K-means cherche à représenter tous les n vecteurs de données via un petit nombre de centroïdes de grappes, c'est-à-dire de les représenter sous forme de combinaisons linéaires d'un petit nombre de vecteurs de centroïdes de grappes où les pondérations de combinaisons linéaires doivent être toutes nulles, à l'exception du simple 1 . Ceci est également fait pour minimiser l'erreur de reconstruction au carré moyen.nn1
Donc, K-means peut être vu comme une ACP super-épars.
Ce que fait le papier Ding & He, c’est pour rendre cette connexion plus précise.
Malheureusement, le papier Ding & He contient au mieux des formulations bâclées et peut facilement être mal compris. Par exemple, il pourrait sembler que Ding & He affirme avoir prouvé que les centroïdes de cluster de la solution de clustering K-means se situent dans le sous-espace de la PCA à la :(K−1)
Théorème 3.3. Le sous-espace centroïde de cluster est recouvert par les premières
directions principales [...].K−1
Pour cela impliquerait que les projections sur l’axe PC1 seront nécessairement négatives pour un groupe et positives pour un autre groupe, c’est-à-dire que l’axe PC2 séparera parfaitement les groupes.K=2
C'est soit une erreur, soit une écriture bâclée; dans tous les cas, pris littéralement, cette affirmation est fausse.
K=2100
On peut clairement voir que même si les centroïdes de la classe ont tendance à être assez proches de la direction du premier PC, ils ne tombent pas exactement dessus. De plus, même si l’axe PC2 sépare parfaitement les grappes dans les sous-parcelles 1 et 4, quelques points se trouvent du mauvais côté dans les sous-parcelles 2 et 3.
Donc, l'accord entre K-means et PCA est assez bon, mais ce n'est pas exact.
K=2n1n2n=n1+n2 q∈Rnqi=n2/nn1−−−−−−√iqi=−n1/nn2−−−−−−√∥q∥=1∑qi=0
Ding & He montrent que la fonction de perte de K-moyennes (que l'algorithme de K-moyennes minimise) peut être réécrite de manière équivalente en tant que , où est le matrice de Gram de produits scalaires entre tous les points: , où est le matrice de données et est la matrice de données centrée.∑k∑i(xi−μk)2−q⊤GqGn×nG=X⊤cXcXn×2Xc
(Remarque: j'utilise une notation et une terminologie qui diffèrent légèrement de leur papier mais que je trouve plus claires).
Donc, la solution K-means est un vecteur unitaire centré maximisant . Il est facile de montrer que la première composante principale (normalisée pour avoir une somme unitaire de carrés) est le vecteur propre de la matrice de Gram, c’est-à-dire qu’il s’agit également d’un vecteur unitaire centré maximisant . La seule différence est que est en outre contraint de n'avoir que deux valeurs différentes alors que n'a pas cette contrainte.qq⊤Gqpp⊤Gpqp
En d'autres termes, K-means et PCA maximisent la même fonction objectif , la seule différence étant que K-means a une contrainte "catégorielle" supplémentaire.
Il va de soi que la plupart du temps, les solutions K-means (contrainte) et PCA (contrainte) seront très proches l'une de l'autre, comme nous l'avons vu plus haut dans la simulation, mais il ne faut pas s'attendre à ce qu'elles soient identiques. Prendre et définir tous ses éléments négatifs pour qu'ils soient égaux à et tous ses éléments positifs à ne donneront généralement pas exactement .p−n1/nn2−−−−−−√n2/nn1−−−−−−√q
Ding & He semblent bien le comprendre car ils formulent leur théorème comme suit:
Théorème 2.2. Pour la classification K-moyennes où , la solution continue du vecteur indicateur de la grappe est la [première] composante principaleK=2
Notez que les mots "solution continue". Après avoir prouvé ce théorème, ils expliquent en outre que PCA peut être utilisée pour initialiser les itérations de K-moyennes, ce qui est tout à fait logique étant donné que nous nous attendons à ce que soit proche de . Mais il faut encore effectuer les itérations, car elles ne sont pas identiques.qp
Cependant, Ding & He développe ensuite un traitement plus général pour et finit par formuler le théorème 3.3 comme suit:K>2
Théorème 3.3. Le sous-espace centroïde de cluster est recouvert par les premières
directions principales [...].K−1
Je ne suis pas passé par les calculs de la section 3, mais je crois que ce théorème se réfère en fait également à la "solution continue" de K-means, c.-à-d. étalé [...] ".
Ding & He, cependant, ne font pas cette qualification importante, et écrivent en outre dans leur résumé que
Nous montrons ici que les composants principaux sont les solutions continues aux indicateurs d’appartenance à un cluster discret pour le clustering K-means. De manière équivalente, nous montrons que le sous-espace couvert par les centroïdes de cluster est donné par l'expansion spectrale de la matrice de covariance des données tronquée à .K−1
La première phrase est absolument correcte, mais la seconde ne l’est pas. Il m'est difficile de savoir s'il s'agit d'une écriture (très) bâclée ou d'une erreur réelle. J'ai très poliment envoyé un courrier électronique aux deux auteurs pour leur demander des éclaircissements. (Mise à jour deux mois plus tard: je n'ai jamais eu de leurs nouvelles.)
Code de simulation Matlab
figure('Position', [100 100 1200 600])
n = 50;
Sigma = [2 1.8; 1.8 2];
for i=1:4
means = [0 0; i*2 0];
rng(42)
X = [bsxfun(@plus, means(1,:), randn(n,2) * chol(Sigma)); ...
bsxfun(@plus, means(2,:), randn(n,2) * chol(Sigma))];
X = bsxfun(@minus, X, mean(X));
[U,S,V] = svd(X,0);
[ind, centroids] = kmeans(X,2, 'Replicates', 100);
subplot(2,4,i)
scatter(X(:,1), X(:,2), [], [0 0 0])
subplot(2,4,i+4)
hold on
scatter(X(ind==1,1), X(ind==1,2), [], [1 0 0])
scatter(X(ind==2,1), X(ind==2,2), [], [0 0 1])
plot([-1 1]*10*V(1,1), [-1 1]*10*V(2,1), 'k', 'LineWidth', 2)
plot(centroids(1,1), centroids(1,2), 'w+', 'MarkerSize', 15, 'LineWidth', 4)
plot(centroids(1,1), centroids(1,2), 'k+', 'MarkerSize', 10, 'LineWidth', 2)
plot(centroids(2,1), centroids(2,2), 'w+', 'MarkerSize', 15, 'LineWidth', 4)
plot(centroids(2,1), centroids(2,2), 'k+', 'MarkerSize', 10, 'LineWidth', 2)
plot([-1 1]*5*V(1,2), [-1 1]*5*V(2,2), 'k--')
end
for i=1:8
subplot(2,4,i)
axis([-8 8 -8 8])
axis square
set(gca,'xtick',[],'ytick',[])
end