机器学习05-聚类算法(python)SC(轮廓系数)详解

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

# 导入必要的库
from sklearn.cluster import KMeans  # 导入 KMeans 聚类算法
import matplotlib.pyplot as plt  # 导入 matplotlib 用于绘图
from sklearn.datasets import make_blobs  # 导入 make_blobs 用于生成模拟数据
from sklearn.metrics import silhouette_score  # 导入 silhouette_score 用于计算轮廓系数# 定义函数来计算不同簇数下的轮廓系数
def dm02_silhouette_coefficient():silhouette_list = []  # 初始化一个空列表,用于存储每个簇数下的轮廓系数# 生成模拟数据集# n_samples=1000 生成1000个样本# n_features=2 表示每个样本有2个特征(二维数据)# centers 指定了4个聚类中心,分别为 [-1, -1], [0, 0], [1, 1], [2, 2]# cluster_std 指定每个聚类的标准差,数值越小簇内点越集中x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)  # 固定随机种子使每次生成的数据一致# 计算不同簇数下的轮廓系数for clu_num in range(2, 100):  # 从2个簇开始,计算到99个簇# 初始化 KMeans 模型,指定簇数和最大迭代次数my_kmeans = KMeans(n_clusters=clu_num, max_iter=100, random_state=0)# 拟合模型,对数据进行聚类my_kmeans.fit(x)# 预测簇标签cluster_labels = my_kmeans.predict(x)# 计算轮廓系数并添加到列表中,轮廓系数衡量了聚类结果的优劣silhouette_list.append(silhouette_score(x, cluster_labels))# 绘制轮廓系数随簇数变化的图plt.figure(figsize=(18, 8), dpi=100)  # 设置图像大小和分辨率plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))  # 设置 x 轴刻度plt.grid(True)  # 显示网格线plt.title('Silhouette Coefficient vs. Number of Clusters')  # 设置图像标题plt.xlabel('Number of Clusters')  # 设置 x 轴标签plt.ylabel('Silhouette Coefficient')  # 设置 y 轴标签# 绘制簇数与轮廓系数的曲线,'ob-' 表示蓝色圆圈连接线plt.plot(range(2, 100), silhouette_list, 'ob-', markersize=5, label='Silhouette Coefficient')plt.legend(loc='best')  # 显示图例plt.show()  # 显示图像# 通过观察图像,可以找到轮廓系数达到最大值的位置,该位置通常是最优的簇数# 调用函数进行计算并绘图
dm02_silhouette_coefficient()

数据集示例

计算公式:

