玩一玩梯度下降可视化
如果你只会调包,只会import sklearn,本文想让你更进一步,真正动手实现机器学习的算法。发明这些算法的人当然很厉害,但技术就是技术,不会由于过于神秘而不可触碰。既然学了机器学习,为什么不能自己实现算法,那些开源的库,不也是从空白的文件写起的吗?只要你了解部分以下内容,就可以畅通无阻地阅读本文:
- 识别英文单词
- Python简单语法,numpy简单语法
- 简单的加减乘除,简单的微积分常识
本文探索各种各样梯度下降的运行过程,观察参数变化的规律,以求获得更深的理解。你可以复制我的代码,改改数字,看看算法是怎样运行的,play around & have fun。
本文md源码地址:AnBlogs
本文使用简单的一元线性回归模型举例子,以求简单, y ^ = θ x + b \hat y = \theta x+b y^=θx+b,损失函数和梯度为:
L ( θ , b ) = 1 2 ( θ x + b − y ) 2 , ∂ L ∂ θ = ( θ x + b − y ) x , ∂ L ∂ b = θ x + b − y L(\theta,b)=\frac{1}{2}(\theta x+b-y)^2,\frac{\partial L}{\partial \theta}=(\theta x+b-y)x,\frac{\partial L}{\partial b}=\theta x+b-y L(θ,b)=21(θx+b−y)2,∂θ∂L=(θx+b−y)x,∂b∂L=θx+b−y
如果你对线性回归不了解,且对其有兴趣,请看:线性回归
文章目录
使用的数据
准备工作
为了让模型尽量简单,减少运行时间,我使用了人造的数据。产生数据的代码如下:
X = np.arange(0, 100, 1.0)
y = X * 4
就是简单的 y = 4 x y=4x y=4x, x x x在 [ 0 , 100 ) [0,100) [0,100)之间取值。
为了记录算法运行的过程,准备两个数组,记录每次循环得到的参数值 θ , b \theta,b θ,b:
theta_time = []
bias_time = []
可以画出参数经过的轨迹:
plt.plot(theta_time, bias_time)
plt.show()
标准模型试一下
先使用sklearn的线性回归工具试一下,让心里踏实点。几行代码就能实现:
from sklearn import linear_model
lr = linear_model.LinearRegression()
lr.fit(X.reshape(-1,1), y)
lr.coef_, lr.intercept_
得到的结果:
(array([4.]), 0.0)
确实符合预期,非常精确。sklearn永远滴神!
各种梯度下降尝试
初始化
先初始化参数 θ , b \theta,b θ,b,暂时初始化为0。
theta = 0
bias = 0
学习率暂时初始化为1e-6
。
rate =