k-nghĩa là | | aka K-Means ++ có thể mở rộng


12

Bahman Bahmani et al. giới thiệu k-nghĩa | |, đây là phiên bản nhanh hơn của k-nghĩa ++.

Initialization of k-means||

Thuật toán này được lấy từ trang 4 của bài báo của họ , Bahmani, B., Moseley, B., Vattani, A., Kumar, R., & Vassilvitskii, S. (2012). Khả năng mở rộng k-nghĩa là ++. Thủ tục tố tụng của VLDB , 5 (7), 622-633.

Thật không may, tôi không hiểu những chữ cái Hy Lạp lạ mắt này, vì vậy tôi cần một số trợ giúp để hiểu cách thức hoạt động của nó. Theo như tôi hiểu thì thuật toán này là phiên bản cải tiến của k-mean ++ và nó sử dụng oversampling, để giảm số lần lặp: k-mean ++ phải lặp lại k lần, trong đó là số cụm mong muốn.k

Tôi đã có một lời giải thích rất tốt thông qua một ví dụ cụ thể về cách k-mean ++ hoạt động, vì vậy tôi sẽ sử dụng lại ví dụ tương tự.

Thí dụ

Tôi có bộ dữ liệu sau:

(7.1), (3,4), (1,5), (5,8), (1,3), (7,8), (8.2), (5,9), (8 , 0)

(số cụm mong muốn)k=3

(oversampling yếu tố)=2

Example data set for k-means||

Tôi bắt đầu tính toán nó, nhưng tôi không chắc là mình đã hiểu đúng chưa, và không biết gì về Bước 2, 4 hoặc 5.

  • Bước 1: lấy mẫu một điểm thống nhất ngẫu nhiên từ XCX

    Giả sử trọng tâm đầu tiên là (giống như trong k-mean ++)(8,0)

  • Bước 2: ψϕX(C)

    không ý kiến

  • Bước 3:

    • d2(x,C)=[2,41,74,73,58,65,4,90]

      Chúng tôi tính toán khoảng cách bình phương đến trung tâm gần nhất với mỗi điểm. Trong trường hợp này, chúng tôi chỉ có một trung tâm cho đến nay, .(8,0)

    • d2(x,C)=[4,81,148,146,116,130,8,180]

      (Bởi vì trong trường hợp này.)=2

    • cumulative d2(x,C)=[4,85,233,379,495,625,633,813]

      chọn số ngẫu nhiên trong khoảng [ 0 , 813 ) . Giả sử bạn chọn 246,90 659,42 . Chúng nằm trong phạm vi [ 379 , 495 ) [ 633 , 813 ) tương ứng với các mục thứ 4 và thứ 8.=2[0,813)246.90659.42[379,495)[633,813)

    • Lặp lại nó lần, nhưng là những gì ψ (tính ở bước 2) trong trường hợp này? O(logψ)ψ

  • Bước 4: Đối với , bộ w x là số điểm trong X gần gũi hơn với x hơn bất kỳ thời điểm nào trong C .xCwxXxC
  • Bước 5: Sắp xếp lại các điểm có trọng số trong thành các cụm k .Ck

Bất kỳ trợ giúp nói chung hoặc trong ví dụ cụ thể này sẽ là tuyệt vời.

Câu trả lời:


10

đ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à { 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 ) .dC2(xi)xiCψ=i=1ndC2(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 Cx i . Do đó φ = Σ n i = 1 | | xCXdC2(xi)Cxi .ϕ=i=1n||xic||2

l o g ( ψ ) = l o g ( 52.128 ) = 3.95 = 4 ( r o u n d e dψ=i=1nd2(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 CCC

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 iX , 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.wC0XxiXjCw[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)/j=1mwj

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 tôiog(ψ) lần, nhưng trong một thời gian nhất định.


bạn có thể vui lòng mở rộng câu trả lời của bạn với tính toán cho ví dụ của tôi không?
dùng1930254

Tôi là một lập trình viên, tôi nghĩ rằng tôi có thể viết mã đó nhanh hơn gõ vào đây :). Hy vọng nó giải thích được thuật toán.
rapaio 4/2/2015

Bạn có thể giải thích ý tưởng với số lần lặp log (Ksi) là gì không? Tôi không hiểu ý tưởng bên dưới nó, có vẻ như số lần lặp sẽ phụ thuộc vào phạm vi giá trị của các đối tượng, điều này có vẻ không hợp lý. Ví dụ: nếu các đối tượng có giá trị thuộc tính khoảng 1000, ví dụ, điều đó có thể dẫn đến lỗi là khoảng 1000, điều đó có nghĩa là sẽ có 3 lần lặp. Mặt khác, nếu các giá trị nằm trong phạm vi 10 có thể dẫn đến lỗi là khoảng 10 dẫn đến 1 lần lặp. Không nên số lần lặp phụ thuộc vào số lượng đối tượng?
Marko

@pera Tôi cập nhật câu trả lời để làm rõ vấn đề bạn nêu ra
rapaio

@rapaio Cảm ơn bạn đã trả lời, tôi đã tìm giải pháp sẽ xác định số lần lặp dựa trên số lượng medoid. Trong đó x có thể được tăng lên để có được khởi tạo tốt hơn với chi phí của một vài lần lặp nhiều hơn. Bạn có ổn không, dựa trên phần thứ hai mà bạn đã đưa ra? Cảm ơn, một lần nữa.
Marko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.