K-วิธี || K-Means ++ ที่ปรับขนาดได้


12

Bahman Bahmani และคณะ แนะนำ k-mean || ซึ่งเป็นเวอร์ชั่นที่เร็วกว่าของ k-mean ++

การเริ่มต้นของ k- หมายถึง ||

อัลกอริทึมนี้นำมาจากหน้า 4 ของกระดาษ , Bahmani, B. , Moseley, B. , Vattani, A. , Kumar, R. , และ Vassilvitskii, S. (2012) ปรับขนาด k- หมายถึง ++ การดำเนินการของ VLDBเอ็นดาวเม้นท์, 5 (7), 622-633

น่าเสียดายที่ฉันไม่เข้าใจตัวอักษรกรีกแฟนซีเหล่านั้นดังนั้นฉันต้องการความช่วยเหลือในการทำความเข้าใจวิธีการทำงานของมัน เท่าที่ฉันเข้าใจอัลกอริทึมนี้เป็นรุ่นปรับปรุงของ k-หมายถึง ++ และใช้การสุ่มตัวอย่างเพื่อลดจำนวนการทำซ้ำ: k-หมายถึง ++ ต้องทำซ้ำคูณโดยที่คือจำนวนคลัสเตอร์ที่ต้องการkk

ฉันได้คำอธิบายที่ดีมากผ่านตัวอย่างที่เป็นรูปธรรมเกี่ยวกับการทำงานของ k-mean ++ ดังนั้นฉันจะใช้ตัวอย่างเดียวกันอีกครั้ง

ตัวอย่าง

ฉันมีชุดข้อมูลต่อไปนี้:

(7,1), (3,4), (1,5), (5,8), (1,3), (7,8), (8,2), (5,9), (8 , 0)

k=3 (จำนวนกลุ่มที่ต้องการ)

=2 (ปัจจัยการสุ่มตัวอย่าง)

ตัวอย่างชุดข้อมูลสำหรับ k-mean ||

ฉันเริ่มคำนวณ แต่ฉันไม่แน่ใจว่าฉันทำถูกแล้วและไม่มีความคิดเกี่ยวกับขั้นตอนที่ 2, 4 หรือ 5

  • ขั้นตอนที่ 1:สุ่มตัวอย่างแบบสุ่มจากจุดที่CX

    สมมุติว่าเซนทรอยด์แรกคือ (เหมือนกับ k-หมายถึง ++)(8,0)

  • ขั้นตอนที่ 2:ψϕX(C)

    ไม่มีความเห็น

  • ขั้นตอนที่ 3:

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

      เราคำนวณระยะทางกำลังสองไปยังศูนย์กลางที่ใกล้ที่สุดไปยังแต่ละจุด ในกรณีนี้เรามีเพียงหนึ่งศูนย์เพื่อให้ห่างไกล(8,0)(8,0)

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

      (เพราะในกรณีนี้)=2

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

      เลือกสุ่มตัวเลขในช่วง813) สมมติว่าคุณเลือกและ659.42พวกเขาตกอยู่ในช่วงและซึ่งสอดคล้องกับรายการที่ 4 และ 8 ตามลำดับ=2[0,813)246.90659.42[379,495)[633,813)

    • ทำซ้ำครั้ง แต่ (คำนวณในขั้นตอนที่ 2) ในกรณีนี้คืออะไร? O(logψ)ψ

  • ขั้นตอนที่ 4: สำหรับชุดจะเป็นจำนวนจุดในใกล้ชิดกับกว่าจุดอื่น ๆ ใน{C}xCwxXxC
  • ขั้นตอนที่ 5: สรุปคะแนนถ่วงน้ำหนักในไปยังกลุ่มCk

ความช่วยเหลือใด ๆ โดยทั่วไปหรือในตัวอย่างนี้จะดีมาก

คำตอบ:


10

จุดข้อมูล: (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)dC2(xi)xiCψ=i=1ndC2(xi)

