L1和L2损失函数(L1 and L2 loss function)及python实现

版权声明:未经允许,禁止转载 https://blog.csdn.net/weixin_43216017/article/details/88017122

       在我们做机器学习的时候,经常要选择损失函数,常见的损失函数有两种:L1-norm loss function和L2-norm loss function。

       需要注意的是,损失函数(loss function)和正则化(regularity)是两种不同的东西,虽然思路类似,但是他们却有着完全不同的作用和目的。本文主要讲损失函数。

L1和L2正则化讲解


L1和L2 损失函数定义

L1损失函数

       使用L1损失函数也被叫做最小化绝对误差(Least Abosulote Error)。这个名称非常的形象。LAE就是最小化真实值 y i y_i 和预测值 f ( x i ) f(x_i) 之间差值 D L 1 D_{L1} 绝对值的和。
D L 1 = i = 1 n y i f ( x i ) D_{L1} = \sum_{i=1}^{n}|y_i-f(x_i)|
       这里的 D L 1 D_{L1} 其实就是平均绝对误差(MAE)
       使用L1损失函数也就是 min D L 1 \min{D_{L1}}


L2损失函数

       使用L2损失函数也被叫做最小化平方误差(Least Square Error)。LSE就是最小化真实值 y i y_i 和预测值 f ( x i ) f(x_i) 之间差值 D L 1 D_{L1} 平方的和。
D L 2 = i = 1 n ( y i f ( x i ) ) 2 D_{L2} = \sum_{i=1}^{n}(y_i-f(x_i))^2
       这里的 D L 2 D_{L2} 其实就是平均绝对误差(MAE)
       使用L2损失函数也就是 min D L 2 \min{D_{L2}}


L1和L2 损失函数区别

       L2损失函数是最最常用的损失函数,在回归问题中,也就是我们耳熟能详的最小二乘法。并且在满足高斯马尔可夫条件的时候,可以证明使用L2损失函数所得的参数具有无偏性和有效性。

       但是,L1损失函数也有其自己的优点,下面我们对两个损失函数进行比较。

L1 L2
稳健性高 稳健性一般
没有稳定的解 有稳定的解
可能会得到多组解 只有一个解
稳健性

       L1损失函数稳健性强是它最大的优点。面对误差较大的观测,L1损失函数不容易受到它的影响。这是因为:L1损失函数增加的只是一个误差,而L2损失函数增加的是误差的平方。当误差较大时,使用L2损失函数,我们需要更大程度的调整模型以适应这个观测,所以L2损失函数没有L1损失函数那么稳定。
       那么,当我们认为模型中可能存在异常值时,使用L1损失函数可能会更好;但是,当我们需要把误差较大的观测也纳入模型中时,使用L2损失函数更好一些。

解的稳定性

       首先,从求解效率上来说,L2损失函数处处可导,而L1损失函数在零点位置是不可导的,这就使得使用L2损失函数求解可以得到一个解析解,而L1损失函数则没有;
       其次,当数据有一个微小的变化时,L1损失函数的变化更大,其解更加的不稳定。


python numpy实现

import numpy as np
#定义L1损失函数
def L1_loss(y_true,y_pre): 
    return np.sum(np.abs(y_true-y_pre))
#定义L2损失函数
def L2_loss(y_true,y_pre):
    return np.sum(np.square(y_true-y_pre))

#假设我们得到了真实值和预测值
y_true = np.array([1,2,3,4,5,6,7,8,9])
y_pre  = np.array([1.2,2.3,3.5,4.3,4.6,5.6,6.1,7.1,8.8])

#定义函数
print('L1 loss is {}'.format(L1_loss(y_true,y_pre)))
"""L1 loss is 4.1000000000000005"""
print('L2 loss is {}'.format(L2_loss(y_true,y_pre)))
"""L2 loss is 2.450000000000001"""

猜你喜欢

转载自blog.csdn.net/weixin_43216017/article/details/88017122