SC_i = \frac{b_i - a_i}{\max(a_i, b_i)}

  • 为了更清晰地解释如何计算每个样本的分离度a_i 和轮廓系数 b_i,以及轮廓系数SC我们通过一个例子来详细说明。

    例子:计算样本的分离度和轮廓系数

    假设我们有以下三个簇的二维数据点:

    • 簇 1( P_1(1, 2), P_2(2, 3), P_3(3, 2) )

    • 簇 2( P_4(6, 8), P_5(7, 8), P_6(8, 9) )

    • 簇 3( P_7(10, 1), P_8(9, 2), P_9(11, 2) )

    我们要计算样本 P_1(1, 2)凝聚度分离度轮廓系数,并说明整个计算过程(注意本次只计算一个点的值,其他点计算凝聚度分离度轮廓系数是一样过程,最好计算SC 的时候,求了所有点的平均值轮廓系数SC )。

    第一步:计算凝聚度 (a_i)

    凝聚度 (a_i) 是样本 (i) 到所属簇中所有其他样本的平均距离。

    • (P_1) 属于簇 1,簇 1 中的其他样本是 P_2(2, 3)P_3(3, 2)

    • 计算 (P_1) 到簇内其他样本的距离:

      • P_2(2, 3)的距离:\sqrt{(2 - 1)^2 + (3 - 2)^2} = \sqrt{1 + 1} = \sqrt{2} \approx 1.41

      • P_3(3, 2) 的距离:\sqrt{(3 - 1)^2 + (2 - 2)^2} = \sqrt{4 + 0} = \sqrt{4} = 2

    凝聚度 (a_1)a_1 = \frac{1.41 + 2}{2} = 1.71

    第二步:计算分离度 (b_i)

    分离度 (b_i) 是样本 (i) 到最近的其他簇的平均距离。

    • (P_1) 的最近簇是簇 2簇 3,我们需要分别计算它到这两个簇的平均距离,然后选择距离最小的那个簇。

    计算 (P_1) 到簇 2 的距离:
    • P_4(6, 8)\sqrt{(6 - 1)^2 + (8 - 2)^2} = \sqrt{25 + 36} = \sqrt{61} \approx 7.81

    • P_5(7, 8)\sqrt{(7 - 1)^2 + (8 - 2)^2} = \sqrt{36 + 36} = \sqrt{72} \approx 8.49

    • P_6(8, 9)\sqrt{(8 - 1)^2 + (9 - 2)^2} = \sqrt{49 + 49} = \sqrt{98} \approx 9.90

    簇 2 的平均距离b_1^{(2)} = \frac{7.81 + 8.49 + 9.90}{3} = \frac{26.2}{3} \approx 8.73

    计算 P_1到簇 3 的距离:
    • P_7(10, 1)\sqrt{(10 - 1)^2 + (1 - 2)^2} = \sqrt{81 + 1} = \sqrt{82} \approx 9.06

    • P_8(9, 2)\sqrt{(9 - 1)^2 + (2 - 2)^2} = \sqrt{64} = 8

    • P_9(11, 2)\sqrt{(11 - 1)^2 + (2 - 2)^2} = \sqrt{100} = 10

    簇 3 的平均距离[ b_1^{(3)} = \frac{9.06 + 8 + 10}{3} = \frac{27.06}{3} \approx 9.02 ]

    选择最近的簇:

    分离度 (b_1)(b_1 = \min(b_1^{(2)}, b_1^{(3)}) = \min(8.73, 9.02) = 8.73),因此簇 2(P_1) 最近的簇。

  • P_1 点的 分离度 (b_1) 为 8.73

    第三步:计算轮廓系数(SC_i)

    轮廓系数 (SC_i) 的公式是: [ SC_i = \frac{b_i - a_i}{\max(a_i, b_i)} ]

    对于 (P_1)来说:

    • 凝聚度 (a_1 = 1.71)

    • 分离度(b_1 = 8.73)

    代入公式:[ SC_1 = \frac{8.73 - 1.71}{\max(1.71, 8.73)} = \frac{7.02}{8.73} \approx 0.80 ]

    总结:

    • 凝聚度 (a_1 = 1.71)表示 (P_1)与簇 1 中其他点的平均距离。

    • 分离度 (b_1 = 8.73) 表示(P_1) 与最近簇(簇 2)的平均距离。

    • 轮廓系数 (SC_1 = 0.80),表示样本 (P_1) 聚类效果较好,值接近 1,说明它更好地属于它所在的簇。

    整体聚类模型的轮廓系数:

    对所有样本的轮廓系数(SC_i)计算后取平均,就可以得出聚类模型的整体轮廓系数,用来衡量聚类效果。

轮廓系数(Silhouette Coefficient,SC)的取值范围是 ([-1, 1]),这是因为它通过比较样本的凝聚度和分离度来衡量聚类效果。我们可以通过公式和直观解释来理解为什么它的取值范围是 ([-1, 1])

轮廓系数的公式

轮廓系数 (SC_i) 的计算公式为:[ SC_i = \frac{b_i - a_i}{\max(a_i, b_i)} ] 其中:

  • (a_i)是样本 (i) 的凝聚度,即样本与其所属簇内其他样本的平均距离。

  • (b_i)是样本 (i) 的分离度,即样本与最近的其他簇的平均距离。

公式中的(SC_i) 用来衡量样本 (i) 是更接近它的自身簇,还是更接近最近的其他簇。

