线性回归之最小二乘法推导及python实现
【超实战追-女孩干货】【企鹅:1О⒈б.x.952⒍】 线性回归、加权线性回归及岭回归的原理和公式推导 - 线性回归 - 加权线性回归
机器学习相关的博文相信已经很多了,作为机器学习的一枚菜鸟,写这篇博文不在于标新立异,而在于分享学习,同时也是对自己研究生生涯的总结和归纳,好好地把研究生的尾巴收好。想着比起出去毕业旅行,在实验室总结一下自己的所学,所想,所感应该更有意义吧。(其实也想出去玩,但是老板要求再出一篇文章,那只好和毕业旅行拜拜了,所以趁机写个系列吧,反正后面的时间应该就是文章+博客的双重循环了,其实也是挺美的哈)
学习机器学习的小心得:脑袋中一定要有矩阵、向量的概念,这一点非常重要,因为我们现在处理的数据是多维的数据,所以可能无法非常直观的来表述我们的数据,所以大脑中一定要有这样的概念。然后就是Coding再Coding,这一点自己也没做好啦,惭愧。
线性回归
回归的目的就是对给定的数据预测出正确的目标值,分类的目的是对给定的数据预测出正确的类标,要注意区分这两个概念,其实我在刚接触机器学习的时候经常把这两个概念弄混。那么,对于线性回归,就是实现对给定数据目标值的预测过程。
那
么
对
于
给
定
的
训
练
数
据
X=[x#x2192;1,x#x2192;2,#x2026;,x#x2192;m]T\role=\style=\
relative;\
=
[vec{x}_1,
1,x? vec{x}_2,
2,…,x? dots,
m]TX=[x→1,x→2,…,x→m]TX vec{x}_m]^{T},其中role=\
x#x2192;i={xi1,xi2,xi3,#x2026;,xin}T\style=\
relative;\
=
i={xi1,xi2,xi3,…,xin}Tx→i={xi1,xi2,xi3,…,xin}Tvec{x}_i
{x_{i1}, x_{i2}, x_{i3}, dots, x_{in}}^{T}。对应的,这些训练数据的目标值是y#x2192;={y1,y2,y3,#x2026;,ym}\role=\style=\
relative;\
={y1,y2,y3,…,ym}y→={y1,y2,y3,…,ym}vec{y} = {y_1, y_2, y_3, dots, y_m}。一般的,我们通过所给定的训练数据及对应的目标值来求解线性回归
的
参
数
#x03B8;#x2192;={#x03B8;1,#x03B8;2,#x03B8;3,#x2026;,#x03B8;n}T\role=\
style=\
relative;\θ?
=
={θ1,θ2,θ3,…,θn}Tθ→={θ1,θ2,θ3,…,θn}Tvec{theta}
{{theta}_1, {theta}_2, {theta}_3, dots, {theta}_n}^{T}。具体的,我们通过定义损失函数role=\
Jx#x2192;i(#x03B8;#x2192;)\
relative;\
style=\
i(θ? )Jx→i(θ→)J_{vec{x}_i}(vec{theta})来实现对线性回归参数的求解,损失函数定义如下:
(1)Jx#x2192;i(#x03B8;#x2192;)=12(x#x2192;iT#x03B8;#x2212;yi)2\
role=\
style=\
relative;\
i(θ? )=12(x? Tiθ?yi)2(1)(1)Jx→i(θ→)=12(x→iTθ?yi)2
begin{equation}
J_{vec{x}_i}(vec{theta}) = frac{1}{2}(vec{x}^T_itheta - y_i)^2 end{equation}
记住,在机器学习里面,向量的默认是列向量形式,所以上述的T\role=\表示转置,因为我们写的时候写成了横向量的形式。同样在做向量乘积运算时,也应该对左边的向量加上转置,这样向量乘积才会得到一个值。
那么要最小化这个损失函数,我们可以采用随机梯度下降(Stochastic Gradient Descent)或者批梯度下降(Batch Gradient Descent),那么对参数向量#x03B8;#x2192;\role=\style=\relative;\θ? θ→vec{theta}中的每一维参数求偏导,再根据学习率来进行参数地更新,具体如下:
(2)#x2202;Jx#x2192;i(#x03B8;#x2192;)#x2202;#x03B8;j=2#x00D7;12#x00D7;(x#x2192;iT#x03B8;#x2212;yi)#x00D7;xij=(x#x2192;iT#x03B8;#x2212;yi)#x00D7;xij\role=\style=\relative;\
i(θ?
)?θj=2×12×(x?
Tiθ?yi)×xij=(x?
Tiθ?yi)×xij(2)(2)?Jx→i(θ→)?θj=2×12×(x→iTθ?yi)×xij=(x→iTθ?yi)×xij
begin{equation}
begin{split}
frac{partial J_{vec{x}_i}(vec{theta})}{partial {theta}_j}
&=2times frac{1}{2}times(vec{x}^T_itheta - y_i) times {x_{ij}}
&=(vec{x}^T_itheta - y_i) times {x_{ij}} end{split}
end{equation}
那么,对于参数#x03B8;j\relative;\θjθj{theta}_j的更新,批梯度下降算法如下所示:
Repeat until convergence{
#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#x03B8;j=#x03B8;j#x2212;#x03B7;1m#x2211;i=1m((x#x2192;iT#x03B8;#x2212;yi)#x00D7;xij)\role=\style=\relative;\θj=θj?η1m∑mi=1((x?
Tiθ?yi)×xij)
=
θj=θj?η1m∑i=1m((x→iTθ?yi)×xij)~~~~~~~~~~theta_j
{theta}_j - etafrac{1}{m}sum_{i = 1}^{m}((vec{x}^T_itheta - y_i) times {x_{ij}}) (for every #x03B8;j\role=\style=\θjθjtheta_j)
其中,#x03B7;\role=\style=\relative;\ηηeta表示学习率。而对于随机梯度下降,算法如下所示:
for i = 1 to m{
#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;\
role=\
style=\
#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;
#x03B8;j=#x03B8;j#x2212;#x03B7;((x#x2192;iT#x03B8;#x2212;yi)#x00D7;xij)\role=\style=\relative;\θj=θj?η((x?
Tiθ?yi)×xij)
θj=θj?η((x→iTθ?yi)×xij)~~~~~~~~~~~~theta_j = {theta}_j - eta((vec{x}^T_itheta - y_i) times {x_{ij}})
#xA0;#xA0;#xA0;#xA0;#xA0;#xA0;\style=\
关于上述两种梯度下降法的区别这里就不详细说明了,这不是本小节讨论的重点,大家可以查阅相关的博客或者书籍。(机器学习可是系统工程啊,要懂得方方面面,菜鸟到专家可得一步一个脚印呢)
上述是基于梯度来求解回归系数的,下面给出基于矩阵求解回归系数的办法,这里不需要多次迭代求解,对于训练数据量少时较为实用。首先,给出矩阵形式的损失函数:
J(#x03B8;#x2192;)=12(X#x03B8;#x2192;#x2212;y#x2192;)T(X#x03B8;#x2192;#x2212;y#x2192;)=12(#x03B8;#x2192;TXTX#x03B8;#x2192;#x2212;#x03B8;#x2192;TXTy#x2192;#x2212;y#x2192;TX#x03B8;#x2192;+y#x2192;Ty#x2192;)=12tr(#x03B8;#x2192;TXTX#x03B8;#x2192;#x2212;#x03B8;#x2192;TXTy#x2192;#x2212;y#x2192;TX#x03B8;#x2192;+y#x2192;Ty#x2192;)=12(tr(#x03B8;#x2192;TXTX#x03B8;#x2192;)#x2212;2tr(y#x2192;TX#x03B8;#x2192;)+y#x2192;Ty#x2192;)\style=\
center;
position:
role=\
relative;\θ? )=12(Xθ? ?y? )T(Xθ? ?y? )=12(θ? TXTXθ? ?θ?