用肘曲线计算K均值聚类中的最佳K值

时间:2020-08-27 18:17:31

标签: python machine-learning scikit-learn artificial-intelligence

我用各种k值进行了K均值聚类,并得出了每个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)

inertia graph, which is an elbow plot

根据我的阅读,最佳k值位于该图的“弯头”处,但是弯头的计算已被证明是难以捉摸的。您如何以编程方式使用此数据来计算k?

1 个答案:

答案 0 :(得分:0)

我将发布它,因为这是我到目前为止提出的最好的结果:

似乎使用一些阈值缩放到曲线的一阶导数范围可能会做得很好。这可以通过拟合样条曲线来完成:

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))

first derivative of the inertia curve

然后,您可能可以按此曲线的90%定义k。我想这是一种相当一致的方法,但是可能会有更好的选择。