SSE 误差平方和 (手肘法)

手肘法的核心指标是 SSE(sum of the squared errors,误差平方和)

K-means:如何确定 K - 图1

其中,C是第 i 个簇,p 是 C中的样本点,mi 是 C的质心(Ci中所有样本的均值),SSE 是所有样本的聚类误差,代表了聚类效果的好坏。

手肘法的核心思想是:随着聚类数 k 的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和 SSE 自然会逐渐变小。并且,当 k 小于真实聚类数时,由于 k 的增大会大幅增加每个簇的聚合程度,故 SSE 的下降幅度会很大,而当 k 到达真实聚类数时,再增加 k 所得到的聚合程度回报会迅速变小,所以 SSE 的下降幅度会骤减,然后随着 k 值的继续增大而趋于平缓,也就是说 SSE 和 k 的关系图是一个手肘的形状,而这个肘部对应的 k 值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

image.png

做法:

  • 让 k 从 1 开始取值,知道合适的上限(这个上限需要人为确定,比如 8)。
  • 对每一个 k 进行聚类,生成对应的 SSE,画出关系图。
  • 选取最佳 k。
  1. import pandas as pd
  2. from sklearn.cluster import KMeans
  3. import matplotlib.pyplot as plt
  4. df_features = pd.read_csv(r'C:\预处理后数据.csv',encoding='gbk') # 读入数据
  5. '利用SSE选择k'
  6. SSE = [] # 存放每次结果的误差平方和
  7. for k in range(1,9):
  8. estimator = KMeans(n_clusters=k) # 构造聚类器
  9. estimator.fit(df_features[['R','F','M']])
  10. SSE.append(estimator.inertia_)
  11. X = range(1,9)
  12. plt.xlabel('k')
  13. plt.ylabel('SSE')
  14. plt.plot(X,SSE,'o-')

image.png

显然,肘部对于的k值为4,故对于这个数据集的聚类而言,最佳聚类数应该选4。

参考文献:
https://blog.csdn.net/qq_15738501/article/details/79036255