我对不同的K值进行了K-means聚类,并得到了每个K值的惯性(据我所知,惯性是所有聚类的标准差之和)
ks = range(1,30)inertias = []for k in ks: km = KMeans(n_clusters=k).fit(trialsX) inertias.append(km.inertia_) plt.plot(ks,inertias)
根据我的阅读,最佳K值位于此图的“肘部”,但计算肘部的方法一直难以捉摸。如何使用这些数据以编程方式计算K值?
回答:
我会发布这个,因为这是我目前能想到的最好的方法:
似乎使用沿曲线的第一导数范围的某个阈值可能会做得很好。这可以通过拟合样条曲线来实现:
y_spl = UnivariateSpline(ks,inertias,s=0,k=4)x_range = np.linspace(ks[0],ks[-1],1000)y_spl_1d = y_spl.derivative(n=1)plt.plot(x_range,y_spl_1d(x_range))
然后,您可以定义K值,例如曲线上升到90%的位置。我认为这是一种相当一致的方法,但可能有更好的选择。
编辑:两年后,只需使用np.diff生成此图,而无需拟合样条曲线,然后找到斜率等于-1的点。请查看评论以获取更多信息。