目录
一、基础概念
1. 梯度下降法的原理
梯度法思想的三要素:出发点、下降方向、下降步长。
梯度方向:
步长设为常数Δ:
如果用在梯度较大的时候,离最优解比较远,W的更新比较快;然而到了梯度较小的时候,也就是较靠近最优解的时候,W的更新竟然也保持着跟原来一样的速率,这样会导致W很容易更新过度反而远离了最优解,进而出现在最优解附近来回震荡。所以用λ|W|来代替Δ,而这里的λ就是学习率。[1]
- 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
- 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向
梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点![2]
图1. 各种梯度下降示意图[1]
二、实验步骤与分析
序号 | 任务名称 | 任务具体要求 |
1 | 实验数据点 | x:[55, 71, 68, 87, 101, 87, 75, 78, 93, 73] y:[91, 101, 87, 109, 129, 98, 95, 101, 104, 93] |
2 | 一元线性回归方程 | y(x,w)=w0+w1*x |
3 | 梯度下降法求线性回归方程系数w0和w1 | 自己编写函数,使用梯度下降法的公式求得w0,w1(函数输入为x,y和迭代次数,返回为w0,w1) |
4 | 绘制图像 | 绘制梯度下降求得的一元线性回归函数图像,包括数据点和一元线性回归函数图像 |
1. 梯度下降法:
# define the model linear model y = w*x+b
def forward(x):
return x*w+b
#define the cost function MSE
def cost(xs, ys):
cost = 0
for x, y in zip(xs,ys):
y_pred = forward(x)
cost += (y_pred - y)**2 #
return cost / len(xs)
# define the gradient function gd 梯度
def gradient(xs,ys):
gradw = 0
gradb = 0
for x, y in zip(xs,ys):
gradw += x*(x*w+b - y) # ∂cost/ ∂w,对w求导
gradb += x*w+b - y
gradw = gradw/len(xs)
gragb = gradb / len(xs)
return gradw, gradb
epoch_list = []
cost_list = []
# start training
for epoch in range(10):
cost_val = cost(x_data, y_data)
gradb_val, gradw_val = gradient(x_data, y_data)# 1 求梯度
w -= 0.00016 * gradw_val # 0.01 learning rate # 2 更新斜率(权重)
b -= 0.00011 * gradb_val
print('epoch:', epoch, 'w=', w, 'b=', b,'loss=', cost_val)
epoch_list.append(epoch)
cost_list.append(cost_val)
结果如下图:
2. 画出一元线性拟合图像:
plt.scatter(x_data, y_data)
y_line = w * np.array(x_data) + b
plt.plot(x_data, y_line , color='r')