首页 > 解决方案 > 用肘曲线计算 K-means 聚类中的最佳 K 值

问题描述

我用各种 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?

标签: pythonmachine-learningscikit-learnartificial-intelligence

解决方案


我会发布这个,因为这是迄今为止我想出的最好的:

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

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

惯性曲线的一阶导数

然后,您可能可以通过这条曲线的 90% 来定义 k。我想这是一种非常一致的方法,但可能有更好的选择。


推荐阅读