当前位置: 首页 > news >正文

【漫话机器学习系列】143.轮廓系数(Silhouette Coefficient)

1. 轮廓系数的概述

轮廓系数(Silhouette Coefficient)是一种用于评估聚类质量的指标,衡量数据点在同一簇内的紧密度以及与其他簇的分离度。其值介于 -1 和 1 之间,数值越接近 1,表示聚类效果越好。

轮廓系数通常用于评估 K-means层次聚类(Hierarchical Clustering)等聚类方法的效果,帮助选择合适的聚类数目(如 k 值)。


2. 轮廓系数的数学定义

轮廓系数 S_c 的计算公式如下:

S_c = \frac{1}{n} \sum_{i=1}^{n} \frac{b_i - a_i}{\max(a_i, b_i)}

其中:

  • n:数据点的总数。
  • a_i:样本 i 到同簇内其他样本的平均距离(簇内紧密度)。
  • b_i:样本 i 到最近的其他簇的所有样本的平均距离(簇间分离度)。
  • \max(a_i, b_i) 确保数值归一化,使得 S_c​ 介于 −1 和 1 之间。

3. 轮廓系数的计算步骤

计算轮廓系数的主要步骤如下:

  1. 计算每个样本到同簇内其他样本的平均距离a_i):

    • 对于每个数据点 i,计算它与同一簇中其他所有点的欧几里得距离,并取平均值。
    • a_i 反映了簇内的紧密度,值越小表示簇内点之间距离越近。
  2. 计算每个样本到最近簇的平均距离b_i):

    • 对于数据点 i,找到最近的其他簇,计算它与该簇所有点的平均距离,记作 b_i
    • b_i​ 反映了簇之间的分离度,值越大表示该点与其他簇的距离更远。
  3. 计算轮廓系数

    • 对每个数据点 i,计算轮廓系数:

      S_i = \frac{b_i - a_i}{\max(a_i, b_i)}
    • 平均所有点的轮廓系数得到整个数据集的轮廓系数:

      S_c = \frac{1}{n} \sum_{i=1}^{n} S_i

4. 轮廓系数的取值范围及意义
  • Sc ≈ 1:说明样本距离自己的簇很近,但远离其他簇,表示聚类效果较好。
  • Sc ≈ 0:说明样本可能处于两个簇的边界,表示聚类效果一般。
  • Sc < 0:说明样本被错误地归类到某个簇,实际应该属于另一个簇,表示聚类效果较差。

示例:

  • 如果 S_c = 0.75,说明数据点紧密聚集在各自的簇内,并且远离其他簇,聚类效果较好。
  • 如果 S_c = 0.1,说明簇之间的分隔不清晰,可能需要调整簇的数量(如改变 k 值)。
  • 如果 S_c = -0.3,说明聚类效果很差,样本被错误归类,可能需要重新选择聚类方法或调整数据特征。

5. 轮廓系数的应用
(1) 选择最佳的聚类数目 k

在 K-means 聚类中,选择最优的簇数 k 是一个重要问题。可以通过计算不同 k 值下的轮廓系数,找到使得 S_c​ 最大的 k 值。

示例:

  • 计算不同 k 值的轮廓系数:

    k 值轮廓系数 S_c
    20.62
    30.75
    40.68
    50.52
    • 当 k = 3 时,S_c = 0.75 最大,说明 3 个簇是最优的选择。
(2) 评估聚类质量

在实际应用中,轮廓系数可以用于评估以下聚类方法的质量:

  • K-means 聚类
  • 层次聚类(Hierarchical Clustering)
  • DBSCAN 聚类
  • 高斯混合模型(Gaussian Mixture Model, GMM)
(3) 图像分割

在计算机视觉任务中,可以用轮廓系数评估不同算法(如 K-means 分割、超像素分割等)的效果。

(4) 社交网络分析

在社交网络社区检测中,轮廓系数可以衡量用户在各自社区内的归属感。


6. 轮廓系数的优缺点

优点:

  1. 直观性强:提供清晰的数值来衡量聚类质量。
  2. 无需监督:适用于无监督学习任务,无需真实标签。
  3. 适用于多种聚类方法:可用于 K-means、层次聚类等。

缺点:

  1. 计算成本高:需要计算所有点间的平均距离,在大数据集上计算复杂度较高。
  2. 对非球形簇效果较差:如果数据聚类结构是非凸的(如 DBSCAN),轮廓系数可能无法准确评估。

7. Python 代码示例
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.datasets import make_blobs

# 生成数据
X, y = make_blobs(n_samples=500, centers=3, cluster_std=1.0, random_state=42)

# 进行 K-means 聚类
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)

# 计算轮廓系数
sc = silhouette_score(X, labels)
print(f"轮廓系数: {sc:.4f}")

运行结果 

轮廓系数: 0.8438


8. 结论

  • 轮廓系数(Silhouette Coefficient) 是衡量聚类质量的重要指标。
  • 计算公式:S_c = \frac{1}{n} \sum_{i=1}^{n} \frac{b_i - a_i}{\max(a_i, b_i)}
  • 取值范围在 [−1,1] 之间,数值越接近 1 说明聚类效果越好。
  • 轮廓系数可以用于选择最优的簇数评估聚类质量,但在大规模数据和非凸簇结构下可能存在一定的局限性。

总的来说,轮廓系数是无监督学习中的重要指标之一,可以有效帮助评估聚类结果的合理性。

相关文章:

  • QT 磁盘文件 教程03-创建、删除、复制文件
  • numpy学习笔记2:ones = np.ones((2, 4)) 的详解
  • PostgreSQL中array_to_string函数来将数组转换成逗号分隔的字符串
  • C#:深入理解Thread.Sleep与Task.Delay
  • 类和对象C++
  • 鸿蒙数据持久化之首选项
  • WebGL学习2
  • Echarts 折线图
  • 【Linux笔记】动态库与静态库的理解与加载
  • 《数字图像处理》第三章 灰度变换与空间滤波学习笔记(3.1-3.2)反转、对数、幂律、分段线性等变换
  • 【QT:QSS】
  • 在 MySQL 中,只写 JOIN 等价于?
  • linux 命令 mkdir
  • Spring中DI与IOC的关系解析
  • 卷积神经网络 - 卷积层(具体例子)
  • 第六节 MATLAB M-Files
  • MySQL 关联查询知识
  • 网络篇--网络基础
  • Fortinet全新下一代防火墙NGFW
  • LS-NET-008-OSPF、BGP、RIP三大路由协议
  • 郑州网站推广费用/谷歌浏览器安卓版下载
  • 怎样推广网站/杭州百度推广公司有几家
  • 网建天地小区是电力局的吗/手机清理优化软件排名
  • 西宁手机网站建设/商品推广软文范例300字
  • 无极电影/绍兴seo排名
  • 自建网站怎么做后台管理系统/网站收录查询站长工具