k-ortalamalar || aka Ölçeklenebilir K-Ortalamalar ++


12

Bahman Bahmani ve diğ. k-means ++ 'nın daha hızlı bir sürümü olan k-means ||' ı tanıttı.

K-araçlarının başlatılması ||

Bu algoritma 4. sayfasında alınır onların kağıt , Bahmani, B., Moseley, B., Vattani, A., Kumar, R., & Vassilvitskii, S. (2012). Ölçeklenebilir k-++ anlamına gelir. VLDB Vakası Bildirileri , 5 (7), 622-633.

Ne yazık ki bu süslü Yunan harflerini anlamıyorum, bu yüzden bunun nasıl çalıştığını anlamak için yardıma ihtiyacım var. Anladığım kadarıyla, bu algoritma k-means ++ 'ın geliştirilmiş bir versiyonudur ve yineleme sayısını azaltmak için aşırı örnekleme kullanır: k-means ++ sürelerini yinelemelidir , burada istenen kümelerin sayısıdır.kkk

K-means ++ 'nın nasıl çalıştığına dair somut bir örnekle çok iyi bir açıklama aldım , bu yüzden aynı örneği tekrar kullanacağım.

Misal

Aşağıdaki veri kümesi var:

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

k=3 (istenen kümelerin sayısı)

=2 (aşırı örnekleme faktörü)

K-means için örnek veri seti ||

Hesaplamaya başladım, ancak doğru olup olmadığımdan emin değilim ve Adım 2, 4 veya 5 hakkında hiçbir fikrim yok.

  • Adım 1: noktasından rastgele rastgele bir nokta örneğiXCX

    Diyelim ki ilk sentroid (k-ortalaması ++ ile aynı)(8,0)

  • 2. Adım:ψϕX(C)

    fikrim yok

  • Aşama 3:

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

      Her noktaya en yakın merkeze kare mesafeleri hesaplıyoruz. Bu durumda şimdiye kadar sadece bir merkezimiz var .(8,0)

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

      (Çünkü bu durumda )=2

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

      Al aralığında rasgele sayılar . Diyelim ki ve . Sırasıyla 4. ve 8. maddelere karşılık gelen ve aralıklarındadırlar .[ 0 , 813 ) 246.90 659.42 [ 379 , 495 ) [ 633 , 813 )=2[0,813)246.90659.42[379,495)[633,813)

    • O tekrarlayın defa, ama ne bu durumda (Adım 2'de hesaplanan)? ψO(logψ)ψ

  • Adım 4: için , resim noktaların sayısı olduğu yakın olan herhangi bir başka noktasından daha .g x X x CxCwxXxC
  • Adım 5: içindeki ağırlıklı noktaları kümelerine tekrar toplayın . kCk

Genel olarak veya bu örnekte herhangi bir yardım çok iyi olurdu.

Yanıtlar:


10

veri noktaları: (7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9) , (8,0)

l = 2 // aşırı örnekleme faktörü

k = 3 // hayır. istenen kümelerin yüzdesi

Aşama 1:

İlk ağırlık merkezi varsayalım olduğunu . { 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 ) , ( 1 , 5 ) , (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)}

Adım 2:

X C X C XϕX(C) ayarlamak tüm noktalar tüm küçük 2-norm mesafeleri (Öklit mesafesi) toplamıdır tüm noktalara . Başka bir deyişle, her nokta için deki en yakın noktaya olan mesafeyi bulun, sonunda her nokta için bir tane olmak üzere tüm bu minimum mesafelerin toplamını hesaplayın .XCXCX

İle Göstermek mesafe olarak gelen en yakın noktaya . Daha sonra .x i C ψ = n i = 1 d 2 C ( x i )dC2(xi)xiCψ=i=1ndC2(xi)

2. adımda, tek bir öğe içerir (bkz. Adım 1) ve tüm öğeler kümesidir. Dolayısıyla bu adımda , ve içindeki nokta arasındaki mesafedir . Böylece . X d 2 C ( x i ) C x i ϕ = n i = 1 | | x i - c | | 2CXdC2(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)

Bununla birlikte, 3. adımda, birden fazla nokta içereceğinden genel formülün uygulandığını unutmayın .C

Aşama 3:

İçin döngü için yürütülür daha önce hesaplanan.log(ψ)

Çizimler sizin anladığınız gibi değil. Çizimler bağımsızdır, yani her nokta için bir çizim gerçekleştireceksiniz . Bu nedenle, olarak gösterilen her nokta için dan bir olasılık hesaplayın . Burada sahip parametre olarak verilen bir etken, en yakın merkezi mesafedir, ve 2. adımda açıklanmıştır.X x i p x = l d 2 ( x , C ) / ϕ X ( C ) l d 2 ( x , C ) ϕ X ( C )XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C)

Algoritma basitçe:

  • bulmak için yinelemex iXxi
  • her hesaplaması içinp x ixipxi
  • birörnek sayı üretin , den küçükse oluşturmak için bunu seçinp x i C [0,1]pxiC
  • yaptıktan sonra tüm çekilişler ile arasında seçilen noktaları içerir CCC