为什么取值在 ([-1, 1]) 之间?

  • (SC_i = 1):此时 (a_i)  很小(样本与其所在簇内其他样本非常接近),而 (b_i)很大(样本与最近的其他簇的平均距离很远)。这是理想的情况,说明样本点与自己的簇高度匹配,并且远离其他簇,聚类效果非常好。

  • 当 (SC_i = 0) 时:此时 (a_i) 和 (b_i) 相等,意味着样本点与它所在簇的其他点的距离和它与最近的其他簇的距离差不多。这表示样本点位于簇的边界,聚类效果不明显。

  • 当 (SC_i = -1) 时:此时 (a_i > b_i),意味着样本点与其他簇的距离比与自己簇的距离更近,说明样本可能被错误地分配到了当前簇。这是最糟糕的情况,表示样本应该属于另一个簇。

取值范围的直观解释

  1. 当 (SC_i = 1),说明样本与自己簇的其他样本非常接近,与其他簇的样本距离较远,表明聚类效果很好。

  2. 当 (SC_i = 0),说明样本位于簇的边界,聚类效果中等,样本点无法明显区分到底更应该属于哪个簇。

  3. 当 (SC_i = -1),说明样本距离其他簇的样本比自己簇的样本还要近,表明聚类效果很差,样本可能被错误归类。

因此,轮廓系数的范围 ([-1, 1]) 可以很好地反映聚类效果的好坏,从非常差(接近 -1)到非常好(接近 1)。

下面是描述过程,不过我理解上面应该很好的描述了计算过程:
计算凝聚度 (a_i) 的流程如下:

凝聚度 (a_i) 是什么?

凝聚度 (a_i) 是样本 (i) 与其所属簇内其他所有样本的平均距离。它反映了样本 (i) 在其所属簇内的紧密程度。凝聚度越小,表示样本与同一簇内其他样本越接近,簇内的聚类效果越好。

计算凝聚度 (a_i) 的步骤:

  1. 找到样本 (P_i) 所属的簇: 首先确定样本 (P_i) 所属的簇(即由聚类算法划分出的簇)。

  2. 计算样本 (P_i) 到同一簇内其他样本的距离

    • 记 (C_k) 为样本 (P_i) 所在的簇(簇 (k)),该簇包含 (N_k) 个样本。

    • 对于 (P_i) 所属的簇 (C_k),计算 (P_i) 到该簇内每个其他样本的距离。这些距离是欧氏距离(或者根据情况使用其他距离度量)。

  3. 求出簇内样本的平均距离

    • 将所有的距离求和,并除以簇内样本的总数减去 1(因为不包含样本自身)。公式如下:

    [ a_i = \frac{1}{N_k - 1} \sum_{P_j \in C_k, j \neq i} d(P_i, P_j) ]

    其中,(d(P_i, P_j)) 表示样本 (P_i) 与样本 (P_j) 之间的距离,(N_k) 是簇 (C_k) 中的样本总数。

示例:

