데이터 포인트 : (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
3 단계 :
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(ψ)