K-均值:选择有效的初始质心的一些好的方法是什么?


17

当使用质心的随机初始化时,不同的K均值运行会产生不同的总SSE。这对于算法的性能至关重要。解决此问题的有效方法有哪些?人们赞赏最近的方法。

Answers:


12

产生更一致结果的方法是K-means ++。该方法承认,与简单随机分配相比,初始质心位置可能有更好的选择。具体来说,当质心以不会在空间中聚集在一起的方式播种时,K均值往往会表现更好。

简而言之,方法如下:

  1. 随机选择一个数据点作为初始质心。
  2. 计算,即初始质心与所有其他数据点之间的距离。dXX
  3. 从其余数据点中选择与成正比的下一个质心dX2
  4. 重复直到所有质心都已分配。

注意:随着添加更多的质心,应该更新。应将其设置为数据点与最近的质心之间的距离。dX

您可能也有兴趣阅读这篇提出该方法并描述其总体预期性能的论文。



4

解决此问题的常用方法是使用质心的不同随机初始化多次运行K-means算法,并保持最佳解决方案。您可以通过评估训练数据上的结果或通过交叉验证来做到这一点。

还有许多其他方法可以初始化质心,但是对于每种问题,它们都无法发挥最佳性能。您可以针对特定问题评估这些方法以及随机初始化。


0

我同意弯头/螺丝的情节。我发现它比随机种子更直观直观。这是尝试的示例代码。

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.