机器学习中10种损失函数大梳理!建议收藏,你一定用得到

news2024/12/24 9:25:39

今儿想和大家聊聊关于损失函数方面的问题。

损失函数(Loss Function)是在机器学习和深度学习中用来衡量模型预测值与真实标签之间差异的函数。不同的任务和模型可能需要不同的损失函数。

今天就聊聊下面常见的损失函数,关于原理、使用场景,并且给出完整的代码:

  • 均方误差

  • 平均绝对误差

  • 交叉熵损失

  • 对数损失

  • 多类别交叉熵损失

  • 二分类交叉熵损失

  • 余弦相似度损失

  • 希尔伯特-施密特口袋

  • Huber损失

  • 感知器损失

ok,咱们一起来学习一下~

1、均方误差

均方误差是一种常用的损失函数,通常用于衡量回归模型预测结果与真实值之间的差异程度。

均方误差是通过计算预测值与真实值之间差异的平方和来衡量模型的性能。它对于较大的差异给予更高的权重,因为平方操作会放大较大的差异。均方误差的数值越小,表示模型预测的结果与真实值越接近。

均方误差的公式:

import numpy as np
import matplotlib.pyplot as plt

# 真实值和预测值
y_true = np.array([1, 2, 3, 4, 5])
y_pred = np.array([1.2, 2.5, 3.7, 4.1, 5.3])

# 计算均方误差
mse = np.mean((y_true - y_pred) ** 2)
print("MSE:", mse)

# 绘制真实值和预测值的散点图
plt.scatter(y_true, y_pred)
plt.plot([min(y_true), max(y_true)], [min(y_true), max(y_true)], 'k--', lw=2)  # 绘制直线y=x
plt.xlabel('True Values')
plt.ylabel('Predicted Values')
plt.title('Scatter plot of True vs Predicted Values')
plt.show()

运行这段代码将计算出均方误差,并绘制出一个散点图,其中x轴表示真实值,y轴表示预测值。通过与直线y=x进行比较,可以看到预测值与真实值之间的差异程度。较接近直线的点表示预测结果较准确。

2、平均绝对误差

平均绝对误差(Mean Absolute Error,MAE)是一种用于衡量预测模型性能的损失函数,通常用于回归问题。它衡量了模型的预测值与实际观测值之间的平均绝对差异。MAE 的值越小,表示模型的预测越准确。

MAE 的原理非常简单,它是所有绝对误差的平均值。绝对误差是指每个观测值的预测值与实际值之间的差的绝对值。

平均绝对误差的计算公式:


 

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
n = 50
X = np.linspace(0, 10, n)
y_true = 2 * X + 1 + np.random.normal(0, 1, n)  # 真实的目标值,包含随机噪音
y_pred = 2 * X + 1.5  # 模拟的预测值

# 计算MAE
mae = np.mean(np.abs(y_true - y_pred))

# 绘制数据点和预测线
plt.scatter(X, y_true, label='Actual', color='b')
plt.plot(X, y_pred, label='Predicted', color='r')
plt.title(f'MAE = {mae:.2f}')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()

代码中,首先生成了一些随机的数据点,然后计算了 MAE,并用散点图和预测线将数据可视化出来。MAE 的值会显示在图的标题中。

通过这个示例,你可以直观地了解 MAE 的计算和它如何衡量模型的性能。MAE 越小,预测值越接近实际值。

3、交叉熵损失

交叉熵损失(Cross-Entropy Loss)是机器学习中常用的一种损失函数,主要应用于分类问题。它用于衡量模型预测结果与实际标签之间的差异。

交叉熵损失基于信息论中的交叉熵概念,用于度量两个概率分布之间的相似性。在分类问题中,我们将实际标签表示为一个one-hot向量,即只有一个元素为1,其余元素为0;而模型的预测结果通常是一个概率分布。交叉熵损失通过计算实际标签和模型预测结果之间的交叉熵来评估模型的性能。

对于多分类问题,交叉熵损失可以表示为:

其中,为实际标签中第个类别的概率(one-hot编码),为模型预测的第个类别的概率。

