Câu trả lời:
Một cách tiếp cận mang lại kết quả phù hợp hơn là K-nghĩa là ++ . Cách tiếp cận này thừa nhận rằng có lẽ có một sự lựa chọn tốt hơn về các vị trí trung tâm ban đầu hơn là chỉ định ngẫu nhiên đơn giản. Cụ thể, phương tiện K có xu hướng hoạt động tốt hơn khi các nhân giáp được gieo hạt theo cách không kết hợp chúng lại với nhau trong không gian.
Nói tóm lại, phương pháp như sau:
Lưu ý: nên được cập nhật khi thêm nhiều centroid. Nó nên được đặt là khoảng cách giữa một điểm dữ liệu và trọng tâm gần nhất.
Bạn cũng có thể quan tâm để đọc bài viết này đề xuất phương pháp và mô tả hiệu suất dự kiến tổng thể của nó.
Tôi có thể đang hiểu nhầm câu hỏi của bạn, nhưng thông thường k-nghĩa là chọn ngẫu nhiên trọng tâm của bạn cho bạn tùy thuộc vào số lượng cụm bạn đặt (ví dụ: k). Chọn số cho k có xu hướng là một bài tập chủ quan. Một nơi tốt để bắt đầu là một âm mưu Elbow / Scree có thể được tìm thấy ở đây:
http://en.wikipedia.org/wiki/Determining_the_number_of_clustftimein_a_data_set#The_Elbow_Method
Cách tiếp cận thông thường cho vấn đề này là chạy lại thuật toán K-mean của bạn nhiều lần, với các khởi tạo ngẫu nhiên khác nhau của centroid và để giữ giải pháp tốt nhất. Bạn có thể làm điều đó bằng cách đánh giá kết quả trên dữ liệu đào tạo của bạn hoặc bằng phương thức xác nhận chéo.
Có nhiều cách khác để khởi tạo centroid, nhưng không có cách nào trong số chúng sẽ thực hiện tốt nhất cho mọi vấn đề. Bạn có thể đánh giá các phương pháp này cùng với khởi tạo ngẫu nhiên cho vấn đề cụ thể của bạn.
Tôi đồng ý với âm mưu Elbow / Scree. Tôi thấy nó hợp lý hơn bằng một hạt giống ngẫu nhiên. Đây là một mã ví dụ để thử nó.
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)