聚类算法评估指标_SSE 代码实现

本文会介绍SSE的概念以及如何通过SSE这个指标来寻找聚类算法的最优k值

一、误差平方和SSE的定义

\[SSE = \sum_{i=1}^{k}\sum_{p \in C_i} \left| p - m_i \right|^2 \]

  1. \(C_i\) 表示簇
  2. \(k\) 表示聚类中心的个数
  3. \(p\) 表示某个簇内的样本
  4. \(m_i\) 表示质心点

SSE 越小,表示数据点越接近它们的中心,聚类效果越好

二、“肘”方法 - K值确定

  • "肘"方法通过 SSE 确定 n_clusters 的值
  • 对于\(n\)个点的数据集,迭代计算 \(k\)\(1\)\(n\),每次聚类完成后计算 SSE
  • SSE 会逐渐变小,当 \(k=n\) 时每个样本点自成一簇,SSE 降为 0
  • SSE 变化曲线中会出现一个拐点,当SSE下降速率突然变缓时,对应的\(k\)即为最佳聚类数 n_clusters
  • 该方法同样可用于判断何时停止增加聚类类别:当继续增加簇的数量无法让SSE大幅下降、模型收益不再明显时,就停止新增类别,避免引入噪声造成过拟合。

三、代码实现

1.导入相关的库

import os
os.environ['OMP_NUM_THREADS'] = '4' # 设置OMP程序运行时使用的线程数
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.metrics import calinski_harabasz_score

2.定义函数,演示:SSE+肘部法

def dm01_sse():
    # 1. 定义sse列表,记录:每个K值的SSE值
    sse_list = []

    # 2.生成数据集. 参1:样本数量;参2:特征数量;参3:4个簇;参4:标准差
    x,y = make_blobs(
        n_samples=1000,
        n_features=2,
        centers=[[-1,-1],[0,0],[1,1],[2,3]],
        cluster_std=[0.4,0.2,0.2,0.2],
        random_state=23
    )
    # 3.for 训练遍历,获取到每个K值,计算其对应的sse值,并添加到sse_list列表中
    for k in range(1,100):
        # 3.1 创建Kmeans对象.参1:簇的数量;参2:最大迭代次数;参3:固定的随机数种子
        estimator = KMeans(n_clusters=k,max_iter=100,random_state=23)
        # 3.2 训练模型
        estimator.fit(x)
        # 3.3 模型预测
        # 3.4 获取每个簇的sse值
        sse_value = estimator.inertia_
        # 3.5 将每个k值对应的sse值,添加到sse_list列表中
        sse_list.append(sse_value)
    # 4.绘制SSE曲线-->数据可视化
    # 4.1 创建画布,指定:画布的尺寸
    plt.figure(figsize=(20,10))
    # 4.2 设置标题
    plt.title('sse value')
    # 4.3 设置x的刻度
    plt.xticks(range(0,100,3))
    # 4.4 添加x轴,y轴的标签
    plt.xlabel('k')
    plt.ylabel('sse')
    # 4.5 绘制网格
    plt.grid()
    # 4.6 绘制折线图
    # 参1:k值;参2:该k值对应的sse值
    plt.plot(range(1,100),sse_list)
    # 4.7 显示图像
    plt.show()

3.运行该函数

dm01_sse()
posted @ 2026-06-27 16:12  王新文  阅读(8)  评论(0)    收藏  举报