轮廓系数(Silhouette Score)量化K-Means聚类效果的核心指标

news/2026/1/16 21:20:32/文章来源:https://www.cnblogs.com/xsnote/p/19494054

在K-Means聚类中,仅靠可视化判断聚类效果不够精准(尤其是高维数据),而轮廓系数(Silhouette Score) 是衡量聚类质量的黄金指标——它能从“同类紧致性”和“异类分离度”两个维度,用数值量化聚类的好坏,帮你客观判断K值是否合理、聚类结果是否有业务意义。

一、轮廓系数核心原理:3个维度讲透

1.1 核心定义

轮廓系数针对每个样本计算,取值范围为[-1, 1],整体轮廓系数是所有样本的均值:

  • 接近1:样本与同类别样本距离近,与异类别样本距离远,聚类效果极佳;
  • 接近0:样本处于两个类别边界,聚类模糊,类别划分无意义;
  • 接近-1:样本被错误划分到当前类别,聚类效果极差。

1.2 计算逻辑(单样本)

对单个样本i,轮廓系数s(i)的计算公式:
$$s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))}$$

  • a(i):样本i到同类别所有其他样本的平均距离(同类紧致性),值越小说明同类越紧凑;
  • b(i):样本i到最近的异类别所有样本的平均距离(异类分离度),值越大说明异类越分离;

1.3 整体轮廓系数

所有样本轮廓系数的算术平均值,即为整个聚类结果的轮廓系数,公式:
$$Silhouette Score = \frac{1}{n}\sum_{i=1}^n s(i)$$
(n为样本总数)

二、轮廓系数实战:代码落地(结合用户分群案例)

以之前的“电商用户消费行为分群”为例,完整演示如何计算、解读轮廓系数,对比不同K值的聚类效果。

2.1 完整代码(可直接复制运行)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, silhouette_samples# 步骤1:构造用户消费数据(同之前的案例)
data = {'用户ID': range(1, 101),'月消费金额(元)': [np.random.randint(10, 200) for _ in range(30)] +[np.random.randint(200, 800) for _ in range(50)] +[np.random.randint(800, 2000) for _ in range(20)],'月消费频次(次)': [np.random.randint(1, 3) for _ in range(30)] +[np.random.randint(3, 8) for _ in range(50)] +[np.random.randint(8, 15) for _ in range(20)]
}
df = pd.DataFrame(data)# 步骤2:数据标准化
features = df[['月消费金额(元)', '月消费频次(次)']]
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)# 步骤3:计算不同K值的轮廓系数(K=2到K=6)
silhouette_scores = []
k_range = range(2, 7)
for k in k_range:kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)cluster_labels = kmeans.fit_predict(features_scaled)# 计算整体轮廓系数score = silhouette_score(features_scaled, cluster_labels)silhouette_scores.append(score)print(f"K={k} 时,轮廓系数:{score:.4f}")# 步骤4:可视化不同K值的轮廓系数
plt.figure(figsize=(8, 5))
plt.plot(k_range, silhouette_scores, marker='o', linestyle='-', color='blue')
plt.title('不同K值的轮廓系数对比')
plt.xlabel('聚类数K')
plt.ylabel('轮廓系数(Silhouette Score)')
plt.grid(alpha=0.3)
plt.axvline(x=3, color='red', linestyle='--', label='最优K=3')
plt.legend()
plt.show()# 步骤5:可视化K=3时的样本级轮廓系数(进阶)
k=3
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(features_scaled)
# 获取每个样本的轮廓系数
sample_silhouette_values = silhouette_samples(features_scaled, cluster_labels)# 绘制轮廓图
plt.figure(figsize=(10, 6))
y_lower = 10  # 初始y轴位置
for i in range(k):# 提取第i类的样本轮廓系数ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]# 排序ith_cluster_silhouette_values.sort()size_cluster_i = ith_cluster_silhouette_values.shape[0]y_upper = y_lower + size_cluster_i# 填充颜色color = plt.cm.viridis(float(i) / k)plt.fill_betweenx(np.arange(y_lower, y_upper),0, ith_cluster_silhouette_values,facecolor=color, edgecolor=color, alpha=0.7)# 标注类别plt.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))y_lower = y_upper + 10  # 类别间留间距# 绘制整体轮廓系数平均线
plt.axvline(x=silhouette_score(features_scaled, cluster_labels), color="red", linestyle="--", label=f'整体轮廓系数:{silhouette_score(features_scaled, cluster_labels):.4f}')
plt.title('K=3时的样本级轮廓系数分布')
plt.xlabel('轮廓系数值')
plt.ylabel('样本所属类别')
plt.legend()
plt.grid(alpha=0.3)
plt.show()

2.2 运行结果解读

1. 不同K值的轮廓系数输出(示例)

