Hello,
J'ai implémenté une une version améliorée de l'algorithme de Lloyd, il s'agit de k-means++.
J'ai bien pris soin de choisir des centroides initiaux différents les uns des autres (ça se fait automatiquement avec kmeans++).
Ce que je ne m'explique pas est que je perds des centroides au cours de l'exécution.
En fait, quand j'assigne les points aux centroides les plus proches, un des centroides peut, parfois, se retrouver sans aucun point attaché à lui. Ce qui est logiquement impossible, sauf si quelque chose m'échappe.
Quelqu'un a une explication ?
Code octave : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 % x: data points % u: centroids J = 0; t = 0; do{ oJ = J; D = repmat(diag(x*x'), 1, size(u,1)) + repmat(diag(u*u')', size(x,1), 1) - 2*x*u'; p = cvtcm(argmin(D)); u = (p'*p)^-1*p*x; J = trace(p'*D); }while(abs(oJ - J) > 1e-10 && (t++ < 100));
cvtcm est une fonction qui convertit un vecteur indicateur en matrice indicatrice.
voilà un exemple :
cvtcm([0,1,1,2,1,5]) =>
1 0 0 0
0 1 0 0
0 1 0 0
0 0 1 0
0 1 0 0
0 0 0 1
David
Partager