损失函数python实现
下面是用 Python 实现上述常见损失函数的代码示例。我们将使用 NumPy 库来进行数值计算。
首先,确保你已经安装了 NumPy:
pip install numpy
然后,我们可以编写实现这些损失函数的代码:
import numpy as np
def mean_squared_error(y_true, y_pred):
"""
均方误差 (MSE)
:param y_true: 真实值,形状为 (N,)
:param y_pred: 预测值,形状为 (N,)
:return: MSE
"""
return np.mean((y_true - y_pred) ** 2)
def binary_cross_entropy(y_true, y_pred):
"""
二分类交叉熵 (BCE)
:param y_true: 真实标签,形状为 (N,)
:param y_pred: 预测概率,形状为 (N,)
:return: BCE
"""
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15) # 防止 log(0)
return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
def categorical_cross_entropy(y_true, y_pred):
"""
多分类交叉熵 (CCE)
:param y_true: 真实标签,形状为 (N, C),one-hot 编码
:param y_pred: 预测概率,形状为 (N, C)
:return: CCE
"""
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15) # 防止 log(0)
return -np.mean(np.sum(y_true * np.log(y_pred), axis=1))
def mean_absolute_error(y_true, y_pred):
"""
绝对误差 (MAE)
:param y_true: 真实值,形状为 (N,)
:param y_pred: 预测值,形状为 (N,)
:return: MAE
"""
return np.mean(np.abs(y_true - y_pred))
def hinge_loss(y_true, y_pred):
"""
铰链损失 (Hinge Loss)
:param y_true: 真实标签,形状为 (N,),值为 -1 或 1
:param y_pred: 预测值,形状为 (N,)
:return: Hinge Loss
"""
return np.mean(np.maximum(0, 1 - y_true * y_pred))
def huber_loss(y_true, y_pred, delta=1.0):
"""
Huber 损失
:param y_true: 真实值,形状为 (N,)
:param y_pred: 预测值,形状为 (N,)
:param delta: 控制从二次损失到线性损失的过渡点
:return: Huber Loss
"""
error = y_true - y_pred
is_small_error = np.abs(error) <= delta
small_error_loss = 0.5 * error ** 2
large_error_loss = delta * (np.abs(error) - 0.5 * delta)
return np.mean(np.where(is_small_error, small_error_loss, large_error_loss))
def kl_divergence(p, q):
"""
Kullback-Leibler 散度 (KL Divergence)
:param p: 真实分布,形状为 (N,)
:param q: 预测分布,形状为 (N,)
:return: KL Divergence
"""
p = np.clip(p, 1e-15, 1 - 1e-15) # 防止 log(0)
q = np.clip(q, 1e-15, 1 - 1e-15) # 防止 log(0)
return np.sum(p * np.log(p / q))
# 示例数据
y_true = np.array([1, 0, 1, 0])
y_pred = np.array([0.9, 0.1, 0.8, 0.2])
y_true_one_hot = np.array([[0, 1], [1, 0], [0, 1], [1, 0]])
y_pred_prob = np.array([[0.1, 0.9], [0.9, 0.1], [0.2, 0.8], [0.8, 0.2]])
# 计算损失
mse = mean_squared_error(y_true, y_pred)
bce = binary_cross_entropy(y_true, y_pred)
cce = categorical_cross_entropy(y_true_one_hot, y_pred_prob)
mae = mean_absolute_error(y_true, y_pred)
hinge = hinge_loss(2 * y_true - 1, y_pred) # 将 y_true 转换为 -1 和 1
huber = huber_loss(y_true, y_pred)
kl = kl_divergence(y_true, y_pred)
print(f"MSE: {mse}")
print(f"BCE: {bce}")
print(f"CCE: {cce}")
print(f"MAE: {mae}")
print(f"Hinge Loss: {hinge}")
print(f"Huber Loss: {huber}")
print(f"KL Divergence: {kl}")
解释
1. 均方误差 (MSE):计算真实值和预测值之差的平方的平均值。
2. 二分类交叉熵 (BCE):计算真实标签和预测概率之间的交叉熵损失。
3. 多分类交叉熵 (CCE):计算真实标签(one-hot 编码)和预测概率之间的交叉熵损失。
4. 绝对误差 (MAE):计算真实值和预测值之差的绝对值的平均值。
5. 铰链损失 (Hinge Loss):用于支持向量机的分类任务,计算真实标签和预测值之间的铰链损失。
6. Huber 损失:结合了 MSE 和 MAE 的优点,对于小误差使用 MSE,对于大误差使用 MAE。
7. Kullback-Leibler 散度 (KL Divergence):计算两个概率分布之间的差异。
原文地址:https://blog.csdn.net/SPESEG/article/details/142384319
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!