K=2 时,轮廓系数:0.6528
K=3 时,轮廓系数:0.7856  # 最大值,最优K值
K=4 时,轮廓系数:0.6987
K=5 时,轮廓系数:0.5842
K=6 时,轮廓系数:0.4915
  • K=3时轮廓系数最高(0.7856),说明将用户分为3类时,聚类效果最好;
  • K>3后轮廓系数持续下降,说明过度聚类(类别拆分无意义)。

2. 样本级轮廓系数图解读

  • 每个颜色块代表一个类别,块的宽度对应样本数量,横坐标是样本的轮廓系数;
  • 红色虚线是整体轮廓系数,若大部分样本的轮廓系数在虚线右侧,说明聚类质量高;
  • 若某类出现大量负轮廓系数,说明该类样本被错误划分。

三、轮廓系数的使用场景与注意事项

3.1 核心使用场景

  1. 确定最优K值:结合肘部法则(惯性值)+ 轮廓系数,避免仅靠惯性值选K的片面性;
  2. 评估聚类质量:对比不同聚类算法(如K-Means vs 层次聚类)的效果;
  3. 验证业务合理性:若轮廓系数<0.5,即使可视化效果好,也需重新调整K值或清洗数据。

3.2 避坑要点

  1. 高维数据需先降维:轮廓系数基于距离计算,高维数据(如100+特征)的距离计算无意义,需先用PCA降维到2-5维;
  2. 对异常值敏感:异常值会拉高a(i)或b(i),导致轮廓系数失真,需先清洗异常值;
  3. 非距离型数据不适用:若数据是分类特征(如性别、地区),需先编码(如One-Hot)并标准化,否则轮廓系数无意义;
  4. 不替代业务逻辑:轮廓系数高不代表业务有意义(比如K=3的轮廓系数最高,但业务上用户分4类更合理),需结合业务场景决策。

3.3 与肘部法则的配合使用

指标 核心作用 优势 劣势
惯性值(肘部法则) 衡量同类样本的紧致性 计算快,适合大规模数据 无法判断异类分离度
轮廓系数 兼顾紧致性和分离度 量化聚类整体质量 计算慢(样本数>10万时)

最佳实践:先用肘部法则缩小K值范围(如K=2-6),再用轮廓系数在该范围内选最优K值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BeautifulSoup-cnblog

BeautifulSoup ​ 蔬菜网 ​ (完整代码再文后) ​ 首先再基础的部分,和re正则不同的是,我们要先对拿到的网页源代码进行解析。 ​ 接着我们观察一下源代码,这里我们要爬的是网页中蔬菜的价格。 我们可以发现所…

方框标定代码

import numpy as np import cv2 import glob# 1. 准备标定板参数 chessboard_size (7, 10) # 内角点数量 square_size 13.0 # 毫米# 2. 生成世界坐标系中的3D点 objp np.zeros((chessboard_size[0]*chessboard_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:chessboa…

揭秘TCP/IP协议栈:网络通信的核心架构

TCP/IP协议栈深度解析技术文章大纲引言简要介绍TCP/IP协议栈的历史背景、重要性及其在现代网络通信中的核心作用。TCP/IP协议栈的分层结构详细说明TCP/IP的四层模型&#xff08;应用层、传输层、网络层、链路层&#xff09;及其与OSI七层模型的对比。链路层&#xff08;数据链路…

揭秘TCP/IP协议栈:网络通信的核心架构

TCP/IP协议栈深度解析技术文章大纲引言简要介绍TCP/IP协议栈的历史背景、重要性及其在现代网络通信中的核心作用。TCP/IP协议栈的分层结构详细说明TCP/IP的四层模型&#xff08;应用层、传输层、网络层、链路层&#xff09;及其与OSI七层模型的对比。链路层&#xff08;数据链路…

捕捉瞬息万变的电信号世界:Waverunner力科610Zi示波器深度解读

156/2558/3328产品概述&#xff1a;在电子工程师的实验室里&#xff0c;每一块电路板的心跳与脉动——那些高速流动、转瞬即逝的电信号——决定了产品的性能与成败。如何精准“看见”并理解这些复杂的信号&#xff0c;尤其是捕捉那些隐蔽极深、稍纵即逝的异常&#xff1f;力科&…

vscode的几个版本说明

Stable稳定版(蓝色版)、Insider内测版(绿色版)、Exploration探索版(橙色版)橙色版目前只提供给VSCode开发团队使用&#xff0c;而绿色版的核心价值在于“抢先体验前沿功能”。绿色版1.默认支持 Copilot X 全功能&#xff1b;2.终端增强&#xff1a;多面板拆分与实时预览&#x…

存储技术全景:从基础原理到未来趋势

系统存储机制深度剖析技术文章大纲存储基础概念与分类存储介质类型&#xff08;机械硬盘、固态硬盘、非易失性内存等&#xff09;存储层次结构&#xff08;寄存器、缓存、主存、外存&#xff09;存储访问方式&#xff08;随机访问、顺序访问&#xff09;物理存储机制磁盘结构&a…

存储技术全景:从基础原理到未来趋势

