损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现+计算原理解析

news2025/1/24 1:47:56

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现+计算原理解析

前言

损失函数无疑是机器学习和深度学习效果验证的核心检验功能,用于评估模型预测值与实际值之间的差异。我们学习机器学习和深度学习或多或少都接触到了损失函数,但是我们缺少细致的对损失函数进行分类,或者系统的学习损失函数在不同的算法和任务中的不同的应用。因此有必要对整个损失函数体系有个比较全面的认识,方便以后我们遇到各类功能不同的损失函数有个清楚的认知,而且一般面试以及论文写作基本都会对这方面的知识涉及的非常深入。故本篇文章将结合实际Python代码实现损失函数功能,以及对整个损失函数体系进行深入了解。

博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。若你渴望突破数学建模的瓶颈,不要错过笔者精心打造的专栏。愿你能在这里找到你所需要的灵感与技巧,为你的建模之路添砖加瓦。
一文速学-数学建模常用模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一、聚类问题损失函数概述

在聚类问题中,我们试图将数据集分成不同的组(簇),使得每个组内的数据点相似度较高,而不同组之间的相似度较低。聚类问题的目标是找到合适的簇划分,以最大程度地减小组内的差异,同时最大程度地增大组间的差异。在聚类问题中,并没有像监督学习中那样明确定义的损失函数,因为聚类问题通常是无监督学习,没有预先定义的目标变量。而聚类问题的损失函数通常用于度量簇划分的质量,并提供一种可优化的指标来衡量聚类结果的好坏。一般来说聚类问题的损失函数承担的功能有三种:

  • 度量簇内相似度: 损失函数度量了每个簇内数据点的相似度,即簇内数据点之间的相似程度。通常情况下,簇内相似度越高,表示簇内的数据点越相似。
  • 度量簇间差异: 损失函数也可以度量不同簇之间的差异,即不同簇之间的相似度。簇间差异越大,表示不同簇之间的数据点越不相似。
  • 提供优化目标: 损失函数为聚类算法提供了一个可优化的目标。聚类算法的目标是通过最小化或最大化损失函数来寻找最佳的簇划分。

那么作为度量差距的算法,都有损失函数的通性,辅助我们建立的模型好坏与否,其效果有以下四条:

  • 帮助确定最佳簇数: 通过调整簇数,可以观察损失函数的变化,从而帮助确定最佳的簇数。
  • 评估聚类结果: 损失函数可以用于评估聚类算法的结果,帮助判断聚类是否合理,簇内的相似度是否高,簇间的差异是否明显。
  • 指导优化过程: 在迭代优化过程中,聚类算法可以根据损失函数的值来调整簇划分,从而提升聚类的效果。
  • 衡量聚类的稳定性: 损失函数可以用于衡量聚类结果的稳定性,即不同运行下的聚类结果是否一致。

总的来说,聚类问题的损失函数在聚类过程中起到了指导和评估的作用,帮助算法找到合适的簇划分,从而达到最佳的聚类效果。选择合适的损失函数可以根据具体问题的需求和数据的特点来进行,以获得满意的聚类结果。

二、聚类函数种类

在这里插入图片描述

1.SSE(Sum of Squared Errors)

SSE(Sum of Squared Errors)是一种常用于聚类算法中的损失函数,也称为误差平方和。它衡量了每个数据点与其所属簇的质心之间的欧氏距离的平方的总和。

具体来说,对于一个包含 n 个数据点和 k 个簇的聚类结果,SSE 的计算公式如下:
S S E = ∑ i = 1 n ​ ∑ j = 1 k ​ d ( x i , c j ) 2 SSE=∑^n_{i=1}​∑^k_{j=1}​d(x_i,c_j)^2 SSE=i=1nj=1kd(xi,cj)2
其中:

  • x i x_{i} xi表示第 i 个数据点。
  • c j c_j cj表示第 j 个簇的质心。
  • d ( x i , c j ) d(x_{i},c_{j}) d(xi,cj)表示数据点 x i x_{i} xi与簇质心 c j c_{j} cj 之间的欧氏距离。