一个Python案例

以下是一个多分类问题的例子,使用交叉熵损失进行模型训练:

import numpy as np
import matplotlib.pyplot as plt

def cross_entropy_loss(y_true, p_pred):
    epsilon = 1e-10  # 添加一个小的常数以避免log(0)计算错误
    return -np.sum(y_true * np.log(p_pred + epsilon), axis=1)

# 模拟数据
num_samples = 1000
num_classes = 5

np.random.seed(42)
y_true = np.eye(num_classes)[np.random.choice(num_classes, num_samples)]  # 生成随机的one-hot标签
p_pred = np.random.rand(num_samples, num_classes)  # 模型预测的概率

loss = cross_entropy_loss(y_true, p_pred)

# 计算平均损失
average_loss = np.mean(loss)

# 绘制损失函数图形
plt.plot(range(num_samples), loss, 'bo', markersize=2)
plt.xlabel('Sample')
plt.ylabel('Cross-Entropy Loss')
plt.title('Cross-Entropy Loss for each Sample')
plt.axhline(average_loss, color='r', linestyle='--', label='Average Loss')
plt.legend()
plt.show()

print(f'Average Loss: {average_loss}')

代码中,首先定义了一个cross_entropy_loss函数来计算交叉熵损失。然后,我们模拟了一个多分类问题的数据集,其中包含1000个样本和5个类别。接下来,使用该函数计算模型预测结果和实际标签之间的交叉熵损失,并计算平均损失。最后,使用Matplotlib库绘制了每个样本的交叉熵损失,并在图形中用一条红色虚线表示平均损失。

在实际应用中,通常会结合优化算法(如梯度下降)来最小化交叉熵损失,并优化模型的预测性能。

4、对数损失

对数损失(Log Loss),也称为二分类交叉熵损失,是机器学习中常用的一种损失函数之一,主要适用于二分类问题。它用于衡量模型预测结果与实际标签之间的差异。

对数损失基于信息论中的交叉熵概念,用于度量两个概率分布之间的相似性。在二分类问题中,通常使用0和1表示实际标签,而模型的预测结果是一个介于0和1之间的概率值。对数损失通过计算实际标签和模型预测结果的交叉熵来评估模型的性能。

对数损失可以表示为:

import numpy as np
import matplotlib.pyplot as plt

def log_loss(y_true, p_pred):
    epsilon = 1e-10  # 添加一个小的常数以避免log(0)计算错误
    return - (y_true * np.log(p_pred + epsilon) + (1 - y_true) * np.log(1 - p_pred + epsilon))

# 模拟数据
num_samples = 1000

np.random.seed(42)
y_true = np.random.randint(2, size=num_samples)  # 随机生成0和1的实际标签
p_pred = np.random.rand(num_samples)  # 模型预测的概率

loss = log_loss(y_true, p_pred)

# 计算平均损失
average_loss = np.mean(loss)

# 绘制损失函数图形
plt.plot(range(num_samples), loss, 'bo', markersize=2)
plt.xlabel('Sample')
plt.ylabel('Log Loss')
plt.title('Log Loss for each Sample')
plt.axhline(average_loss, color='r', linestyle='--', label='Average Loss')
plt.legend()
plt.show()

print(f'Average Loss: {average_loss}')

5、多类别交叉熵损失

多类别交叉熵损失是机器学习中常用的一种损失函数,用于衡量模型输出与真实标签之间的差异。它适用于多分类问题,其中每个样本有一个唯一的类别标签。

该损失函数通过计算模型预测的概率分布与真实标签的概率分布之间的交叉熵来度量它们之间的差异。交叉熵是一个非负的值,当且仅当预测的概率分布与真实标签完全匹配时为零。

假设我们有一个样本,其真实标签表示为一个one-hot向量(只有一个元素为1,其他元素为0)。假设模型的输出是一个概率分布向量,表示模型对每个类别的预测概率。则多类别交叉熵损失的公式如下:

其中, 是真实标签向量中第个元素的值(0或1), 是模型输出的概率分布向量中第个元素的值。

