如何在Python中用手肘法获取并返回最优聚类数目?
Python实现手肘法(Elbow Method):绘图+最优聚类数返回
手肘法的核心是追踪不同聚类数k对应的误差平方和(SSE)——当k增大到某个值后,SSE的下降幅度会突然放缓,这个"拐点"对应的k就是最优聚类数。下面是完整实现,既能生成手肘图,又能返回最优k值:
完整代码
import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs def elbow_method(X, max_k=10): sse = [] # 遍历不同聚类数,计算SSE for k in range(1, max_k+1): kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(X) sse.append(kmeans.inertia_) # inertia_属性直接返回SSE # 绘制手肘图 plt.figure(figsize=(8, 4)) plt.plot(range(1, max_k+1), sse, 'bo-') plt.xlabel('聚类数 k') plt.ylabel('误差平方和(SSE)') plt.title('手肘法确定最优聚类数') plt.grid(True) plt.show() # 自动计算最优k:通过二阶导数找SSE下降速率骤减的拐点 sse_diff = np.diff(sse) # 一阶导数:相邻SSE的差值 sse_diff2 = np.diff(sse_diff) # 二阶导数:差值的变化率 optimal_k = np.argmax(sse_diff2) + 2 # 索引偏移修正 return optimal_k # 示例:生成测试数据(可替换为自己的数据集) X, _ = make_blobs(n_samples=300, centers=4, random_state=42) # 调用函数获取结果 best_k = elbow_method(X, max_k=10) print(f"最优聚类数为: {best_k}")
关键细节说明
- SSE计算:
KMeans的inertia_属性直接返回所有样本到其所属聚类中心的距离平方和,无需手动实现计算逻辑。 - 手肘图解读:折线图中"手肘"位置(SSE突然减速下降的点)就是最优聚类数的直观体现。
- 自动找最优k:通过二阶导数定位拐点——二阶导数的最大值对应SSE下降速率变化最剧烈的位置,修正索引后得到最优k。如果数据拐点不明显,可调整
max_k或结合图表手动选取。
自定义适配
- 将代码中的
X替换为你的业务数据集(需为数值型矩阵)。 - 根据数据规模调整
max_k参数,设置合理的聚类数测试上限。
内容的提问来源于stack exchange,提问作者Mikelenjilo
相关产品推荐
相关产品推荐

