k-bedeutet || aka Scalable K-Means ++

12

Bahman Bahmani et al. Einführung von k-means ||, einer schnelleren Version von k-means ++.

Initialisierung von k-means ||

Dieser Algorithmus stammt von Seite 4 ihrer Veröffentlichung Bahmani, B., Moseley, B., Vattani, A., Kumar, R. und Vassilvitskii, S. (2012). Skalierbares k-means ++. Verfahren der VLDB-Stiftung , 5 (7), 622-633.

Leider verstehe ich diese ausgefallenen griechischen Buchstaben nicht, daher brauche ich Hilfe, um zu verstehen, wie das funktioniert. Soweit ich weiß, ist dieser Algorithmus eine verbesserte Version von k-means ++ und verwendet Oversampling, um die Anzahl der Iterationen zu verringern: k-means ++ muss mal iterieren , wobeik die Anzahl der gewünschten Cluster ist.k

ich habe eine sehr gute Erklärung durch ein konkretes Beispiel bekommen, wie k-means ++ funktioniert, also werde ich dasselbe Beispiel wieder verwenden.

Beispiel

Ich habe folgenden Datensatz:

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

(Anzahl der gewünschten Cluster)k=3

(Überabtastungsfaktor)=2

Beispieldatensatz für k-means ||

Ich habe angefangen, es zu berechnen, bin mir aber nicht sicher, ob ich es richtig gemacht habe und habe keine Ahnung von den Schritten 2, 4 oder 5.

  • Schritt 1: einen Punkt gleichmäßig zufällig von X abtastenCX

    Angenommen, der erste Schwerpunkt ist (wie in k-means ++).(8,0)

  • Schritt 2: ψϕX(C)

    keine Ahnung

  • Schritt 3:

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

      Wir berechnen die quadratischen Abstände zum nächstgelegenen Zentrum zu jedem Punkt. In diesem Fall haben wir bisher nur ein Zentrum .(8,0)

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

      (Weil in diesem Fall ist.)=2

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

      Wählen Sie Zufallszahlen im Intervall [ 0 , 813 ) . Angenommen, Sie wählen 246,90 und 659,42 . Sie fallen in die Bereiche [ 379 , 495 ) und [ 633 , 813 ), die dem 4. bzw. 8. Posten entsprechen.=2[0,813)246.90659.42[379,495)[633,813)

    • Wiederhole es mal, aber was ist in diesem Fall ψ (berechnet in Schritt 2)? O(logψ)ψ

  • Schritt 4: Für , Set w x die Anzahl der Punkte in seinen X näher an x als jeder anderen Punkt C .xCwxXxC
  • Schritt 5: Rekluster der gewichteten Punkte in in k Cluster.Ck

Jede Hilfe im Allgemeinen oder in diesem speziellen Beispiel wäre großartig.

user1930254
quelle

Antworten:

10

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

l = 2 // Überabtastungsfaktor

k = 3 // nein. von gewünschten Clustern

Schritt 1:

Angenommen, der erste Schwerpunkt ist ist { c 1 } = { ( 8 , 0 ) } . X = { x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , x 7 , x 8 } = { ( 7 , 1 ) , ( 3 , 4 ) , ( 1C{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)}

Schritt 2:

ist die Summe aller kleinsten 2-Norm Abstände (euklidische Distanz) von allen Punkten aus dem Satz X auf alle Punkte von C . Mit anderen Worten, ermittle für jeden Punkt in X die Entfernung zum nächsten Punkt in C und berechne am Ende die Summe aller dieser minimalen Entfernungen, eine für jeden Punkt in XϕX(C)XCXCX .

Bezeichne mit als der Abstand von x i zu dem nächsten Punkt in C . Wir haben dann ψ = n i = 1 d 2 C ( x i ) .dC2(xi)xiCψ=i=1ndC2(xi)

In Schritt 2 enthält ein einzelnes Element (siehe Schritt 1) ​​und X ist die Menge aller Elemente. Somit ist in diesem Schritt d 2 C ( x i ) einfach der Abstand zwischen dem Punkt in C und x i . Also ist ϕ = n i = 1 | | x i - c | | 2 .CXdC2(xi)Cxiϕ=i=1n||xic||2

l o g ( ψ ) = l o g ( 52,128 ) = 3,95 = 4 ( r o u n d e dψ=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)

Beachten Sie jedoch, dass in Schritt 3 die allgemeine Formel angewendet wird, da mehr als einen Punkt enthält.C

Schritt 3:

Die for- Schleife wird für zuvor berechnet wurde.log(ψ)

Die Zeichnungen sind nicht so, wie Sie es verstanden haben. Die Zeichnungen sind unabhängig, was bedeutet, dass Sie für jeden Punkt in eine Zeichnung ausführen . So wird für jeden Punkt in X , bezeichnet als x i , Berechnen einer Wahrscheinlichkeit von P x = l d 2 ( x , C ) / φ X ( C ) . Hier haben Sie l einen Faktor als Parameter angegeben, d 2 ( x , C ) ist der Abstand zum nächstgelegenen Zentrum, und ϕ X ( C )XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C) wird in Schritt 2 erklärt.