一个Python案例

下面是一个使用Python实现的多类别交叉熵损失的案例。

import numpy as np
import matplotlib.pyplot as plt

def categorical_cross_entropy(y_true, y_pred):
    # 避免出现概率为0的情况,加上一个小的偏移量
    epsilon = 1e-7
    # 计算交叉熵损失
    loss = -np.sum(y_true * np.log(y_pred + epsilon))
    return loss

# 生成随机的真实标签和预测概率分布
np.random.seed(42)
num_classes = 4
num_samples = 1000
y_true = np.random.randint(num_classes, size=num_samples)
y_pred = np.random.rand(num_samples, num_classes)

# 将真实标签转换为one-hot向量
y_true_one_hot = np.eye(num_classes)[y_true]

# 计算多类别交叉熵损失
loss = categorical_cross_entropy(y_true_one_hot, y_pred)
print("Loss:", loss)

# 绘制损失函数的图形
x = np.arange(0.01, 1.0, 0.01)
y = -np.log(x)
plt.plot(x, y)
plt.xlabel("Predicted Probability")
plt.ylabel("Loss")
plt.title("Categorical Cross-Entropy Loss")
plt.show()

在这个案例中,我们首先生成了随机的真实标签和预测概率分布。然后将真实标签转换为one-hot向量,以便与预测概率分布进行计算。

最后,使用categorical_cross_entropy函数计算多类别交叉熵损失,并输出结果。

同时,我们将绘制损失函数图形,其中横轴表示预测的概率,纵轴表示对应的损失值。

6、二分类交叉熵损失

二分类交叉熵损失是机器学习中常用的一种损失函数,适用于二分类问题,其中每个样本只有两个可能的类别。

该损失函数通过计算模型输出的概率与真实标签之间的交叉熵来衡量它们之间的差异。交叉熵是一个非负的值,当且仅当预测的概率与真实标签一致时为零。

假设我们有一个样本,其真实标签表示为0或1。假设模型的输出是一个[0, 1]范围内的概率,表示模型对类别1的预测概率。则二分类交叉熵损失的公式如下:


 

import numpy as np
import matplotlib.pyplot as plt

def binary_cross_entropy(y_true, y_pred):
    # 避免出现概率为0或1的情况,加上一个小的偏移量
    epsilon = 1e-7
    # 计算交叉熵损失
    loss = -y_true * np.log(y_pred + epsilon) - (1 - y_true) * np.log(1 - y_pred + epsilon)
    return loss

# 生成随机的真实标签和预测概率
np.random.seed(42)
num_samples = 1000
y_true = np.random.randint(2, size=num_samples)
y_pred = np.random.rand(num_samples)

# 计算二分类交叉熵损失
loss = binary_cross_entropy(y_true, y_pred)
print("Loss:", loss[:10])  # 打印前10个样本的损失值

# 绘制损失函数的图形
x = np.linspace(0.01, 0.99, 100)
y = -np.log(x) - np.log(1 - x)
plt.plot(x, y)
plt.xlabel("Predicted Probability")
plt.ylabel("Loss")
plt.title("Binary Cross-Entropy Loss")
plt.show()

在这个案例中,我们首先生成了随机的真实标签和预测概率。然后使用binary_cross_entropy函数计算二分类交叉熵损失,并输出结果。同时,我们将绘制损失函数图形,其中横轴表示预测的概率,纵轴表示对应的损失值。

7、余弦相似度损失

余弦相似度损失是一种常用的机器学习损失函数,用于衡量向量之间的相似性。它基于向量的内积和范数来计算相似度,并将其转化为一个损失值。

余弦相似度损失基于余弦相似度的概念。余弦相似度是两个向量之间的夹角的余弦值,范围在-1到1之间。当夹角为0度时,余弦相似度为1,表示两个向量完全相同;当夹角为90度时,余弦相似度为0,表示两个向量无关;当夹角为180度时,余弦相似度为-1,表示两个向量完全相反。

