जवाबों:
एक दृष्टिकोण जो अधिक सुसंगत परिणाम देता है वह है K-Mean ++ । यह दृष्टिकोण स्वीकार करता है कि सरल यादृच्छिक असाइनमेंट की तुलना में प्रारंभिक सेंट्रोइड स्थानों का एक बेहतर विकल्प है। विशेष रूप से, K- साधन बेहतर प्रदर्शन करने के लिए जाता है जब सेंट्रोइड्स को इस तरह से बीज दिया जाता है जो उन्हें अंतरिक्ष में एक साथ नहीं टकराते हैं।
संक्षेप में, विधि इस प्रकार है:
नोट: को अपडेट किया जाना चाहिए क्योंकि अधिक केन्द्रक जोड़े जाते हैं। इसे डेटा बिंदु और निकटतम सेंट्रोइड के बीच की दूरी तय करनी चाहिए।
आप इस पेपर को पढ़ने के लिए भी इच्छुक हो सकते हैं जो विधि का प्रस्ताव करता है और इसके समग्र अपेक्षित प्रदर्शन का वर्णन करता है।
मैं आपके प्रश्न का गलत अर्थ लगा सकता हूं, लेकिन आमतौर पर के-साधन आपके द्वारा सेट किए गए समूहों की संख्या (यानी के) के आधार पर आपके लिए यादृच्छिक रूप से आपके सेंट्रोइड्स को चुनता है। कश्मीर के लिए संख्या का चयन एक व्यक्तिपरक अभ्यास है। शुरू करने के लिए एक अच्छी जगह एक एल्बो / स्क्री प्लॉट है जो यहां पाया जा सकता है:
http://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set#The_Elbow_Method
इस समस्या के बारे में सामान्य दृष्टिकोण कई बार अपने K- साधन एल्गोरिथ्म को फिर से चलाना है, केन्द्रक के विभिन्न यादृच्छिक आरंभीकरण के साथ, और सबसे अच्छा समाधान रखने के लिए। आप अपने प्रशिक्षण डेटा पर या क्रॉस सत्यापन के माध्यम से परिणामों का मूल्यांकन करके ऐसा कर सकते हैं।
सेंट्रोइड्स को शुरू करने के कई अन्य तरीके हैं, लेकिन उनमें से कोई भी हर एक समस्या के लिए सबसे अच्छा प्रदर्शन करने वाला नहीं है। आप अपनी विशिष्ट समस्या के लिए यादृच्छिक आरंभ के साथ इन दृष्टिकोणों का मूल्यांकन कर सकते हैं।
मैं एल्बो / स्क्री प्लॉट से सहमत हूं। मुझे यह एक यादृच्छिक बीज की तुलना में अधिक सहज ज्ञान युक्त समझदार लगा। इसे आज़माने के लिए एक उदाहरण कोड है।
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)