ในขั้นตอนที่ 2มีองค์ประกอบเดียว (ดูขั้นตอนที่ 1) และคือชุดขององค์ประกอบทั้งหมด ดังนั้นในขั้นตอนนี้เป็นเพียงระยะห่างระหว่างจุดในและx_iดังนั้น2}CXdC2(xi)Cxiϕ=i=1n||xic||2

ψ=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)

อย่างไรก็ตามโปรดทราบว่าในขั้นตอนที่ 3 จะใช้สูตรทั่วไปเนื่องจากจะมีมากกว่าหนึ่งจุดC

ขั้นตอนที่ 3:

สำหรับวงจะถูกดำเนินการสำหรับคำนวณก่อนหน้านี้log(ψ)

ภาพวาดไม่เหมือนที่คุณเข้าใจ ภาพวาดมีความเป็นอิสระซึ่งหมายความว่าคุณจะดำเนินการวาดสำหรับจุดในแต่ละXดังนั้นสำหรับจุดในแต่ละ , แสดงเป็นคำนวณความน่าจะเป็นจาก{C}) ที่นี่คุณมีเป็นปัจจัยให้เป็นพารามิเตอร์เป็นระยะทางไปยังศูนย์ที่ใกล้เคียงที่สุดและจะมีการอธิบายในขั้นตอนที่ 2XXxipx=ld2(x,C)/ϕX(C)ld2(x,C)ϕX(C)

อัลกอริทึมเป็นเพียง:

  • วนซ้ำในเพื่อค้นหาทั้งหมดXxi
  • สำหรับแต่ละคำนวณxipxi
  • สร้างหมายเลขเครื่องแบบใน , ถ้าเล็กกว่าให้เลือกมันเพื่อสร้าง[0,1]pxiC
  • หลังจากที่คุณวาดเสร็จแล้วรวมคะแนนที่เลือกจากเป็นCC

โปรดทราบว่าในแต่ละขั้นตอนที่ 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ในท้ายที่สุดคุณจะมีเวกเตอร์คำนวณอย่างถูกต้อง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]++;
}

ขั้นตอนที่ 5:

พิจารณาน้ำหนักคำนวณในขั้นตอนก่อนหน้านี้คุณทำตามขั้นตอนวิธี kmeans ++ เพื่อเลือกเฉพาะเป็นจุดเริ่มต้น centroids ดังนั้นคุณจะดำเนินสำหรับลูปในแต่ละวงเลือกองค์ประกอบเดียวสุ่มมีโอกาสสำหรับแต่ละองค์ประกอบเป็นw_j} ในแต่ละขั้นตอนคุณเลือกองค์ประกอบหนึ่งและลบออกจากผู้สมัครนอกจากนี้ยังลบน้ำหนักที่สอดคล้องกัน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)
  ... 
}  

ขั้นตอนก่อนหน้านี้ทั้งหมดดำเนินการต่อเช่นเดียวกับในกรณีของ kmeans ++ โดยมีโฟลว์การไหลของอัลกอริทึมการจัดกลุ่มตามปกติ

ฉันหวังว่าชัดเจนตอนนี้

[ภายหลังแก้ไขภายหลัง]

ฉันยังพบงานนำเสนอที่เขียนโดยผู้เขียนซึ่งคุณไม่สามารถระบุได้อย่างชัดเจนว่าในแต่ละการทำซ้ำอาจมีการเลือกหลายจุด นำเสนอเป็นที่นี่

[แก้ไขในภายหลังของ @ pera]

เห็นได้ชัดว่าขึ้นอยู่กับข้อมูลและปัญหาที่คุณยกมานั้นเป็นปัญหาจริงหากอัลกอริทึมจะถูกดำเนินการบนโฮสต์ / เครื่อง / คอมพิวเตอร์เครื่องเดียว อย่างไรก็ตามคุณต้องทราบว่าตัวแปรของการจัดกลุ่ม kmeans นี้มีไว้สำหรับปัญหาใหญ่และสำหรับการทำงานบนระบบแบบกระจาย ยิ่งผู้แต่งในย่อหน้าต่อไปนี้เหนือคำอธิบายอัลกอริทึมระบุสิ่งต่อไปนี้:log(ψ)