SSE 的目标是最小化这个值,即通过调整簇的划分和质心的位置来使每个数据点与其所属簇的质心之间的距离尽可能小,从而达到聚类的效果。

SSE 的优点是简单直观,容易理解。然而,它也有一些缺点,例如它假设簇的形状是凸的,并且对异常值敏感。

在K均值聚类(K-Means)算法中,SSE 是一个重要的评估指标,通常用于确定最佳的簇数(K值)。通过尝试不同的K值,可以绘制出SSE随K值变化的曲线(称为“肘部法则”),从而选择最优的K值。
在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np

def calculate_euclidean_distance(point, centroid):
    return np.sum((point - centroid) ** 2)

def calculate_sse(data, centroids, labels):
    sse = 0
    for i in range(len(data)):
        sse += calculate_euclidean_distance(data[i], centroids[labels[i]])
    return sse

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
centroids = np.array([[2, 3], [7, 8]])
labels = np.array([0, 0, 1, 1, 1])  # 每个数据点所属的簇

sse = calculate_sse(data, centroids, labels)
print(f"SSE: {sse}")


# 绘制数据点
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', label='Data Points')
plt.scatter(centroids[:, 0], centroids[:, 1], marker='X', color='red', s=200, label='Centroids')

# 添加标题和标签
plt.title('Data Points and Centroids')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')

# 添加图例
plt.legend()

# 显示图形
plt.show()

2.Silhouette Coefficient

Silhouette Coefficient(轮廓系数)是一种用于评估聚类质量的指标,它同时考虑了簇内的紧密度和簇间的分离度。Silhouette Coefficient 的取值范围在 [-1, 1] 之间:

  • 接近1表示样本被正确地分配到了簇中。
  • 接近0表示样本位于簇的边界上。
  • 接近-1表示样本被错误地分配到了相邻的簇中。

具体计算方法如下:

对于每个样本 i i i,计算以下两个值:

  • a ( i ) a(i) a(i) 表示样本 i i i 到同一簇中所有其他样本的平均距离(簇内平均距离)。
  • $b(i) $表示样本 i i i 到最近簇中所有样本的平均距离(簇间平均距离)。

对于样本 i i i,Silhouette Coefficient 计算如下:
s ( i ) = b ( i ) − a ( i ) m a x ( a ( i ) , b ( i ) ) s(i)=\frac{b(i)-a(i)}{max(a(i),b(i))} s(i)=max(a(i),b(i))b(i)a(i)
最终的 Silhouette Coefficient 是所有样本的 s ( i ) s(i) s(i) 的均值。Silhouette Coefficient 的优点之一是它不需要事先知道聚类的数量,因此可以在不同的聚类数量下评估聚类的效果,帮助选择最优的聚类数量。需要注意的是,Silhouette Coefficient 对于凸形簇效果较好,但对于非凸形簇可能不太适用。Silhouette Coefficient 在其他聚类算法中的功能和作用如下:

  1. 衡量聚类效果: Silhouette Coefficient 提供了一种对聚类效果的定量评估。它能够指示聚类结果的紧密性和分离性,越接近1表示聚类效果越好。
  2. 选择最优聚类数量(K值): Silhouette Coefficient 不需要事先知道聚类的数量,因此可以在不同的K值下评估聚类的效果,帮助选择最优的聚类数量。
  3. 辅助于数据可视化和解释: 在可视化和解释聚类结果时,Silhouette Coefficient 可以提供一个客观的评估指标,帮助理解聚类的效果。

在Python中,你可以使用scikit-learn库来计算Silhouette Coefficient。scikit-learn提供了一个名为silhouette_score的函数,可以方便地计算给定数据集和聚类结果的Silhouette Coefficient。

from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
import numpy as np

# 假设 data, labels 已经定义

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
labels = np.array([0, 0, 1, 1, 1])  # 每个数据点所属的簇

