データポイント:(7,1)、(3,4)、(1,5)、(5,8)、(1,3)、(7,8)、(8,2)、(5,9) 、(8,0)
l = 2 //オーバーサンプリング係数
k = 3 //いいえ。希望のクラスターの
ステップ1:
最初の重心が is { c 1 } = { (C。X = { X 1は、xは2、xは3、xは4、xは5は、xは6、xは7、xは8 } = { (7 、1 )、(3 、4 )、(1{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)}
ステップ2:
は、セット Xのすべての点から Cのすべての点までのすべての最小2ノルム距離(ユークリッド距離)の合計です。言い換えると、 Xの各点について、 Cの最も近い点までの距離を見つけ、最終的に Xの各点に1つずつ、これらすべての最小距離の合計を計算します。ϕX(C)XCXCX
d 2で表すxiからCの最も近い点までの距離として C(xi)でます。我々は次に有するψ=Σ N I = 1、D2 C(XI)。d2C(xi)xiCψ=∑ni=1d2C(xi)
ステップ2では、には単一の要素が含まれ(ステップ1を参照)、Xはすべての要素のセットです。したがって、このステップではd 2CXは、単にCの点とxiの間の距離です。したがって、ϕ=∑ n i = 1 | | xi−c| | 2。d2C(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(rounded)
ただし、ステップ3では、に複数のポイントが含まれるため、一般式が適用されることに注意してください。C
ステップ3:
以下のためのループが実行される以前に計算しました。log(ψ)
図面はあなたが理解したようなものではありません。描画は独立しています。つまり、各ポイントに対して描画を実行します。したがって、Xの各ポイントに対して、x iとして示されますXXxi、から確率を計算します。ここで、lはパラメーターとして与えられた係数であり、d 2(x 、C)は最も近い中心までの距離であり、ϕ X(C)px=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C) 手順2で説明します。
アルゴリズムは単純です:
- 反復してすべてのx iを見つけるXxi
- 各に対してp x iを計算するxipxi
- 均一数を生成するよりも小さい場合、P xはiが形成することを選択してCを'[0,1]pxiC′
- あなたが行われた後、すべてはから選択された点などが描きにCをC′C
反復で実行される各ステップ3(元のアルゴリズムの3行目)で、Xからポイントを選択することを期待していることに注意してください(これは、期待値の式を直接書くと簡単にわかります)。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;
ステップ4:
wC0Xxi∈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]++;
}
ステップ5:
wkkp(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)
...
}
kmeans ++の場合のように、クラスタリングアルゴリズムの通常のフローを使用して、前のすべての手順が続行されます。
私は今より明確であることを望みます。
[後で、後で編集]
著者によって作成されたプレゼンテーションも見つけましたが、各反復で複数のポイントが選択される可能性があることを明確に説明することはできません。プレゼンテーションはこちらです。
[後で@peraの問題を編集]
log(ψ)
Clog(ψ)
もう1つ注意すべきことは、同じページに記載されている次の注意事項です。
実際には、セクション5の実験結果では、優れたソリューションに到達するには数ラウンドで十分であることが示されています。
log(ψ)