ขอให้สังเกตว่าขนาดของมีขนาดเล็กกว่าขนาดอินพุตอย่างมีนัยสำคัญ จึงสามารถทำได้อย่างรวดเร็ว reclustering ตัวอย่างเช่นใน MapReduce เนื่องจากจำนวนศูนย์มีขนาดเล็กจึงสามารถกำหนดให้กับเครื่องเดียวและอัลกอริทึมการประมาณที่พิสูจน์ได้ (เช่น k-หมายถึง ++) สามารถใช้เพื่อจัดกลุ่มคะแนนเพื่อให้ได้ศูนย์ k การใช้งาน MapReduce ของอัลกอริทึม 2 ถูกกล่าวถึงในส่วน 3.5 ในขณะที่อัลกอริทึมของเรานั้นง่ายมากและให้ยืมตัวเองไปสู่การใช้งานแบบขนานอย่างเป็นธรรมชาติ (ในรอบ) ส่วนที่ท้าทายคือการแสดงให้เห็นว่ามีการรับรองที่พิสูจน์ได้Clog(ψ)

สิ่งที่ควรทราบอีกอย่างคือหมายเหตุต่อไปนี้ในหน้าเดียวกันซึ่งระบุ:

ในทางปฏิบัติผลการทดลองของเราในส่วนที่ 5 แสดงให้เห็นว่ามีเพียงไม่กี่รอบเท่านั้นที่สามารถเข้าถึงวิธีแก้ปัญหาที่ดีได้

ซึ่งหมายความว่าคุณสามารถเรียกใช้อัลกอริทึมไม่ใช่สำหรับครั้ง แต่สำหรับเวลาคงที่ที่กำหนดlog(ψ)


คุณช่วยขยายคำตอบของคุณด้วยการคำนวณสำหรับตัวอย่างของฉันได้ไหม
user1930254

ฉันเป็นโปรแกรมเมอร์ฉันคิดว่าฉันสามารถเขียนในรหัสได้เร็วกว่าการพิมพ์ที่นี่ :) หวังว่ามันจะอธิบายอัลโก
rapaio

คุณช่วยอธิบายความคิดด้วยจำนวนการบันทึกซ้ำ (Ksi) ได้ไหม? ฉันไม่เข้าใจความคิดด้านล่างดูเหมือนว่าจำนวนการวนซ้ำจะขึ้นอยู่กับช่วงของค่าของวัตถุซึ่งดูเหมือนจะไม่สมเหตุสมผล ตัวอย่างเช่นหากวัตถุมีค่าคุณลักษณะประมาณ 1,000 ตัวอย่างเช่นนั้นอาจทำให้เกิดข้อผิดพลาดประมาณ 1,000 ซึ่งหมายความว่าจะมีการวนซ้ำ 3 ครั้ง ในทางกลับกันหากค่าอยู่ในช่วง 10 ซึ่งอาจส่งผลให้เกิดข้อผิดพลาดประมาณ 10 ซึ่งส่งผลให้เกิดซ้ำ 1 จำนวนการทำซ้ำไม่ควรขึ้นอยู่กับจำนวนวัตถุหรือไม่
Marko

@pera ฉันอัปเดตคำตอบเพื่อชี้แจงปัญหาที่คุณยกขึ้น
rapaio

@rapaio ขอบคุณสำหรับคำตอบของคุณฉันจะไปหาทางออกที่จะกำหนดจำนวนการทำซ้ำตามจำนวนของยา โดยที่ x สามารถเพิ่มได้เพื่อให้การเริ่มต้นดีขึ้นด้วยค่าใช้จ่ายของการทำซ้ำสองสามรายการที่มากกว่า คุณสบายดีหรือเปล่าที่เป็นไปตามส่วนที่สองที่คุณให้ไว้? ขอบคุณอีกครั้ง.
Marko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.