梯度下降
在最低点的左边,w需要调大,最低点的右边,w需要调小
利用k,最低点斜率为0
- 得到代价函数曲线在w这个点上的斜率k
- 根据k正负调整w
如果每次调整的幅度确定,调整的速度很慢且可能在最低点反复横跳
希望:远离最低点下降速度快,越接近最低点下降速度越慢
令w=w-k,k离最低点越远绝对值越大,w下降的也就越快
同样的,使用学习率alpha控制下降的速度
编程实现
-
初始化
x, y = dataset.get_beans(100) plt.scatter(x, y) # 初始 w = 0.1
-
梯度下降
对于每一对w,计算k,更新w,重复更新1000次
for num in range(1000): for i in range(100): # 取出每一个值 a = x[i] b = y[i] # 计算k k = 2 * (x ** 2) * w - 2 * (x * y) alpha = 0.05 w = w - alpha * k
-
绘制静态结果
y_pre = x * w plt.plot(x, y_pre) plt.show()
注意要用更新后的w值再次计算预测函数
注意,fori内计算k时应该用具体的a、b值而不是x、y数集,否则得出的w是个数集,结果是个曲线
for num in range(1000):
for i in range(100):
# 取出每一个值
a = x[i]
b = y[i]
# 计算k
k = 2 * (a ** 2) * w - 2 * (a * b)
alpha = 0.05
w = w - alpha * k
拟合的非常不错
绘制动态图像
-
清空窗口,绘制静态内容
plt.clf() # 清空窗口 plt.scatter(x, y) y_pre = x * w
-
限定坐标范围,绘制动态内容
plt.xlim(0, 1) plt.ylim(0, 1.2) plt.plot(x, y_pre)
-
暂停
plt.pause(0.01)