假设我们有一个样本 (P_1) 位于簇 (C_k) 中,而 (C_k) 由 4 个样本 (P_1, P_2, P_3, P_4) 组成。我们要计算样本 (P_1) 的凝聚度 (a_1)。

  • 计算 (P_1) 到 (P_2)、(P_1) 到 (P_3)、(P_1) 到 (P_4) 的距离。

  • 将这些距离相加,并除以簇内的样本总数减 1(即 (3)):

    [ a_1 = \frac{d(P_1, P_2) + d(P_1, P_3) + d(P_1, P_4)}{3} ]

  • 上面就得到了P_1 点的 凝聚度 (a_1)(划重点,是P1点的,不是整个模型的

总结:

  • 凝聚度 (a_i) 是样本 (i) 与同簇内其他所有样本的平均距离。

  • 它用于衡量样本在簇内的紧密程度,值越小表示样本与簇内其他样本越接近,聚类效果越好。

所有样本点都需要计算每个样本与其他所有簇的平均距离,然后选择距离最小的簇作为该样本的最近簇。每个样本的分离度 (b_i) 就是该样本与最近簇的平均距离。

计算分离度 (b_i) 的流程如下:

  1. 对于每个样本点 (P_i),首先找到它所属的簇,并计算该点与同一簇中其他点的平均距离,称为凝聚度 (a_i)。

  2. 然后,对于每个样本 (P_i),计算它与所有其他簇的平均距离,选择距离最小的那个簇作为最近的簇,并将该距离设为分离度 (b_i)。

  3. 通过公式 ( SC_i = \frac{b_i - a_i}{\max(a_i, b_i)} ) 计算该样本的轮廓系数 ( SC_i )。

  4. 轮廓系数 是聚类效果的衡量标准,值越接近 1 表明样本点聚类效果越好。接近 -1 则表明样本可能被错误分配到其他簇。

要得出聚类模型的整体轮廓系数,通常是计算所有样本的 SC 值并取平均数。

因此,所有的样本点都要计算,以保证计算出的轮廓系数能够全面反映聚类的整体效果。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

react:组件通信

组件通信 父组件向子组件通信 function App() {return (<div><div>这是父组件</div><Child name"这是子组件" /></div>); }// 子组件 function Child(props) {return <div>{props.name}</div>; }props说明 props可以传…

浅谈计算机视觉的学习路径1

计算机视觉&#xff08;Computer Vision, CV&#xff09;是人工智能领域的一个重要分支&#xff0c;它的目标是使计算机能够像人类一样理解和处理图像和视频数据。 面向想要从事该方向的大学生&#xff0c;笔者这里给出以下是关于计算机视觉的学习路径建议&#xff1a; 简要了解…

Linux开发工具(git、gdb/cgdb)--详解

目录 一、Linux 开发工具分布式版本控制软件 git1、背景2、使用 git&#xff08;1&#xff09;预备工作——安装 git&#xff1a;&#xff08;2&#xff09;克隆远程仓库到本地&#xff08;3&#xff09;把需要提交的代码拷贝到本地仓库&#xff08;4&#xff09;提交本地仓库文…

一种新的电子邮件攻击方式:AiTM

新的攻击组利用合作伙伴组织之间的信任关系来绕过多重身份验证。 一种新的攻击方式开始出现&#xff0c;它利用合作伙伴组织之间的信任关系绕过多重身份验证。在一个利用不同组织之间关系的攻击中&#xff0c;攻击者成功地对四家或更多组织进行了商业电子邮件欺诈(BEC)攻击&…

VM-Ubantu中使用vscode头文件报错——解决办法

问题 系统中头文件明明存在但是却报错 解决方法 在报错的文件中点击&#xff0c;shift ctrl p选择Edit Configurations(JSON) 修改文件内容 原文件内容 修改之后的内容 {"configurations": [{"name": "Linux","includePath":…

计算机毕业设计推荐-基于python大数据的个性化图书数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、个性化图书数据可视化分析-项…

828华为云征文 | 云服务器Flexus X实例:开源项目 LangChain 部署,实例测试

目录 一、LangChain 介绍 二、部署 LangChain 2.1 安装 langchain 2.2 安装 langchain_community 2.3 安装 qianfan 三、实例运行 3.1 Chat Models 3.2 LLMs 3.3 Embedding Models 四、总结 本篇文章主要通过 Flexus云服务器X实例 部署开源项目 LangChain&#xff0c…

【每日一题】LeetCode 2374.边积分最高节点(图、哈希表)

【每日一题】LeetCode 2374.边积分最高节点&#xff08;图、哈希表&#xff09; 题目描述 给定一个有向图&#xff0c;图中包含 n 个节点&#xff0c;节点编号从 0 到 n - 1。每个节点都有一个出边&#xff0c;指向图中的另一个节点。图由一个长度为 n 的整数数组 edges 表示…

【Linux学习】基本指令其一

命令行界面 命令行终端是一个用户界面&#xff0c;允许用户通过输入文本命令与计算机系统进行交互。 比如Windows下&#xff0c; 键入winR&#xff0c;然后输入cmd&#xff0c;就可以输入文本指令与操作系统交互了。 Windows有另一个命令行界面Powershell,它的功能比cmd更强大…

江协科技STM32学习- P15 TIM输出比较

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作

视频演示 【开源】LVGLFreeRTOS 基于STM32F411的智能健康助手小项目 网盘链接在最底下&#xff01;&#xff01;&#xff01;无套路&#xff01;&#xff01;&#xff01;直接分享&#xff01;&#xff01;&#xff01; 硬件介绍 STM32F411CEU6 主控 TFT 1.8inch 显示屏 DTH…

WebGL缓冲区

一、缓冲区对象 缓冲区对象时WebGL系统中的一块内存区域&#xff0c;可以一次性地向缓冲区对象中填充大量的顶点数据&#xff0c;然后将这些数据保存其中&#xff0c;供顶点着色器使用。 类型化数组 这样程序可以预知数组中的类型&#xff0c;提高性能 类型描述Int8Array8位…

数据湖 Data Lake-概述

Data Lake 1. 数据湖的定义 数据湖是一种存储系统&#xff0c;用于集中存储大量的原始数据&#xff0c;可以按数据本来的原始格式进行存储&#xff0c;用户可以在需要时提取和分析这些数据。 A data lake is a centralized repository designed to hold vast volumes of data …

JavaScript高级进阶(三)

DOM-改变HTML 语法与说明 document.write() //改变HTML输出流&#xff0c;整个页面进行重绘。 操作对象.innerHTML新的HTML //改变HTML内容 操作对象.attribute新属性值 //改变HTML属性 对象.style.property新样式 //改变操作样式的属性 注意: document.write(),优先级太高&am…

Th:1.1 建立连接

基础讲解 1.TCP通信流程 基于TCP通信的Socket基本流程: 1.1 Socket 函数返回值&#xff1a;一个文件描述符&#xff1a; 特别的两个队列。 #include <sys/types.h> #include <sys/socket.h> //create an endpoint for communication int socket(int …

vue循环渲染动态展示内容案例(“更多”按钮功能)

当我们在网页浏览时&#xff0c;常常会有以下情况&#xff1a;要展示的内容太多&#xff0c;但展示空间有限&#xff0c;比如我们要在页面的一部分空间中展示较多的内容放不下&#xff0c;通常会有两种解决方式&#xff1a;分页&#xff0c;“更多”按钮。 今天我们的案例用于…

MyBatis-config.xml核心配置

MyBatis-config.xml 包含了会深深影响MyBatis行为的设置和属性信息&#xff0c;配置文档的顶层结构如下 environments&#xff08;环境配置&#xff09; environments用于配置数据库的URL信息&#xff0c;MyBatis-config可以动态配置多个数据源&#xff0c;用于连生产、预发、…

python:编写一个函数查找字符串中的最长公共前缀

最近在csdn网站上刷到一个题目&#xff0c;题目要求编写一个函数查找字符串中的最长公共前缀&#xff0c;题目如下&#xff1a; 给出的答案如下&#xff1a; from typing import List def longestCommonPrefix(strs:List[str]) -> str:if len(strs) 0:return i 0 #代…

矩阵系统源码搭建抖音矩阵批量剪辑矩阵分发,矩阵系统可开源或oem

揭秘抖音矩阵系统源码搭建秘籍 在短视频平台迅猛增长的背景下&#xff0c;抖音矩阵系统已变成扩大创作者及企业影响力的有效工具。构建这样一个系统需要精通多种编程技术&#xff0c;本文将探讨这些关键技术点。 矩阵营销系统通过集成多项功能如跨平台的账户管理、自动化任务生…

AI周报(9.15-9.21)

AI应用-宇宙建筑师&#xff1a;AI探索宇宙结构 近日&#xff0c;来自马克斯普朗克研究所等机构&#xff0c;利用宇宙学和红移依赖性对宇宙结构形成进行了场级仿真。 AI版“宇宙闪电侠”&#xff1a;若以传统宇宙模拟的缓慢行进比作悠然自得的蜗牛&#xff0c;那么AI便宛如宇宙…