Python 练习题 --- 梯度下降

Posted lhys666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 练习题 --- 梯度下降相关的知识,希望对你有一定的参考价值。

  • 题目来源:在校课程老师布置的作业
  • 偷偷说一句:如果对我的答案和解析满意的话可不可以给我 点个赞点个收藏 之类的。
  • 一定要 看到最后 并且参加 投票
  • Let's do it !!!

题目要求

已知某系统模型可由 y = 2 x + 3 y = 2x + 3 y=2x+3 表示

对该系统实际采样得到 4 个样本:(0,3.1)(1,4.9)(2,7.2)(3,8.9)

根据采样数据使用一维线性回归算法估计该模型: f ( x ) = w x + b f(x) = w x + b f(x)=wx+b

选取损失函数: L = 1 2 n ∑ i = 1 n ( y i − ( b + w x i ) ) 2 L=\\frac{1}{2n} \\displaystyle \\sum_{i=1}^{n}{(y^i-(b+wx^i))}^2 L=2n1i=1n(yi(b+wxi))2

基于 梯度下降算法 估计参数 wb

提示:
g r a d w = ∂ L ∂ w = 1 n ∑ i = 1 n ( f ( x i ) − y i ) x i grad_w = \\frac{\\partial L}{\\partial w}=\\frac{1}{n} \\displaystyle \\sum_{i=1}^{n}{(f\\left(x^i\\right)-y^i)x^i} gradw=wL=n1i=1n(f(xi)yi)xi

g r a d b = ∂ L ∂ b = 1 n ∑ i = 1 n ( f ( x i ) − y i ) grad_b = \\frac{\\partial L}{\\partial b}=\\frac{1}{n} \\displaystyle \\sum_{i=1}^{n}{(f\\left(x^i\\right)-y^i)} gradb=bL=n1i=1n(f(xi)yi)

其中:

  • n 是样本数,( x i x_i xi y i y_i yi)是样本点, f ( x i ) =   b + w x i f(x_i)=\\ b+wx^i f(xi)= b+wxi 是模型估计值。

问题:

  1. 假设初始值 w = 0b = 0,学习率 η= 0.01,根据已采集的 4 个样本,基于 梯度下降算法 估计 wb,请计算 第1次第3次 迭代的结果,要求 给出计算过程每次迭代后的平均误差
  • 假设初始值 w = 0b = 0,请用 python 编程计算学习率为 η= 0.01η= 0.001 时迭代 100 次的结果。

思路讲解

这道题就是简单的 梯度下降 ,公式已经给出来了,我们就直接按照公式实现即可。

第一题

第一题要求手写,有了初始条件 w = 0 , b = 0 , η = 0.01 w=0, b=0, \\eta=0.01 w=0,b=0,η=0.01 ,很容易写出来梯度下降的过程。
我写了个程序输出,代码如下:

w = 0
b = 0
eta = 0.01

def process():
    
    global w, b
    
    x = x_train.reshape(1, -1)[0]
    y_hat = x * w + b
    y = y_train.reshape(1, -1)[0]
    diff = y - y_hat
    
    print('(' + '+'.join(map(lambda x:str(round(x, 4)), diff**2)) + f')/{2*x.shape[0]} =', round((diff**2 / (2*x.shape[0])).sum(), 4))
    
    grad_w = -diff * x
    print('(' + '+'.join(map(lambda x:f'({round(x, 4)})', grad_w)) + f')/{x.shape[0]} =', round(grad_w.sum() / x.shape[0], 4))
    w -= eta * grad_w.sum() / x.shape[0]
    print('w =', w)
    grad_b = -diff
    print('(' + '+'.join(map(lambda x:f'({round(x, 4)})', grad_b)) + f')/{x.shape[0]} =', round(grad_b.sum() / x.shape[0], 4))
    b -= eta * grad_b.sum() / x.shape[0]
    print('b =', b)

for i in range(1, 4):
    print('Epoch', i)
    process()
    print()
  • Epoch 1
    l o s s = ( 9.61 + 24.01 + 51.84 + 79.21 ) / 8 = 20.5838 g r a d w = ( ( − 0.0 ) + ( − 4.9 ) + ( − 14.4 ) + ( − 26.7 ) ) / 4 = − 11.5 w = 0.115 g r a d b = ( ( − 3.1 ) + ( − 4.9 ) + ( − 7.2 ) + ( − 8.9 ) ) / 4 = − 6.025 b = 0.06025 loss = (9.61+24.01+51.84+79.21)/8 = 20.5838 \\\\ grad_w = ((-0.0)+(-4.9)+(-14.4)+(-26.7))/4 = -11.5 \\\\ w = 0.115 \\\\ grad_b = ((-3.1)+(-4.9)+(-7.2)+(-8.9))/4 = -6.025 \\\\ b = 0.06025 loss=(9.61+24.01+51.84+79.21)/8=20.5838gradw=((0.0)+(4.9)+(14.4)+(26.7))/4=11.5w=0.115gradb=((3.1)+(4.9)+(7.2)+(8.9))/4=6.025b=0.06025
  • Epoch 2
    l o s s = ( 9.2401 + 22.3233 + 47.7446 + 72.1608 ) / 8 = 18.9336 g r a d w = ( ( − 0.0 ) + ( − 4.7248 ) + ( − 13.8195 ) + ( − 25.4842 ) ) / 4 = − 11.0071 w = 0.2251 g r a d b = ( ( − 3.0398 ) + ( − 4.7248 ) + ( − 6.9098 ) + ( − 8.4948 ) ) / 4 = − 5.7922 b = 0.1182 loss = (9.2401+22.3233+47.7446+72.1608)/8 = 18.9336 \\\\ grad_w=((-0.0)+(-4.7248)+(-13.8195)+(-25.4842))/4 = -11.0071 \\\\ w = 0.2251 \\\\ grad_b=((-3.0398)+(-4.7248)+(-6.9098)+(-8.4948))/4 = -5.7922 \\\\ b = 0.1182 \\\\ loss=(9.2401+22.3233+47.7446+72.1608)/8=18.9336gradw=((0.0)+以上是关于Python 练习题 --- 梯度下降的主要内容,如果未能解决你的问题,请参考以下文章

    Python实现简单的梯度下降法

    梯度下降法,二维空间三维空间 代码实现

    python实现简单的梯度下降法

    课后练习答案

    课后练习答案

    课后练习答案