# 使用KMeans聚类算法进行聚类
kmeans = KMeans(n_clusters=2, random_state=0).fit(data)
labels = kmeans.labels_

# 计算Silhouette Coefficient
score = silhouette_score(data, labels)
print(f"Silhouette Coefficient: {score}")

获得结果Silhouette Coefficient: 0.46761904761904766

3.DBI(Davies-Bouldin Index)

Davies-Bouldin Index(DBI)是一种用于评估聚类结果的指标,它通过考虑簇内的紧密度和簇间的分离度来提供一个聚类质量的度量。DBI 的计算方法如下:

对于每个簇 i i i,计算以下两个值:

  • R i R_{i} Ri 表示簇 i i i 中所有样本到簇质心的平均距离(簇内平均距离)。
  • 对于所有不同于簇 i i i 的簇 j j j,计算簇 i i i 的质心与簇 j j j 的质心之间的距离 d ( i , j ) d(i,j) d(i,j)

对于簇 i i i,计算 DBI 如下:
D B i = 1 K − 1 ∑ j = 1 , j ! = j K ( R i + R j d ( i , j ) ) DB_{i}=\frac{1}{K-1}∑^K_{j=1,j!=j}(\frac{R_{i}+R_{j}}{d(i,j)}) DBi=K11j=1,j!=jK(d(i,j)Ri+Rj)
最终的 Davies-Bouldin Index 是所有簇的 D B i DB_{i} DBi的最大值。DBI 的取值范围是 [ 0 , + ∞ ) [0,+∞) [0,+),越小表示聚类结果越好。

在Python中,你可以使用scikit-learn库来计算Davies-Bouldin Index(DBI)。scikit-learn提供了一个名为davies_bouldin_score的函数,可以方便地计算给定数据集和聚类结果的DBI。

from sklearn.metrics import davies_bouldin_score
from sklearn.cluster import KMeans
import numpy as np

# 假设 data, labels 已经定义

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
labels = np.array([0, 0, 1, 1, 1])  # 每个数据点所属的簇

# 使用KMeans聚类算法进行聚类
kmeans = KMeans(n_clusters=2, random_state=0).fit(data)
labels = kmeans.labels_

# 计算DBI
score = davies_bouldin_score(data, labels)
print(f"Davies-Bouldin Index: {score}")

输出Davies-Bouldin Index:0.467

4.CH(Calinski-Harabasz)指数

Calinski-Harabasz指数(CH指数)是一种用于评估聚类结果的指标,它通过比较簇内的紧密度与簇间的分离度来提供一个聚类质量的度量。CH指数的计算方法基于以下公式:
C H = B ( k ) W ( k ) ∗ N − k k − 1 CH=\frac{B(k)}{W(k)}*\frac{N-k}{k-1} CH=W(k)B(k)k1Nk
其中:

  • B ( k ) B(k) B(k)是簇间的方差(簇间平方和)。
  • W ( k ) W(k) W(k)是簇内的方差(簇内平方和)。
  • N N N是样本总数。
  • k k k是簇的数量。

具体计算方法如下:

计算簇内平方和(Within-Cluster Sum of Squares W ( k ) W(k) W(k):对于每个簇 C i C_{i} Ci,计算簇内所有样本到簇质心的距离的平方和,然后对所有簇的结果进行求和。
W ( k ) = ∑ i = 1 k ∑ x ∈ C ∣ ∣ x − μ i ∣ ∣ 2 W(k)=∑^k_{i=1}∑_{x∈C}||x-μ_{i}||^2 W(k)=i=1kxC∣∣xμi2
其中 ∣ ∣ x − μ i ∣ ∣ 2 ||x-μ_{i}||^2 ∣∣xμi2是样本 i i i 到簇 C i C_{i} Ci的质心 μ i μ_{i} μi的距离。

计算簇间平方和(Between-Cluster Sum of Squares) B ( K ) B(K) B(K):计算所有簇的质心之间的距离的平方和。
B ( k ) = ∑ i = 1 k n i ∣ ∣ μ i − μ ∣ ∣ 2 B(k)=∑^k_{i=1}n_{i}||μ_{i}-μ||^2 B(k)=i=1kni∣∣μiμ2
其中 n i n_{i} ni是簇 C i C_{i} Ci中的样本数量,μ 是所有样本的均值, μ i μ_{i} μi是簇 C i C_{i} Ci的质心。具体来说:

  • CH指数越大,表示簇内的样本之间越紧密,簇之间的间隔越大,说明聚类效果越好。
  • CH指数越小,表示簇内的样本之间越松散,簇之间的间隔越小,可能是由于聚类数量过多或者聚类质量不佳。

根据CH指数来选择最佳的K值的一般思路是:

  1. 对于给定的数据集,尝试不同的K值,分别进行聚类。
  2. 对每个K值计算对应的CH指数。
  3. 选择具有最大CH指数的K值,因为这表示了最优的聚类效果。
  4. 需要注意的是,选择K值时不一定选择CH指数最大的K值,还需要结合实际业务需求和对聚类结果的理解来综合考虑。

Python代码实现如下:

from sklearn.metrics import calinski_harabasz_score
from sklearn.cluster import KMeans
import numpy as np

# 假设 data, labels 已经定义

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
labels = np.array([0, 0, 1, 1, 1])  # 每个数据点所属的簇

# 使用KMeans聚类算法进行聚类
kmeans = KMeans(n_clusters=2, random_state=0).fit(data)
labels = kmeans.labels_

# 计算CH指数
score = calinski_harabasz_score(data, labels)
print(f"Calinski-Harabasz Index: {score}")

输出Calinski-Harabasz Index: 9.0

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。

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

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

相关文章

SuperMap iServer 11i(2023)安全性提升汇总

作者:lisong 目录 账户信息合规度校验规则扩展功能图片验证码登录功能Web服务提供者密码加密数据库密码加密漏洞修复 SuperMap iServer 11i(2023)产品安全性相关的提升众多,涵盖账户安全、服务安全以及漏洞修复等方面,…

2023杭州·云栖大会:我在云栖看数智中国

目录 模型即服务(MaaS,Model as a Service)全球首个李白数字展我在云栖看数智中国 云栖之眼、视频云3D渲染、数字人…… 10月31日到11月2日,2023云栖大会在杭州市西湖区云栖小镇火热进行,本次的主题为“ 计算&#xff…

YOLO目标检测——红外多目标检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:自动驾驶、安防监控等数据集说明:红外多目标检测数据集,真实场景的高质量图片数据,数据场景丰富,含有行人、汽车、自行车、摩托、消防栓、指示牌、狗等图片标签说明:使用lableimg标注软件标注…

题解数量上三百了

题解数量上三百了 持之以恒,不断进步。

近独立粒子的最概然分布

近独立粒子:粒子之间相互作用微弱基本粒子中,自旋量子数为半整数的有 电子 、 质子 、中子、中微子自旋量子数为整数的有 光子、pi介子 经典力学描述系统的微观运动状态 经典力学中,全同粒子可以分辨量子力学,全同粒子不可以分辨微…

JMeter接口测试性能测试

目前最新版本发展到5.0版本,需要Java7以上版本环境,下载解压目录后,进入\apache-jmeter-5.0\bin\,双击ApacheJMeter.jar文件启动JMemter。 1、创建测试任务 添加线程组,右击测试计划,在快捷菜单单击添加-…

【腾讯云 HAI域探秘】基于ChatGLM和StableDiffusion的小学一年级语文教学方案创作实践与经验分享

前言 目前腾讯云HAI正在内测中,腾讯云HAI为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。在 HAI 中,根据应用智能匹配并推选出最适合的GPU算力资源,以确保您在数据科学、LLM、AI作画等高性能应用…

Java 算法篇-深入了解二分查找法

🔥博客主页: 小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍ 目录 1.0 二分查找法的说明 2.0 二分查找实现的多种版本 2.1 二分查找的基础版本 2.2 二分查找的改动版本 2.3 二分查找的平衡版本 2.4 二分查找的官方版本 3.0 二分查找的应用 1…

OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介【C++的OpenCV 第十五课】

🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖 C\Python所有的入…

项目管理之如何分配项目工作任务

项目资源配置技术是项目管理中至关重要的环节,它直接影响到项目的效率、质量以及最终的成果。本文将介绍项目资源配置技术,包括小组团队主管配置、保持团队规模小型化、保持团队人员能力均衡、为保证团队速度及质量,团队资源复用数量限制以及…

智能工厂架构

引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <

Leetcode—2103.环和杆【简单】

2023每日刷题&#xff08;十六&#xff09; Leetcode—2103.环和杆 实现代码 struct ring{int r;int g;int b; }sticks[10]{0};int countPoints(char * rings){char *p rings;int i;for(i 0; i < 10; i) {sticks[i].r 0;sticks[i].g 0;sticks[i].b 0;}while(*p ! \0)…

大厂面试题-为什么Netty线程池默认大小为CPU核数的2倍

目录 1、分析原因 2、如何衡量性能指标 3、总结与使用建议 1、分析原因 我们都知道使用多线程的本质是为了提升程序的性能&#xff0c;总体来说有两个最核心的指标&#xff0c;一个延迟&#xff0c;一个吞吐量。延迟指的是发出请求到收到响应的时间&#xff0c;吞吐量指的是…

【golang】Reflect反射整理、值修改、反射结构体、应用

Reflect 整理 反射是用程序检查其所拥有的结构&#xff0c;尤其是类型的一种能力&#xff1b;这是元编程的一种形式。反射可以在运行时检查类型和变量&#xff0c;例如&#xff1a;它的大小、它的方法以及它能“动态地”调用这些方法。这对于没有源代码的包尤其有用。这是一个强…

C++引用概述

变量名实质上是一段连续存储空间的别名&#xff0c;是一个标号(门牌号)&#xff0c;程序中通过变量来申请并命 名内存空间&#xff0c;通过变量的名字可以使用存储空间。引用是 C中新增加的概念&#xff0c;引用可以看作 一个已定义变量的别名。 引用的语法&#xff1a; Type&…

第二章 探究活动Activity

一、Activity的用法 1. Activity 任何活动都应该重写Activity的onCreate()方法 项目中在res添加任何资源都会在R文件生成一个相应的资源id 所有的活动都要在AndroidManifest.xml中进行注册才能生效 <activityandroid:name".FirstActivity"android:label"T…

性能测试 —— Jmeter日志查看与分析

一、Jmeter日志概览 Jmeter日志文件保存在bin目录中&#xff0c;名称为jmeter.log。我们可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起 另外&#xff0c;Jmeter可以很方便地设置日志输出级别&#xff1a; 通过这种方式修…

MySQL-----事务

事务的概念 事务是一种机制&#xff0c;一个操作序列。包含了一组数据库的操作命令&#xff0c;所有的命令都是一个整体&#xff0c;向系统提交或者撤销的操作&#xff0c;要么都执行&#xff0c;要么都不执行。 是一个不可分割的单位 事务的ACID特点 ACID&#xff0c;是指在可…

【Spring】配置文件-properties和xml

文章目录 1. 前言2. properties配置文件3. xml配置文件4. 总结 1. 前言 在Spring中,配置文件有两种,properties配置文件和xml配置文件 properties配置文件&#xff0c;在Java编程中是一种常见的配置文件形式&#xff0c;文件后缀为“.properties”&#xff0c;属于文本文件。它…

LeetCode算法题解|​ 669. 修剪二叉搜索树​、108. 将有序数组转换为二叉搜索树、​538. 把二叉搜索树转换为累加树​

一、LeetCode 669. 修剪二叉搜索树​ 题目链接&#xff1a;669. 修剪二叉搜索树 题目描述&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变…