Yinelemede yürütülen her 3. adımda (orijinal algoritmanın 3. satırı) puan seçmeyi beklediğinizi unutmayın (bu kolayca beklenti için formülü yazarken kolayca gösterilir).XlX

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;

4. Adım:

Bunun için basit bir algoritma, boyutunda bir vektör oluşturmak deki eleman sayısına eşittir ve tüm değerlerini ile başlatır . Şimdi yineleyin (centroids olarak seçilmeyen öğeler) ve her için en yakın centroidin dizinini bulun ( öğesinden ) ve değerini ile . Sonunda vektörü doğru hesaplanır. 0 x x ix j w [ j ] 1 ağırlıkwC0XxiXjCw[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]++;
}

Adım 5:

Ağırlıklar dikkate alındığında önceki adımda hesaplanan, sen kmeans ++ algoritması sadece seçmek için takip sentroidler başlangıç olarak puan. Böylece, döngüler için yürütürsünüz, her döngüde tek bir eleman seçerek, her elemanın olma olasılığı ile rastgele . Her adımda bir element seçer ve adaylardan çıkarırsınız, ayrıca ilgili ağırlığını da kaldırırsınız.k k p ( i ) = w ( i ) / m j = 1 w jwkkp(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)
  ... 
}  

Önceki tüm adımlar, kmeans ++ durumunda olduğu gibi, kümeleme algoritmasının normal akışı ile devam eder

Umarım şimdi daha açıktır.

[Daha sonra düzenleyin]

Ayrıca yazarlar tarafından yapılan bir sunum buldum, burada her yinelemede birden fazla noktanın seçilebileceğini açıkça göremiyorsunuz. Sunum burada .

[Daha sonra @ pera'nın sayısını düzenleyin]

verilere bağlı olduğu ve algoritmanın tek bir ana bilgisayarda / makinede / bilgisayarda yürütülmesi durumunda ortaya koyduğunuz sorunun gerçek bir sorun olacağı açıktır . Bununla birlikte, kmeans kümelenmesinin bu varyantının büyük sorunlara ve dağıtılmış sistemlerde çalışmaya adanmış olduğunu not etmelisiniz. Dahası, yazarlar, algoritma açıklamasının yukarısındaki aşağıdaki paragraflarda aşağıdakileri belirtmektedir:log(ψ)

boyutunun giriş boyutundan önemli ölçüde küçük olduğuna dikkat edin ; bu nedenle yeniden yasaklama hızlı bir şekilde yapılabilir. Örneğin, MapReduce'da, merkez sayısı az olduğu için, bunların hepsi tek bir makineye atanabilir ve k merkezleri elde etmek için noktaları kümelemek için herhangi bir kanıtlanabilir yaklaşım algoritması (k-means ++ gibi) kullanılabilir. Algoritma 2'nin bir MapReduce uygulaması Bölüm 3.5'te ele alınmıştır. Algoritmamız çok basit olsa da ve doğal bir paralel uygulamaya ( mermi şeklinde) borç verirken , zorlu kısım kanıtlanabilir garantilere sahip olduğunu göstermektir.l o g ( ψ )Clog(ψ)

Dikkat edilmesi gereken başka bir şey, aynı sayfada belirtilen şu nottur:

Uygulamada, Bölüm 5'teki deneysel sonuçlarımız, iyi bir çözüme ulaşmak için sadece birkaç turun yeterli olduğunu göstermektedir.

Bu, algoritmayı kez değil, belirli bir sabit süre boyunca çalıştırabileceğiniz anlamına gelir .log(ψ)


Cevabımı örneğimin hesaplamasıyla uzatır mısınız?
user1930254

Ben bir programcıyım, sanırım buraya yazarak daha hızlı kod yazabilirim :). Umarım algo açıklar.
rapaio

Log (Ksi) yineleme sayısı ile fikrin ne olduğunu açıklayabilir misiniz? Altındaki fikri anlamıyorum, iterasyon sayısının makul görünmeyen nesnelerin değer aralığına bağlı olacağı anlaşılıyor. Örneğin, nesnelerin öznitelik değerleri yaklaşık 1000 ise, örneğin, hatanın yaklaşık 1000 olduğu sonucuna varabilir, yani 3 yineleme olacaktır. Öte yandan, değerler 10 aralığındaysa, hatanın yaklaşık 10 olmasıyla sonuçlanabilir ve bu da 1 yinelemeyle sonuçlanır. Yineleme sayısı nesne sayısına bağlı olmamalı mı?
Marko

@pera Ortaya koyduğunuz sorunu açıklığa kavuşturmak için cevabı
güncelliyorum

@ rapaio Cevabınız için teşekkür ederim, medoid sayısına göre yineleme sayısını belirleyecek bir çözüm için zaten gidiyorum. Burada x daha fazla yineleme maliyetiyle daha iyi başlatma elde etmek için artırılabilir. Verdiğiniz ikinci bölüme dayanarak sorun değil misiniz? Tekrar teşekkürler.
Marko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.