k-means || alias K-Means évolutif ++

12

Bahman Bahmani et al. a introduit k-means ||, qui est une version plus rapide de k-means ++.

Initialisation des k-moyennes ||

Cet algorithme est tiré de la page 4 de leur article , Bahmani, B., Moseley, B., Vattani, A., Kumar, R., et Vassilvitskii, S. (2012). K-means évolutif ++. Actes de la dotation VLDB , 5 (7), 622-633.

Malheureusement, je ne comprends pas ces lettres grecques fantaisistes, j'ai donc besoin d'aide pour comprendre comment cela fonctionne. Autant que je sache, cet algorithme est une version améliorée de k-means ++, et il utilise un suréchantillonnage, pour réduire le nombre d'itérations: k-means ++ doit itérer fois, où k est le nombre de clusters souhaités.kk

J'ai obtenu une très bonne explication grâce à un exemple concret du fonctionnement de k-means ++, je vais donc réutiliser le même exemple.

Exemple

J'ai le jeu de données suivant:

(7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9), (8 , 0)

(nombre de grappes souhaitées)k=3

(facteur de suréchantillonnage)=2

Exemple d'ensemble de données pour k-means ||

J'ai commencé à le calculer, mais je ne sais pas si je l'ai bien fait, et je n'ai aucune idée des étapes 2, 4 ou 5.

  • Étape 1: échantillonner un point uniformément au hasard à partir de XCX

    Disons que le premier centroïde est (identique à k-means ++)(8,0)

  • Étape 2: ψϕX(C)

    aucune idée

  • Étape 3:

    • d2(x,C)=[2,41,74,73,58,65,4,90]

      Nous calculons les distances au carré du centre le plus proche de chaque point. Dans ce cas, nous n'avons pour l'instant qu'un seul centre .(8,0)

    • d2(x,C)=[4,81,148,146,116,130,8,180]

      (Parce que dans ce cas.)=2

    • cumulative d2(x,C)=[4,85,233,379,495,625,633,813]

      Choisissez nombres aléatoires dans l'intervalle [ 0 , 813 ) . Disons que vous choisissez 246.90 et 659.42 . Ils se situent dans les fourchettes [ 379 , 495 ) et [ 633 , 813 ) qui correspondent respectivement aux 4e et 8e éléments.=2[0,813)246.90659.42[379,495)[633,813)

    • Répétez-le fois, mais qu'est-ce que ψ (calculé à l'étape 2) dans ce cas? O(logψ)ψ

  • Etape 4: Pour , ensemble avec x étant le nombre de points en X plus proche de x que de tout autre point dans C .xCwxXxC
  • Étape 5: Re-regrouper les points pondérés en en k grappes.Ck

Toute aide en général ou dans cet exemple particulier serait formidable.

user1930254
la source

Réponses:

10

points de données: (7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9) , (8,0)

l = 2 // facteur de suréchantillonnage

k = 3 // non. des clusters souhaités

Étape 1:

C{c1}={(8,0)}X={x1,x2,x3,x4,x5,x6,x7,x8}={(7,1),(3,4),(1,5),(5,8),(1,3),(7,8),(8,2),(5,9)}

Étape 2:

ϕX(C)XCXCX

dC2(xi)xiCψ=i=1ndC2(xi)

CXdC2(xi)Cxiϕ=i=1n||xic||2

ψ=i=1nd2(xi,c1)=1.41+6.4+8.6+8.54+7.61+8.06+2+9.4=52.128 log(ψ)=log(52.128)=3.95=4(rounded)

C

Étape 3:

log(ψ)

XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C) est expliqué à l'étape 2.

L'algorithme est simplement:

  • Xxi
  • xipxi
  • [0,1]pxiC
  • CC

lX

for(int i=0; i<4; i++) {

  // compute d2 for each x_i
  int[] psi = new int[X.size()];
  for(int i=0; i<X.size(); i++) {
    double min = Double.POSITIVE_INFINITY;
    for(int j=0; j<C.size(); j++) {
      if(min>d2(x[i],c[j])) min = norm2(x[i],c[j]);
    }
    psi[i]=min;
  }

  // compute psi
  double phi_c = 0;
  for(int i=0; i<X.size(); i++) phi_c += psi[i];

  // do the drawings
  for(int i=0; i<X.size(); i++) {
    double p_x = l*psi[i]/phi;
    if(p_x >= Random.nextDouble()) {
      C.add(x[i]);
      X.remove(x[i]);
    }
  }
}
// in the end we have C with all centroid candidates
return C;

Étape 4:

wC0XxiXjCw[j]1w

double[] w = new double[C.size()]; // by default all are zero
for(int i=0; i<X.size(); i++) {
  double min = norm2(X[i], C[0]);
  double index = 0;
  for(int j=1; j<C.size(); j++) {
    if(min>norm2(X[i],C[j])) {
      min = norm2(X[i],C[j]);
      index = j;
    }
  }
  // we found the minimum index, so we increment corresp. weight
  w[index]++;
}

Étape 5:

wkkp(i)=w(i)/j=1mwj

for(int k=0; k<K; k++) {
  // select one centroid from candidates, randomly, 
  // weighted by w
  // see kmeans++ and you first idea (which is wrong for step 3)
  ... 
}  

Toutes les étapes précédentes se poursuivent, comme dans le cas de kmeans ++, avec le flux normal de l'algorithme de clustering

J'espère que c'est plus clair maintenant.

[Plus tard, plus tard modifier]

J'ai également trouvé une présentation faite par des auteurs, où vous ne pouvez pas clairement indiquer qu'à chaque itération, plusieurs points peuvent être sélectionnés. La présentation est ici .

[Édition ultérieure du numéro de @ pera]

log(ψ)

Clog(ψ)

Une autre chose à noter est la note suivante sur la même page qui dit:

En pratique, nos résultats expérimentaux dans la section 5 montrent que seuls quelques tours sont suffisants pour parvenir à une bonne solution.

log(ψ)

rapaio
la source
pourriez-vous s'il vous plaît étendre votre réponse avec le calcul de mon exemple?
user1930254
Je suis programmeur, je pense que je peux l'écrire en code plus rapidement qu'en tapant ici :). J'espère que cela explique l'algo.
rapaio
Pouvez-vous expliquer quelle est l'idée avec le nombre d'itérations log (Ksi)? Je ne comprends pas l'idée en dessous, il semble que le nombre d'itérations dépendra de la plage de valeurs des objets, ce qui ne semble pas raisonnable. Par exemple, si les objets ont des valeurs d'attribut d'environ 1000, cela pourrait, par exemple, entraîner une erreur d'environ 1000, ce qui signifie qu'il y aura 3 itérations. D'un autre côté, si les valeurs sont dans la plage de 10, cela pourrait entraîner que l'erreur soit d'environ 10, ce qui entraîne 1 itération. Le nombre d'itérations ne devrait-il pas dépendre du nombre d'objets?
Marko
@pera Je mets à jour la réponse pour clarifier le problème que vous avez soulevé
rapaio
@rapaio Merci pour votre réponse, je vais déjà pour la solution qui déterminera le nombre d'itérations en fonction du nombre de médoïdes. Où x peut être augmenté pour obtenir une meilleure initialisation au prix de quelques itérations de plus. Êtes-vous d'accord, d'accord, d'après la deuxième partie que vous avez donnée? Merci encore.
Marko