K- หมายถึง: อะไรคือวิธีที่ดีในการเลือกชุดเซนทรอยด์เริ่มต้นที่มีประสิทธิภาพ


17

เมื่อมีการใช้งานการเริ่มต้นแบบสุ่มของ centroids การวิ่งที่ต่างกันของ K-mean จะสร้าง SSE รวมที่แตกต่างกัน และเป็นสิ่งสำคัญในประสิทธิภาพของอัลกอริทึม อะไรคือแนวทางที่มีประสิทธิภาพในการแก้ไขปัญหานี้? แนวทางล่าสุดได้รับการชื่นชม

คำตอบ:


12

วิธีการที่อัตราผลตอบแทนผลที่สอดคล้องกันมากขึ้นคือK-วิธี ++ วิธีนี้ยอมรับว่าอาจมีทางเลือกที่ดีกว่าสำหรับตำแหน่ง centroid เริ่มต้นที่ดีกว่าการสุ่มเลือกแบบง่าย K- หมายถึงมีแนวโน้มที่จะทำงานได้ดีขึ้นเมื่อเซนทรอยด์มีเมล็ดในลักษณะที่ไม่เกาะกลุ่มกันในอวกาศ

ในระยะสั้นวิธีการดังต่อไปนี้:

  1. เลือกหนึ่งในจุดข้อมูลของคุณโดยการสุ่มเป็นเซนทรอยด์เริ่มต้น
  2. คำนวณ , ระยะห่างระหว่างเซนทรอยด์ครั้งแรกของคุณและทุกจุดข้อมูลอื่นๆxD(x)x
  3. เลือกเซนทรอยด์ถัดไปของคุณจากดาต้าพอยน์ที่เหลือโดยมีความน่าจะเป็นเป็นสัดส่วนกับD(x)2
  4. ทำซ้ำจนกว่าเซนทรอยด์ทั้งหมดจะถูกกำหนด

หมายเหตุ: ควรปรับปรุงมีการเพิ่มเซนทรอยด์มากขึ้น มันควรจะตั้งเป็นระยะห่างระหว่างจุดข้อมูลและเซนทรอยด์ที่ใกล้ที่สุดD(x)

คุณอาจสนใจอ่านบทความนี้ที่เสนอวิธีการและอธิบายประสิทธิภาพโดยรวมที่คาดไว้


5

ฉันอาจจะเข้าใจผิดคำถามของคุณ แต่โดยปกติ k-mean จะเลือกเซนทรอยด์ของคุณแบบสุ่มสำหรับคุณขึ้นอยู่กับจำนวนของกลุ่มที่คุณตั้งค่า (เช่น k) การเลือกหมายเลขสำหรับ k มีแนวโน้มที่จะเป็นการออกกำลังกายแบบอัตนัย จุดเริ่มต้นที่ดีคือ Elbow / Scree plot ซึ่งสามารถพบได้ที่นี่:

http://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set#The_Elbow_Method


ฉันคิดว่าคำถามเกี่ยวกับการเริ่มต้น centroid ซึ่งเป็น {'k-mean ++', 'random' หรือ ndarray} ในหน้าเอกสารscikit-learn.org/stable/modules/generated/ ......
Itachi

4

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

มีวิธีอื่น ๆ อีกมากมายในการเริ่มต้น centroids แต่ไม่มีวิธีใดที่จะทำงานได้ดีที่สุดสำหรับทุกปัญหา คุณสามารถประเมินวิธีการเหล่านี้พร้อมกับการเริ่มต้นแบบสุ่มสำหรับปัญหาเฉพาะของคุณ


0

ฉันเห็นด้วยกับ Elbow / Scree plot ฉันพบว่ามันฉลาดกว่าสัญชาตญาณแบบสุ่มมากกว่า นี่คือตัวอย่างรหัสให้ลองใช้

Ks=30
mean_acc=np.zeros((Ks-1))
std_acc=np.zeros((Ks-1))
ConfustionMx=[];
for n in range(1,Ks):    
    #Train Model and Predict  
    kNN_model = KNeighborsClassifier(n_neighbors=n).fit(X_train,y_train)
    yhat = kNN_model.predict(X_test)
    mean_acc[n-1]=np.mean(yhat==y_test);
    std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])

plt.plot(range(1,Ks),mean_acc,'g')
plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)
plt.legend(('Accuracy ', '+/- 3xstd'))
plt.ylabel('Accuracy ')
plt.xlabel('Number of Nabors (K)')
plt.tight_layout()
plt.show()

print( "The best accuracy was with", mean_acc.max(), "with k=", mean_acc.argmax()+1)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.