聚类的k值确定之轮廓系数

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 聚类的k值确定之轮廓系数

我们在做聚类分析的时候,有时候比较困惑的是如何确定最佳聚类簇数,比如k-means的k到底取多少?比较流行的方法是用手肘法,观察SSE的拐点处,这个需要通过直观观察去判定,人的直观判定总是会存在误差。

轮廓系数是判定聚类的k值比较好的一个指标,它是聚类效果好坏的一种评价方式。最早由Peter J. Rousseeuw在1986提出,它结合内聚度和分离度两种因素,可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。

轮廓系数公式

轮廓系数的概念和公式

轮廓系数用于衡量聚类结果的紧密度和分离度。轮廓系数的公式为:

s = (b-a)/max(a,b),

假设我们已经通过一定算法,将待分类数据进行了聚类。常用的比如使用K-means ,将待分类数据分为了 k 个簇 。对于簇中的每组向量数据,分别计算它们的轮廓系数。 对于其中的一个点 i 来说:计算 a(i)=average(i向量到所有它属于的簇中其它点的距离)

  • 计算 b(i) =min(i向量到某一不包含它的簇内的所有点的平均距离)。
  • 其中,a是簇内不相似度的平均值,称为内聚度;b是簇间不相似度的平均值,称为分离度。
  • 最后计算每个向量数据的轮廓系数,并求平均值就是整个模型分类后的轮廓系数。

轮廓系数的意义

可根据轮廓系数的大小判定,分类的结果的合理性。

  • 轮廓系数的值在-1到1之间,值越大表示聚类结果越好。
  • 当值为负数时,表示聚类结果不佳,数据点更适合被分配到其他簇。
  • 当值接近0时,表示聚类结果不明显,数据点的分配可能不太合理。
  • 当值接近1时,表示聚类结果很好,数据点与所在簇的其他数据点很相似,与其他簇的数据点很不相似。

kmeans算法流程

  • 1、选择K个点作为初始质心。
  • 2、将每个点指派到最近的质心,形成K个簇。
  • 3、对于上一步聚类的结果,进行平均计算,得出该簇的新的聚类中心。
  • 4、重复上述两步/直到迭代结束:质心不发生变化。

轮廓系数计算

直接调包计算

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import numpy as np
# 生成数据集
np.random.seed(1)
X= np.random.uniform(1,10, size=(50, 2))
# 定义不同的K值进行聚类
for k in range(2, 8):
   kmeans = KMeans(n_clusters=k, random_state=42)
   kmeans.fit(X)
   labels = kmeans.labels_
   # 计算轮廓系数
   score = silhouette_score(X, labels)
   print(f"K={k}, 轮廓系数={score:.2f}")

输出结果

sklearn里有自己的函数silhouette_score可以直接计算轮廓系数。根据结果是k=3轮廓系数最大,因此建议分3类。

手工计算

为了更清楚的了解轮廓系数原理,现在手动编写轮廓系数的计算过程,还是以kmeans每次最后聚类的结果数据为输入数据,计算轮廓系数。

1)内聚度

a=np.sum([np.linalg.norm(X[m] - center) for center in X[a11[j]]])/(len(a11[j])-1)

2)分离度

##轮廓系数b的计算
c=[]#存储平均数据
for j2 in arr_1:
   c1=np.sum([np.linalg.norm(X[m] - center) for center in X[a11[j2]]])/(len(a11[j2]))
   c.append(c1)
b=min(c)

3)每个点的轮廓系数

s.append((b-a)/max(a,b))#把每点轮廓系数都存储起来,后续对s求平均值即可

4)完整代码及输出

可以观察到,结果跟kmeans调包计算的轮廓系数结果一致。当然轮廓系数也有一些缺点:比如对于簇结构为凸的数据轮廓系数值高,而对于簇结构非凸需要使用DBSCAN进行聚类的数据,轮廓系数值低,因此,不同聚类算法之间不应该以轮廓系数来评价。

目录
相关文章
|
6月前
|
SDN Python
轮廓的近似多边形
【6月更文挑战第11天】轮廓的近似多边形。
54 4
|
数据挖掘
kmeans聚类质心个数选取的10种方式
kmeans聚类质心个数选取的10种方式
157 0
|
数据挖掘 计算机视觉 索引
使用K均值聚类自动分割颜色
说明如何使用 K 均值聚类自动分割颜色。聚类是一种分离对象组的方法。K 均值聚类将每个对象视为在空间中有一个位置。它将对象划分为若干分区,使每个簇中的对象尽可能彼此靠近,并尽可能远离其他簇中的对象。您可以使用 函数将图像像素按值分成一个颜色空间内的若干个簇。此示例在 RGB 和 L*a*b* 颜色空间中执行图像的 k 均值聚类,以显示使用不同颜色空间如何改进分割结果。
184 0
|
7月前
[Halcon&拟合] 拟合直线边缘并计算距离
[Halcon&拟合] 拟合直线边缘并计算距离
263 0
|
算法
插值与拟合的区别以及如何选取
插值与拟合的区别以及如何选取
384 0
|
数据挖掘
19 误差分布曲线的建立 - 高斯导出误差正态分布
19 误差分布曲线的建立 - 高斯导出误差正态分布
71 0
|
机器学习/深度学习 算法
为什么要对数值类型特征做归一化?
为什么要对数值类型特征做归一化?
|
人工智能
求矩阵的局部极大值
求矩阵的局部极大值
124 0
|
机器学习/深度学习 算法 数据挖掘
聚类练习:对地理数据应用二分k-均值算法聚类
聚类练习:对地理数据应用二分k-均值算法聚类
275 0
聚类练习:对地理数据应用二分k-均值算法聚类