数据点:(7,1),(3,4),(1,5),(5,8),(1,3),(7,8),(8,2),(5,9) ,(8,0)
l = 2 //过采样系数
k = 3 //不。所需集群
步骤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)}
第2步:
ϕX(C)XCXCX
d2C(xi)xiCψ=∑ni=1d2C(xi)
CXd2C(xi)Cxiϕ=∑ni=1||xi−c||2
ψ=∑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)
C
第三步:
log(ψ)
XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C) 在步骤2中进行了说明。
该算法很简单:
- Xxi
- xipxi
- [0,1]pxiC′
- C′C
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(ψ)
要注意的另一件事是同一页面上的以下注意事项:
在实践中,我们在第5节中的实验结果表明,仅几轮就足以达成一个好的解决方案。
log(ψ)