điểm dữ liệu: (7.1), (3,4), (1,5), (5,8), (1,3), (7,8), (8.2), (5,9) , (8,0)
l = 2 // hệ số bội số
k = 3 // không. của cụm mong muốn
Bước 1:
Giả sử trọng tâm đầu tiên là là { c 1 } = { ( 8 , 0 ) } . X = { x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , x 7 , x 8 } 5 ) , ( 5 , 8 ) , ( 1 , 3 ) , (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)}
Bước 2:
là tổng của tất cả các khoảng cách 2-norm nhỏ nhất (khoảng cách Euclide) từ tất cả các điểm từ tập X đến tất cả các điểm từ C . Nói cách khác, đối với mỗi điểm trong X tìm ra khoảng cách đến điểm gần nhất trong C , cuối cùng tính tổng của tất cả những khoảng cách tối thiểu, một cho mỗi điểm trong X .ϕX(C)XCXCX
Biểu thị với là khoảng cách từ x i đến điểm gần nhất trong C . Sau đó chúng tôi có ψ = Σ n i = 1 d 2 C ( x i ) .d2C(xi)xiCψ=∑ni=1d2C(xi)
Ở bước 2, chứa một phần tử duy nhất (xem bước 1) và X là tập hợp của tất cả các phần tử. Do đó trong bước này, d 2 C ( x i ) chỉ đơn giản là khoảng cách giữa điểm trong C và x i . Do đó φ = Σ n i = 1 | | xCXd2C(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)
Tuy nhiên, lưu ý rằng trong bước 3, công thức chung được áp dụng vì sẽ chứa nhiều hơn một điểm.C
Bước 3:
Các cho vòng lặp được thực hiện cho tính toán trước đây.log(ψ)
Các bản vẽ không giống như bạn hiểu. Các bản vẽ là độc lập, có nghĩa là bạn sẽ thực hiện một trận hòa cho mỗi điểm trong . Vì vậy, với mỗi điểm trong X , ký hiệu là x i , hãy tính xác suất từ p x = l d 2 ( x , C ) / ϕ X ( C ) . Ở đây bạn có l là một yếu tố được cho là tham số, d 2 ( x , CXXxipx=ld2(x,C)/ϕX(C)l là khoảng cách đến trung tâm gần nhất, và φ X ( C )d2(x,C)ϕX(C) được giải thích ở bước 2.
Thuật toán chỉ đơn giản là:
- lặp đi lặp lại trong để tìm tất cả x iXxi
- cho mỗi xi tính pxi
- tạo số đồng nhất trong , nếu nhỏ hơn p x i[0,1]pxi chọn nó để tạo thành C′
- sau khi bạn thực hiện tất cả các lần rút bao gồm các điểm được chọn từ vào CC′C
Lưu ý rằng ở mỗi bước 3 được thực hiện trong lần lặp (dòng 3 của thuật toán gốc) bạn sẽ chọn điểm từ X (điều này dễ dàng được hiển thị bằng cách viết trực tiếp công thức cho kỳ vọng).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;
Bước 4:
Một thuật toán đơn giản cho điều đó là để tạo ra một vector kích thước tương đương với số lượng của các nguyên tố trong C , và khởi tạo tất cả các giá trị của nó với 0 . Bây giờ lặp lại trong X (các phần tử không được chọn là centroid) và với mỗi x i ∈ X , hãy tìm chỉ số j của centroid gần nhất (phần tử từ C ) và tăng w [ j ] với 1 . Cuối cùng, bạn sẽ có vector w được tính toán chính xác.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]++;
}
Bước 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)
...
}
Tất cả các bước trước tiếp tục, như trong trường hợp kmeans ++, với dòng chảy bình thường của thuật toán phân cụm
Tôi hy vọng là rõ ràng hơn bây giờ.
[Sau này, chỉnh sửa sau]
Tôi cũng tìm thấy một bài thuyết trình được thực hiện bởi các tác giả, trong đó bạn không thể rõ ràng rằng ở mỗi lần lặp, nhiều điểm có thể được chọn. Bài thuyết trình ở đây .
[Sau này chỉnh sửa vấn đề của @ pera]
log(ψ)
Clog(ψ)
Một điều cần lưu ý là ghi chú sau trên cùng một trang có ghi:
Trong thực tế, kết quả thử nghiệm của chúng tôi trong Phần 5 cho thấy chỉ một vài vòng là đủ để đạt được một giải pháp tốt.
Điều đó có nghĩa là bạn có thể chạy thuật toán không cho l o g( ψ ) lần, nhưng trong một thời gian nhất định.