You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:07:19