使用肘部曲线计算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值?


回答:

我会发布这个,因为这是我目前能想到的最好的方法:

似乎使用沿曲线的第一导数范围的某个阈值可能会做得很好。这可以通过拟合样条曲线来实现:

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的点。请查看评论以获取更多信息。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注