Der Algorithmus ist einfach:

  • iterieren Sie in , um alle x i zu findenXxi
  • für jedes berechnet i p x ixipxi
  • eine einheitliche Zahl in generiert , wenn kleiner als ist p x i es auswählen bilden C '[0,1]pxiC
  • Nachdem Sie fertig sind, schließen alle Zeichnungen ausgewählte Punkte von nach C einCC

Beachten Sie, dass Sie bei jedem Schritt 3, der in der Iteration ausgeführt wird (Zeile 3 des ursprünglichen Algorithmus), erwarten, dass Sie Punkte aus X auswählen (dies wird leicht gezeigt, indem Sie direkt die Formel für die Erwartung schreiben).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;

Schritt 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]++;
}

Schritt 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)
  ... 
}  

Alle vorherigen Schritte werden wie im Fall von kmeans ++ mit dem normalen Ablauf des Clustering-Algorithmus fortgesetzt

Ich hoffe es ist jetzt klarer.

[Später, später bearbeiten]

Ich habe auch eine Präsentation von Autoren gefunden, bei der man nicht klar erkennen kann, dass bei jeder Iteration mehrere Punkte ausgewählt werden könnten. Die Präsentation ist hier .

[Später bearbeiten @ pera Ausgabe]

log(ψ)

Clog(ψ)

Eine andere Anmerkung ist die folgende Anmerkung auf derselben Seite, die besagt:

In der Praxis zeigen unsere experimentellen Ergebnisse in Abschnitt 5, dass nur wenige Runden ausreichen, um eine gute Lösung zu erreichen.

log(ψ)

rapaio
quelle
Könnten Sie bitte Ihre Antwort mit der Berechnung für mein Beispiel erweitern?
user1930254
Ich bin ein Programmierer, ich denke, ich kann das in Code schneller schreiben, als hier zu tippen :). Hoffe es erklärt das algo.
Rapaio
Können Sie bitte erklären, was die Idee mit der Anzahl der Iterationen in log (Ksi) ist? Ich verstehe die Idee dahinter nicht, es scheint, dass die Anzahl der Iterationen vom Wertebereich der Objekte abhängt, was nicht sinnvoll erscheint. Wenn Objekte beispielsweise Attributwerte von ungefähr 1000 aufweisen, kann dies beispielsweise dazu führen, dass der Fehler ungefähr 1000 beträgt, was bedeutet, dass es 3 Iterationen gibt. Liegen die Werte dagegen im Bereich von 10, kann dies dazu führen, dass der Fehler bei etwa 10 liegt, was zu 1 Iteration führt. Sollte die Anzahl der Iterationen nicht von der Anzahl der Objekte abhängen?
Marko
@pera Ich aktualisiere die Antwort, um das von Ihnen angesprochene
Problem
@rapaio Vielen Dank für Ihre Antwort. Ich habe bereits die Lösung ausgewählt, die die Anzahl der Iterationen basierend auf der Anzahl der Medoide ermittelt. Wobei x erhöht werden kann, um eine bessere Initialisierung zu erzielen, und zwar auf Kosten einiger weiterer Iterationen. Gefällt dir das gut, basierend auf dem zweiten Teil, den du gegeben hast? Danke noch einmal.
Marko