公式表达:假设有两个向量A和B,余弦相似度可以通过以下公式计算:

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
x = np.linspace(-10, 10, 100)
y_true = np.sin(x) + np.random.normal(0, 0.1, size=(100,))

# 定义交叉熵损失函数
def cross_entropy_loss(y_true, y_pred):
    epsilon = 1e-7  # 避免log(0)的情况
    loss = -np.mean(y_true * np.log(y_pred + epsilon) + (1 - y_true) * np.log(1 - y_pred + epsilon))
    return loss

# 假设预测值为正弦函数
y_pred = np.sin(x)

# 计算交叉熵损失
loss = cross_entropy_loss(y_true, y_pred)

# 绘制图形
plt.plot(x, y_true, label='True')
plt.plot(x, y_pred, label='Predicted')
plt.title(f'Cross Entropy Loss: {loss:.4f}')
plt.legend()
plt.show()

上述代码生成了一个包含随机噪声的正弦函数作为真实值,并假设预测值也是正弦函数。通过交叉熵损失函数计算出损失值,并用图形表示出真实值和预测值。注意,这里的交叉熵损失函数假设了二分类问题,因此y_true和y_pred都是取值在0到1之间的概率值。

未完待续。。

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

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

相关文章

高效调度新篇章:详解DolphinScheduler 3.2.0生产级集群搭建

转载自tuoluzhe8521 导读:通过简化复杂的任务依赖关系, DolphinScheduler为数据工程师提供了强大的工作流程管理和调度能力。在3.2.0版本中,DolphinScheduler带来了一系列新功能和改进,使其在生产环境中的稳定性和可用性得到了显著…

Apache2.4和PHP8的量子纠缠

Apache不建议你用,PHP建议使用

更新Windows 11 后遇到的一些问题(更新中...)

目录 插入U盘后读取不到 在磁盘中新建文件夹需要管理员权限 导致不能安装一些软件 插入U盘后读取不到 解决方法:点击我的电脑或者是此电脑、选择管理、找到设备管理器、选择通用串行总线控制器、右键、选择启动。 第一步:点击我的电脑或者是此电脑、选…

Java类和对象(二)—— 封装,static 关键字与代码块

前言 在面向对象的编程语言中,有三大特性:封装、继承和多态~~ 今天我们就来学习封装的知识 封装 什么是封装 在现实生活中,我们经常使用手机来进行沟通与交流,实际上我们拿到的手机是被封装好的,精美的屏幕&a…

MYSQL和JAVA中将中文汉字按照拼音首字母排序

一、MYSQL将中文汉字按照拼音首字母排序 数据库使用的字符编码是utf8_general_ci,如下 ORDER BY CONVERT(表名.字段名 USING gbk) COLLATE gbk_chinese_ci ASC;若是表查询,CONVERT中可以不添加表名。 查询结果如下: 二、JAVA中将中文汉字…

自定义 Gradle 插件进行统一的静态代码分析

静态代码分析是一项了不起的技术, 它能让代码库更易于维护. 但是, 如果你在不同的版本库中拥有多个服务(可能由不同的团队开发), 如何才能让每个人都遵循既定的代码风格呢? 一个好办法是将所有规则封装在一个插件中, 该插件会在每个项目构建时自动执行所需的验证. 因此, 在本…

【2024系统架构设计】回顾历史,查缺补漏篇 ③

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起集中精力学习干货吧! 💡…

Milvus的存储/计算分离

前言 根据数据面与控制面相隔离的原则,从可扩展性和灾难恢复来看,Milvus由4个相互独立的层组成 访问层 由一系列无状态的代理组成,访问层是系统和用户之间的第一层,它主要是验证客户端请求和规整返回的结果 代理是无状态的&am…

GPU学习记一下线程分组相关

在compute的时候,是要dispatch一个数量的代表分了多少块任务集,dispatch的块内部也是有一个数量的,那么这些值怎么取的呢 内部,N卡32 外面dispatch的数量就是all/32 然后细说这个值 这有一个叫core的东西,就是相当于th…

【opencv】答题卡判分实验