系统存储机制深度剖析技术文章大纲存储基础概念与分类存储介质类型&#xff08;机械硬盘、固态硬盘、非易失性内存等&#xff09;存储层次结构&#xff08;寄存器、缓存、主存、外存&#xff09;存储访问方式&#xff08;随机访问、顺序访问&#xff09;物理存储机制磁盘结构&a…

C++跨平台开发:挑战与解决方案

C跨平台开发的核心挑战平台差异性处理 硬件架构差异&#xff08;x86/ARM等&#xff09;导致的内存对齐、字节序问题 操作系统API差异&#xff08;Windows/Linux/macOS系统调用、文件路径等&#xff09; 编译器兼容性问题&#xff08;GCC/Clang/MSVC对C标准的支持程度不同&#…

C++跨平台开发:挑战与解决方案

C跨平台开发的核心挑战平台差异性处理 硬件架构差异&#xff08;x86/ARM等&#xff09;导致的内存对齐、字节序问题 操作系统API差异&#xff08;Windows/Linux/macOS系统调用、文件路径等&#xff09; 编译器兼容性问题&#xff08;GCC/Clang/MSVC对C标准的支持程度不同&#…

Java性能优化实战:从原理到技巧

Java性能优化实战技术文章大纲性能优化的基础概念性能优化的定义与重要性性能指标&#xff1a;吞吐量、延迟、资源利用率常见性能瓶颈&#xff1a;CPU、内存、I/O、网络JVM层面的优化垃圾回收器选择与调优&#xff08;G1、ZGC、Shenandoah&#xff09;堆内存与元空间参数配置&a…

Photoshop 图形与图像处理技术——第9章:实践训练3——图像修饰和色彩色调的调整

目录 零、常用快捷键操作 一、使用“污点修复工具” &#xff08;1&#xff09;素材与效果图 &#xff08;2&#xff09;操作步骤 二、使用“修复画笔”工具 &#xff08;1&#xff09;素材与效果图 &#xff08;2&#xff09;操作步骤 三、使用“修补”工具 &#xf…

闲置京东e卡回收新选择,让沉睡的购物卡焕发新生机 - 京顺回收

李女士在整理抽屉时意外发现几张未拆封的京东e卡,面值加起来竟有两千元。她望着这些卡券苦笑:"现在购物都习惯用手机支付,这些卡放着也是浪费。"这个场景或许正发生在无数家庭中——随着移动支付普及,曾…

5G、雷达、航天研发的“心脏”利器:是德N5182B 信号发生器全面解析

156/2558/3328产品概述&#xff1a;在无线通信、雷达系统和航空航天等领域&#xff0c;研发与测试人员每天都在与无形的射频信号打交道。如何生成一个“纯净”且“听话”的信号&#xff0c;来验证设备在真实世界复杂电磁环境中的性能&#xff1f;这离不开一台核心仪器——射频信…

不同版本的 chrome 开发者工具 CSS 属性变为斜体无法修改,如何解决?

如上操作&#xff0c;取消"CSS源代码映射"&#xff0c;就可以把CSS斜体属性变为正常可修改属性

Photoshop 图形与图像处理技术——第9章:实践训练4——图层和蒙版

目录 一、绘制小狗 &#xff08;1&#xff09;素材 &#xff08;2&#xff09;效果图 &#xff08;3&#xff09;步骤教程 二、实践1——将老人图层移至海滩图层 &#xff08;1&#xff09;素材 &#xff08;2&#xff09;效果图 &#xff08;3&#xff09;步骤教程 三…

提示系统没人用?架构师教你3步打造爆款互动体验

提示系统没人用&#xff1f;架构师教你3步打造爆款互动体验 关键词 提示系统设计 | 用户互动体验 | 场景化引导 | 个性化感知 | 反馈闭环 | 行为经济学 | 数据驱动优化 摘要 你是否遇到过这样的场景&#xff1a;精心设计的AI提示框弹出来&#xff0c;用户却直接关掉&#x…

Nvidia H100 算力服务器 Cuda、FabricManager、Container 安装和升级 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2026年1月档案机构公司权威推荐:档案储存机构公司、档案整理机构公司、档案数字化机构公司、电子档案机构公司、整理卷宗档案机构公司、销毁档案机构公司等选择指南,智慧管理解决方案 - 海棠依旧大

广州创科绿农数字信息技术有限公司深耕数字信息技术领域,聚焦档案管理数字化升级需求,打造“创科档案”核心业务板块,以技术创新为支撑,构建适配企业全场景的档案管理体系,助力各类组织打破传统档案管理瓶颈,实现…

Java基础补缺5:异常处理、常用工具类

Java基础补缺5:异常处理、常用工具类1)Java异常处理全面解析 Error 的出现,意味着程序出现了严重的问题,而这些问题不应该再交给 Java 的异常处理机制来处理,程序应该直接崩溃掉,比如说 OutOfMemoryError,内存溢…