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 )d2C(xi)xiCψ=∑ni=1d2C(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 | | 2CXd2C(xi)Cxiϕ=∑ni=1||xi−c||2
l o g ( ψ ) = l o g ( 52.128 ) = 3.95 = 4 ( r o u n d e dψ=∑ni=1d2(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 ( r o u n de d)
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.l o g( ψ )
Ç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 )XXxbenpx= L d2( x , C) / ϕX( C)ld2( x , C)φX( C)
Algoritma basitçe:
- bulmak için yinelemex iXxben
- her hesaplaması içinp x ixbenpxben
- birörnek sayı üretin , den küçükse oluşturmak için bunu seçinp x i C ′[ 0 , 1 ]pxbenC'
- yaptıktan sonra tüm çekilişler ile arasında seçilen noktaları içerir CC'C
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.Cı 0 x x i ∈ x j Cı w [ j ] 1 ağırlıkwC0Xxben∈ XjCw[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)/∑mj=1wj
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(ψ)