惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
博客园 - 司徒正美
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
罗磊的独立博客
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
MyScale Blog
MyScale Blog
J
Java Code Geeks
L
LangChain Blog
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
G
Google Developers Blog

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
聚类算法评估指标_ SC系数与CH系数代码实现
王新文 · 2026-06-27 · via 博客园_首页

本章会介绍用于评估聚类模型的指标SC系数和CH系数,并解释其为什么可以用于聚类模型的评估

一、SC轮廓系数法(Silhouette Coefficient)

轮廓系数法同时考虑簇内的内聚程度(Cohesion)与簇间的分离程度(Separation),具体计算过程如下:

  1. 计算每一个样本 \(i\) 到同簇内其他样本的平均距离 \(a_i\),该值越小,代表簇内样本相似度越高。
  2. 计算每一个样本 \(i\) 到最近其他簇 \(j\) 内所有样本的平均距离 \(b_{ij}\),该值越大,代表该样本越不容易被误分到其他簇。
  3. 通过公式计算单个样本的轮廓系数:

\[S = \frac{b-a}{\max(a,b)} \]

  1. 取全部样本轮廓系数的平均值作为整体聚类效果评估指标。
  2. 轮廓系数取值范围:\([-1, 1]\),SC数值越接近1,代表聚类效果越好。

参数说明

  • \(a\):样本\(i\)到自身簇内其余样本的平均距离
  • \(b\):样本\(i\)到所有其他簇平均距离中的最小值
  • 我们希望\(a\)越小越好(簇内样本接近),\(b\)越大越好(各簇之间样本远离);当\(b\)变大时,\(S\)变大,当\(a\)变小时,\(S\)变小。

二、CH系数(Calinski-Harabasz)

CH 系数综合考虑簇内的内聚程度、簇外的离散程度以及聚类质心的个数。

优化目标:类别内部数据的距离平方和越小越好,类别之间的距离平方和越大越好,聚类的类别数量越少越好。

1.计算公式

\[\text{CH}(k) = \frac{SSB}{SSW} \cdot \frac{m-k}{k-1} \]

\[SSW = \sum_{i=1}^{m} \left\| x_i - C_{pi} \right\|^2 \]

\[SSB = \sum_{j=1}^{k} n_j \left\| C_j - \bar{X} \right\|^2 \]

SSW(簇内距离,等价于SSE)

  • \(C_{pi}\):当前样本所属簇的质心
  • \(x_i\):单个样本
  • 含义:所有样本点到自身簇质心的距离平方累加和,用来衡量簇内的内聚程度
  • 指标特性:\(SSW\) 越小,簇内样本越紧密,聚类效果越好

SSB(簇间距离)

  • \(C_j\):第\(j\)个簇的质心
  • \(\bar{X}\):全部样本的全局均值
  • \(n_j\):第\(j\)个簇内的样本数量
  • 含义:衡量不同簇之间的分离程度
  • 指标特性:\(SSB\) 越大,簇与簇之间区分越明显

参数说明

  • \(m\):总样本数量
  • \(k\):聚类质心(簇)的个数
  • \(SSW\)越小,说明各簇之前越接近,CH系数越大;\(SSB\) 越大,相当于各簇之前越离散,CH系数越大;K越小,CH也会变大;因此我们希望寻找CH更大的模型。

CH系数评价规则

CH系数数值越大,代表簇内越紧凑、簇间越分散,整体聚类效果越优。

三、代码实现

导入相关的库

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,silhouette_score

1.定义函数,演示:SC轮廓系数法

def dm02_sc():
    # 1. 定义sc列表,记录:每个K值的sc值
    sc_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值,计算其对应的sc值,并添加到sc_list列表中
    for k in range(2,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 模型预测
        y_pred = estimator.predict(x)
        # 3.4 获取每个簇的sc值
        sc_value = silhouette_score(x,y_pred)
        # 3.5 将每个k值对应的sc值,添加到sc_list列表中
        sc_list.append(sc_value)
    # 4.绘制sc曲线-->数据可视化
    # 4.1 创建画布,指定:画布的尺寸
    plt.figure(figsize=(20,10))
    # 4.2 设置标题
    plt.title('sc value')
    # 4.3 设置x的刻度
    plt.xticks(range(2,100,3))
    # 4.4 添加x轴,y轴的标签
    plt.xlabel('k')
    plt.ylabel('sc')
    # 4.5 绘制网格
    plt.grid()
    # 4.6 绘制折线图
    # 参1:k值;参2:该k值对应的sc值
    plt.plot(range(2,100),sc_list)
    # 4.7 显示图像
    plt.show()
dm02_sc()

2.定义函数,演示:ch轮廓系数法

def dm03_ch():
    # 1. 定义ch列表,记录:每个K值的ch值
    ch_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值,计算其对应的ch值,并添加到ch_list列表中
    for k in range(2,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 模型预测
        y_pred = estimator.predict(x)
        # 3.4 获取每个簇的ch值
        ch_value = calinski_harabasz_score(x,y_pred)
        # 3.5 将每个k值对应的ch值,添加到ch_list列表中
        ch_list.append(ch_value)
    # 4.绘制ch曲线-->数据可视化
    # 4.1 创建画布,指定:画布的尺寸
    plt.figure(figsize=(20,10))
    # 4.2 设置标题
    plt.title('ch value')
    # 4.3 设置x的刻度
    plt.xticks(range(2,100,3))
    # 4.4 添加x轴,y轴的标签
    plt.xlabel('k')
    plt.ylabel('ch')
    # 4.5 绘制网格
    plt.grid()
    # 4.6 绘制折线图
    # 参1:k值;参2:该k值对应的ch值
    plt.plot(range(2,100),ch_list)
    # 4.7 显示图像
    plt.show()
dm03_ch()