聚类算法评估指标_SSE 代码实现
本文会介绍SSE的概念以及如何通过SSE这个指标来寻找聚类算法的最优k值
一、误差平方和SSE的定义
\[SSE = \sum_{i=1}^{k}\sum_{p \in C_i} \left| p - m_i \right|^2
\]
- \(C_i\) 表示簇
- \(k\) 表示聚类中心的个数
- \(p\) 表示某个簇内的样本
- \(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()

浙公网安备 33010602011771号