实验环境: anaconda、jupyter notebook 实验用的包:numpy、matplotlib、opencv 实验的目的还是以熟悉图像的透视变换、轮廓特征提取为主要目的 关于如何判断答题卡被选项:通过几个覆盖备选项的掩膜与原二值图像想与,最终整个图像…

Springboot+MybatisPlus如何实现带验证码的登录功能

实现带验证码的登录功能由两部分组成::1、验证码的获取 2、登录(进行用户名、密码和验证码的判断) 获取验证码 获取验证码需要使用HuTool中的CaptchaUtil.createLineCaptcha()来定义验证码的长度、宽度、验证码位数以及干扰线…

性能测试工具—jmeter的基础使用

1.Jmeter三个重要组件 1.1线程组的介绍: 特点: 模拟用户,支持多用户操作多个线程组可以串行执行,也可以并行执行 线程组的分类: setup线程组:前置处理,初始化普通线程组:编写…

遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录 TIF图像转JPGTIF标签转PNG图像重叠裁剪图像重命名数据集转COCO格式数据集转VOC格式 遥感图像不同于一般的自然图像,由于波段数量、图像位深度等原因,TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例,制作能够直接用…

你了解 pom.xml 吗

你了解pomxml吗 springboot 是 java 利器&#xff0c;几乎每个写 java 的同学都会用&#xff0c;但是你了解 pom.xml 吗&#xff1f; 这篇干货查漏补缺。 首先我们创建个 springboot 项目 都选了默认设置&#xff1a; 我把这篇完整粘贴出来 pom.xml <?xml version&quo…

网络安全|隐藏IP地址的5种不同方法

隐藏计算机的IP地址在互联网在线活动种可以保护个人隐私&#xff0c;这是在线活动的一种常见做法&#xff0c;包括隐私问题、安全性和访问限制内容等场景。那么如何做到呢?有很5种方法分享。每种方法都有自己的优点和缺点。 1. 虚拟网络 当您连接到虚拟服务器时&#xff0c;您…

JVM内存模型最新面试题(持续更新)

问题&#xff1a;java中创建的对象一般放在哪里&#xff1f;(全流程包含从创建到回收) 回答 大部分对象在堆中&#xff0c;这个基本都知道&#xff1b; 少部分对象是会在栈中的&#xff0c;比如作用域不局限于方法内的方法内部变量&#xff0c;这类对象的特征一般就是生命周期…

第33次CSP认证Q3:化学方程式配平

&#x1f344;题目描述 为了配平一个化学方程式&#xff0c;我们可以令方程式中各物质的系数为未知数&#xff0c;然后针对涉及的每一种元素&#xff0c;列出关于系数的方程&#xff0c;形成一个齐次线性方程组。然后求解这个方程组&#xff0c;得到各物质的系数。这样&#x…

【C语言】通讯录系统实现

目录 1、通讯录系统介绍 2、代码分装 3、代码实现步骤 3.1制作菜单函数以及游戏运行逻辑流程 3.2、封装人的信息PeoInfo以及通讯录Contact结构体类型 3.3、初始化通讯录InitContact函数 3.4、增加联系人AddContact函数 3.5、显示所有联系人ShowContact函数 3.6、删除联系人D…

视频号小店是个风口吗?今年去做是明智的选择吗?一篇详解!

大家好&#xff0c;我是电商小V 视频号才刚刚推出一年半的时间&#xff0c;可以说自从推出之后这个项目的知名度一直是处于飙升的状态&#xff0c;一直处于爆火的状态&#xff0c;也是吸引了很多想做电商&#xff0c;想去创业的小伙伴&#xff0c;最主要的就是视频号小店背靠的…

流程图用什么软件做?选择这4款,让工作事半功倍

流程图用什么软件做&#xff1f;流程图是一种直观、清晰的图形表示法&#xff0c;它通过节点、箭头和符号等元素&#xff0c;精确地展示出一系列步骤、决策点以及操作过程。这种图形化的呈现方式不仅简化了复杂信息的处理&#xff0c;还使得读者能够迅速把握整体流程&#xff0…