自学内容网 自学内容网

损失函数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)!