使用肘曲线计算 K 均值聚类中的最佳 K 值
Calculating optimal K value in K-means clustering with elbow curve
我用各种 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)
根据我的阅读,最佳 k 值位于该图的 'elbow' 处,但肘部的计算已证明是难以捉摸的。您如何以编程方式使用此数据来计算 k?
我会 post 这个,因为这是我迄今为止想出的最好的:
似乎使用一些按比例缩放到沿曲线的一阶导数范围的阈值可能会做得很好。这可以通过拟合样条曲线来完成:
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%。我想这是一种非常一致的方法,但可能有更好的选择。
我用各种 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)
根据我的阅读,最佳 k 值位于该图的 'elbow' 处,但肘部的计算已证明是难以捉摸的。您如何以编程方式使用此数据来计算 k?
我会 post 这个,因为这是我迄今为止想出的最好的:
似乎使用一些按比例缩放到沿曲线的一阶导数范围的阈值可能会做得很好。这可以通过拟合样条曲线来完成:
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%。我想这是一种非常一致的方法,但可能有更好的选择。