จุดข้อมูล: (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)คือผลรวมของทั้งหมดที่มีขนาดเล็กที่สุดในระยะทาง 2 บรรทัดฐาน (ระยะทางยุคลิด) จากทุกจุดจากชุดทุกจุดจาก{C} ในคำอื่น ๆ สำหรับจุดในแต่ละหาระยะทางไปยังจุดที่ใกล้ที่สุดในในการคำนวณท้ายที่สุดผลรวมของระยะทางที่น้อยที่สุดผู้หนึ่งสำหรับจุดในแต่ละXXCXCX
แสดงว่ามีเป็นระยะทางจากไปยังจุดที่ใกล้ที่สุดใน{C} แล้วเรามี(x_i)d2C(xi)xiCψ=∑ni=1d2C(xi)
ในขั้นตอนที่ 2มีองค์ประกอบเดียว (ดูขั้นตอนที่ 1) และคือชุดขององค์ประกอบทั้งหมด ดังนั้นในขั้นตอนนี้เป็นเพียงระยะห่างระหว่างจุดในและx_iดังนั้น2}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)
อย่างไรก็ตามโปรดทราบว่าในขั้นตอนที่ 3 จะใช้สูตรทั่วไปเนื่องจากจะมีมากกว่าหนึ่งจุดC
ขั้นตอนที่ 3:
สำหรับวงจะถูกดำเนินการสำหรับคำนวณก่อนหน้านี้log(ψ)
ภาพวาดไม่เหมือนที่คุณเข้าใจ ภาพวาดมีความเป็นอิสระซึ่งหมายความว่าคุณจะดำเนินการวาดสำหรับจุดในแต่ละXดังนั้นสำหรับจุดในแต่ละ , แสดงเป็นคำนวณความน่าจะเป็นจาก{C}) ที่นี่คุณมีเป็นปัจจัยให้เป็นพารามิเตอร์เป็นระยะทางไปยังศูนย์ที่ใกล้เคียงที่สุดและจะมีการอธิบายในขั้นตอนที่ 2XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C)
อัลกอริทึมเป็นเพียง:
- วนซ้ำในเพื่อค้นหาทั้งหมดXxi
- สำหรับแต่ละคำนวณxipxi
- สร้างหมายเลขเครื่องแบบใน , ถ้าเล็กกว่าให้เลือกมันเพื่อสร้าง[0,1]pxiC′
- หลังจากที่คุณวาดเสร็จแล้วรวมคะแนนที่เลือกจากเป็นC′C
โปรดทราบว่าในแต่ละขั้นตอนที่ 3 ดำเนินการซ้ำ (บรรทัดที่ 3 ของอัลกอริทึมดั้งเดิม) คุณคาดหวังที่จะเลือกจุดจาก (ซึ่งแสดงให้เห็นได้อย่างง่ายดายว่าสูตรการเขียนโดยตรงสำหรับการคาดหวัง)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:
ขั้นตอนวิธีการที่ง่ายสำหรับการที่จะสร้างเวกเตอร์ขนาดเท่ากับจำนวนขององค์ประกอบในและเริ่มต้นค่าทั้งหมดที่มี0ตอนนี้ย้ำใน (องค์ประกอบไม่ได้เลือกเป็น centroids) และสำหรับแต่ละค้นหาดัชนีของเซนทรอยด์ที่ใกล้เคียงที่สุด (องค์ประกอบจาก ) และเพิ่มขึ้นกับ1ในท้ายที่สุดคุณจะมีเวกเตอร์คำนวณอย่างถูกต้อง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:
พิจารณาน้ำหนักคำนวณในขั้นตอนก่อนหน้านี้คุณทำตามขั้นตอนวิธี kmeans ++ เพื่อเลือกเฉพาะเป็นจุดเริ่มต้น centroids ดังนั้นคุณจะดำเนินสำหรับลูปในแต่ละวงเลือกองค์ประกอบเดียวสุ่มมีโอกาสสำหรับแต่ละองค์ประกอบเป็นw_j} ในแต่ละขั้นตอนคุณเลือกองค์ประกอบหนึ่งและลบออกจากผู้สมัครนอกจากนี้ยังลบน้ำหนักที่สอดคล้องกัน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]
เห็นได้ชัดว่าขึ้นอยู่กับข้อมูลและปัญหาที่คุณยกมานั้นเป็นปัญหาจริงหากอัลกอริทึมจะถูกดำเนินการบนโฮสต์ / เครื่อง / คอมพิวเตอร์เครื่องเดียว อย่างไรก็ตามคุณต้องทราบว่าตัวแปรของการจัดกลุ่ม kmeans นี้มีไว้สำหรับปัญหาใหญ่และสำหรับการทำงานบนระบบแบบกระจาย ยิ่งผู้แต่งในย่อหน้าต่อไปนี้เหนือคำอธิบายอัลกอริทึมระบุสิ่งต่อไปนี้:log(ψ)
ขอให้สังเกตว่าขนาดของมีขนาดเล็กกว่าขนาดอินพุตอย่างมีนัยสำคัญ จึงสามารถทำได้อย่างรวดเร็ว reclustering ตัวอย่างเช่นใน MapReduce เนื่องจากจำนวนศูนย์มีขนาดเล็กจึงสามารถกำหนดให้กับเครื่องเดียวและอัลกอริทึมการประมาณที่พิสูจน์ได้ (เช่น k-หมายถึง ++) สามารถใช้เพื่อจัดกลุ่มคะแนนเพื่อให้ได้ศูนย์ k การใช้งาน MapReduce ของอัลกอริทึม 2 ถูกกล่าวถึงในส่วน 3.5 ในขณะที่อัลกอริทึมของเรานั้นง่ายมากและให้ยืมตัวเองไปสู่การใช้งานแบบขนานอย่างเป็นธรรมชาติ (ในรอบ) ส่วนที่ท้าทายคือการแสดงให้เห็นว่ามีการรับรองที่พิสูจน์ได้Clog(ψ)
สิ่งที่ควรทราบอีกอย่างคือหมายเหตุต่อไปนี้ในหน้าเดียวกันซึ่งระบุ:
ในทางปฏิบัติผลการทดลองของเราในส่วนที่ 5 แสดงให้เห็นว่ามีเพียงไม่กี่รอบเท่านั้นที่สามารถเข้าถึงวิธีแก้ปัญหาที่ดีได้
ซึ่งหมายความว่าคุณสามารถเรียกใช้อัลกอริทึมไม่ใช่สำหรับครั้ง แต่สำหรับเวลาคงที่ที่กำหนดlog(ψ)