欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过一个小例子帮助你理解正则化(附python代码)

程序员文章站 2022-05-12 22:29:49
...

一.L1和L2正则化简单介绍:

1.L1和L2正则化的作用(这一部分摘自网络,我主要是提供后面的代码说明):

通过一个小例子帮助你理解正则化(附python代码)

L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择,一定程度上,L1也可以防止过拟合。

L2正则化可以防止模型过拟合(overfitting)

L2正则化可以直观理解为它对于大数值的权重向量进行严厉惩罚,倾向于更加分散的权重向量。由于输入和权重之间的乘法操作,这样就有一个优良的特性:使网络更倾向于使用所有输入特征,而不是严重依赖输入特征中某些小部分特征。L2惩罚倾向于更小更分散的权重向量,这就会鼓励分类器最终将所有维度上的特征都用起来,而不是强烈依赖其中少数几个维度,这样做可以提高模型的范化能力,降低过拟合的风险。
(转自https://www.cnblogs.com/zhibei/p/12397975.html)

二.代码实现

本例通过两个点拟合出y=ax^2+bx+c曲线,a、b、c为参数,需要我们解出来,当然,会有无数个a、b、c的值满足要求,这就好比深度学习中参数远远多于样本数。正则化可以使得参数的值尽可能接近0。
p1=(x1,y1),p2= (x2,y2)为两个样本点,本例取 p1 = [5, 3],p2= [-3, -9]

1.没有用正则化的例子

损失函数为 L=[a(X1)2+b(x1)+cy1]2+[a(X2)2+b(x2)+cy2]2L = [a(X1)^2+b(x1)+c-y1]^2+ [a(X2)^2+b(x2)+c-y2]^2

下面展示具体代码:
def No_rugularization(e,f):
    '''
    没有用正则化 abc系数都很大
    :param e: e f为传入的两个点,列表形式如[2,4]
    :param f: 同上
    :return: a,b,c。即一元二次方程的三个系数
    '''
    x1=e[0]
    y1=e[1]
    x2=f[0]
    y2=f[1]
    a=-1000000
    c,b=1000 ,1000
    L=(a*x1**2+b*x1+c-y1)**2+(a*x2**2+b*x2+c-y2)**2
    print(L)
    for i in range(100000):
        a = a - (2*(a*x1**2+b*x1+c-y1)*(x1**2)+2*(a*x2**2+b*x2+c-y2)*(x2**2))*0.001
        b = b - (2*(a*x1**2+b*x1+c-y1)*(x1)+2*(a*x2**2+b*x2+c-y2)*(x2))*0.001
        c = c - (2*(a*x1**2+b*x1+c-y1)+2*(a*x2**2+b*x2+c-y2))*0.001
    L1 = (a * x1 ** 2 + b * x1 + c - y1) ** 2 + (a * x2 ** 2 + b * x2 + c - y2) ** 2
    print(L1,'L1')
    print(a,b,c)
    return a,b,c
def testfunction(f):
    p1 = [5, 3]
    p2 = [-3, -9]
    a, b, c = f(p1, p2)
    x = np.arange(-20, 20)
    y = a * x ** 2 + b * x + c
    plt.title("Matplotlib demo")
    plt.xlabel("x axis caption")
    plt.ylabel("y axis caption")
    plt.plot(x, y)
    [a1, b1] = p1 
    [a2, b2] = p2
    plt.plot(a1, b1, 'ob')
    plt.plot(a2, b2, 'ob')
    plt.show()

执行testfunction则得到实验结果

  testfunction(No_rugularization)#实验结果表明所得的系数绝对值很大

所学到的曲线:通过一个小例子帮助你理解正则化(附python代码)

结果为:a=1726.5490931668319,b= -3451.5981863336674,c= -25902.736397502467

1.用了正则化的例子

损失函数为 L=[a(X1)2+b(x1)+cy1]2+[a(X2)2+b(x2)+cy2]2+a2+b2+c2L = [a(X1)^2+b(x1)+c-y1]^2+ [a(X2)^2+b(x2)+c-y2]^2+a^2+b^2+c^2
$$

def ZhengzehuaL2(e,f):
   x1=e[0]
   y1=e[1]
   x2=f[0]
   y2=f[1]
   a=-1000000
   c,b=1000 ,1000#给一个较大初始值
   L=(a*x1**2+b*x1+c-y1)**2+(a*x2**2+b*x2+c-y2)**2+a**2+b**2+c**2
   print(L)
   for i in range(100000):#学习率设为0.001
       a = a - (2*(a*x1**2+b*x1+c-y1)*(x1**2)+2*(a*x2**2+b*x2+c-y2)*(x2**2)+a*2)*0.001
       b = b - (2*(a*x1**2+b*x1+c-y1)*(x1)+2*(a*x2**2+b*x2+c-y2)*(x2)+b*2)*0.001
       c = c - (2*(a*x1**2+b*x1+c-y1)+2*(a*x2**2+b*x2+c-y2)+c*2)*0.001
   L1 = (a * x1 ** 2 + b * x1 + c - y1) ** 2 + (a * x2 ** 2 + b * x2 + c - y2) ** 2
   print(L1,'L1')
   print(a,b,c)
   return a,b,c

执行testfunction再得到实验结果

  testfunction(ZhengzehuaL2)#实验结果表明  正则化 让所得的系数绝对值非常小

通过一个小例子帮助你理解正则化(附python代码)
结果为:a= -0.26734786263984833,b=1.9645605639267882,c= -0.27976459936624853
实验结果表明:正则化 让所得的系数绝对值非常小