机器学习 - 线性回归

2019-07-26 Views 机器学习2668字13 min read
featureimg

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。

前言

微积分基础知识

常用的微积分知识:点此

法则一:对方程f(x)=cxn

xf(x)=cnxn1\frac{\partial}{\partial x}f\left( x \right) =cnx_{}^{n-1}

法则二:常数的微分为 0
法则三:偏导数可以穿透累加器,即

x0i=0nF(xi)=i=0nx0F(xi)\frac{\partial}{\partial x_{0}^{}}\sum_{i=0}^n{F\left( x_{i}^{} \right) =\sum_{i=0}^n{\frac{\partial}{\partial x_{0}^{}}F\left( x_{i}^{} \right)}}

法则四:微分链接法则,比如 f(x) 是以 x 为自变量的函数,令 J(x)=g(f(x)) ,则 J(x) 的微分方程为

xJ(x)=g(f(x))×f(x)\frac{\partial}{\partial x}J\left( x \right) =g\left( f\left( x \right) \right) '\times f\left( x \right) '

法则五:计算偏导数时,把求导变量当作变量,其他的变量当作常数,比如对方程f(x,y)=axn+bym

xf(x,y)=naxn1\frac{\partial}{\partial x}f\left( x,y \right) =nax_{}^{n-1}

因为是对 x 求导,所以可以把 y 当成常数,即 bym 整个算子就是一个常数,根据第二个法则,常数的导数为 0。同理:

yf(x,y)=mbym1\frac{\partial}{\partial y}f\left( x,y \right) =mby_{}^{m-1}

正文

预测函数

因为是线性模型,所以J(θ12)=h(x)=θ1x+θ0。根据机器学习的概念,我们进行学习的目的就是要使得h(x)的整体误差,即每一个点到这条线的距离之和最小。要达到这个目的,我们就要找到最合适的θ1和θ0,这两个参数就被成为模型参数

成本函数

单变量线性回归算法的成本函数是:

J(θ)=12mi=1m(hθ(xi)yi)2J\left( \theta \right) =\frac{1}{2m}\sum_{i=1}^m{\left( h_{\theta}^{}\left( x_{i}^{} \right) -y_{i}^{} \right) _{}^{2}}

其中, h(x)-y(x) 是预测值和实际值的差,故成本就是预测值和实际值的的平方的平均值。乘1/2 是为了后面的计算方便。这个函数也称为均方差方程。

梯度下降算法

有了成本函数,我们就需要用方法把成本函数降到最小,这也正是机器学习的目的。所以我们引入了梯度下降算法的概念。

梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来 (i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方(最斜的地方),然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

linear regression - gradient descent - 1

用更加数学的语言来描述上面这个过程就是:我们任选一组θ1和θ0,然后求成本函数在这一点的偏导数(因为有两个参数),此处这个偏导数就是上面那个故事里的斜率。我们要做的就是不断地迭代θ1和θ0。由当前θ的值,根据该点的偏导数,算出在该点的斜率,再乘学习率α,我们就可以让θ往“山谷下”迈上一步。
用数学表达我们不停迭代θ的过程可以采用以下公式:

θj=θiα×Gradient\theta _{j}^{}=\theta _{i}^{}-\alpha \times Gradient

Gradient=θjJ(θ)Gradient=\frac{\partial}{\partial \theta _{j}^{}}J\left( \theta \right)

所以:

θj=θjαθjJ(θ)\theta _j=\theta _j-\alpha \frac{\partial}{\partial \theta _j}J\left( \theta \right)

其中如果α的值太小,就意味着我们要经过多次的迭代才能找到最终的最小值点;如果α太大了,最终θ就无法收敛(会因为移动幅度太大,跨过了最小值点)。最后把J(θ)的定义代入,求偏导之后我们可以得到最终的迭代表达式:

θ0=θ0αmi=1m(h(xi)yi)\begin{aligned} \theta _0&=\theta _0-\frac{\alpha}{m}\sum_{i=1}^m{\left( h\left( x_{}^{i} \right) -y_{}^{i} \right)}\\ \end{aligned}

θj=θjαmi=1m((h(x(i))y(i))xj(i))\begin{aligned} \theta _j&=\theta _j-\frac{\alpha}{m}\sum_{i=1}^m{\left( \left( h\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right) x_{j}^{\left( i \right)} \right)}\\ \end{aligned}

推导过程:

θjJ(θ)=θj12mi=1m(h(x(i))y(i))2=12mi=1mθj(h(x(i))y(i))2=212mi=1m((h(x(i))y(i))θj(h(x(i))y(i)))=1mi=1m((h(x(i))y(i))θj(j=0nθjxj(i)y(i)))=1mi=1m((h(x(i))y(i))xj(i))\begin{aligned} \frac{\partial}{\partial \theta _j}J\left( \theta \right) &=\frac{\partial}{\partial \theta _j}\frac{1}{2m}\sum_{i=1}^m{\left( h\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right)}^2\\ &=\frac{1}{2m}\sum_{i=1}^m{\frac{\partial}{\partial \theta _j}}\left( h\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right) ^2\\ &=2\frac{1}{2m}\sum_{i=1}^m{\left( \left( h\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right) \frac{\partial}{\partial \theta _j}\left( h\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right) \right)}\\ &=\frac{1}{m}\sum_{i=1}^m{\left( \left( h\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right) \frac{\partial}{\partial \theta _j}\left( \sum_{j=0}^n{\theta}_jx_{j}^{\left( i \right)}-y^{\left( i \right)} \right) \right)}\\ &=\frac{1}{m}\sum_{i=1}^m{\left( \left( h\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right) x_{j}^{\left( i \right)} \right)}\\ \end{aligned}

补充

多变量的线性回归算法

对于多变量的线性回归算法,我们可以把预测函数改为如下形式:

h(x)=θ0+θ1x1+θ2x2+θ3x3+...+θnxnh\left( x \right) =\theta _{0}^{}+\theta _{1}^{}x_{1}^{}+\theta _{2}^{}x_{2}^{}+\theta _{3}^{}x_{3}^{}+...+\theta _{n}^{}x_{n}^{}

根据线性代数的知识我们可以把公式改为向量形式:

hθ(x)=[θ0 θ1 ... θn][x0x1...xn]h_{\theta}^{}\left( x \right) =\left[ \theta _{0}^{}\ \theta _{1}^{}\ ...\ \theta _{n}^{} \right] \left[ \begin{array}{c} x_{0}^{}\\ x_{1}^{}\\ ...\\ x_{n}^{}\\ \end{array} \right]

其中因为对应θ0的x为1(因为第0项是常数).所以我们把x0设为1,其中x0就被称为模型偏置。θ上面有转置符号是因为我们默认计算是列向量,所以要转置变为行向量才能实现矩阵的乘法。


成本函数也有它的矩阵形式:

J(θ)=12m(Xθy)T(Xθy)J\left( \theta \right) =\frac{1}{2m}\left( X\theta -\overrightharpoon{y} \right) _{}^{T}\left( X\theta -\overrightharpoon{y} \right)

利用最小二乘法(OSL)求解线性方程模型

引自百度百科:
在我们研究两个变量(x,y)之间的相互关系时,通常可以得到一系列成对的数据(x1,y1.x2,y2... xm,ym);将这些数据描绘在 x -y 直角坐标系中,若发现这些点在一条直线附近,可以令这条直线方程如

yi=a0+a1xy_{\text{i}}^{}=\text{a}_{0}^{}+\text{a}_{1}^{}\text{x}

其中:a0、a1 是任意实数
为建立这直线方程就要确定 a0 和 a1,应用最小二乘法原理,将实测值 Yi 与利用计算值 Yj(Yj=a0+a1Xi)的离差(Yi-Yj)的平方和

(YiYj)2\sum{\left( \text{Y}_{\text{i}}^{}-\text{Y}_{\text{j}}^{} \right) _{}^{2}}

最小为 “优化判据”。
令:

φ=(YiYj)2\varphi =\sum{\left( \text{Y}_{\text{i}}^{}-\text{Y}_{\text{j}}^{} \right) _{}^{2}}

把Yj代入得:

φ=(Yia0a1Xi)2\varphi =\sum{\left( \text{Y}_{\text{i}}^{}-\text{a}_{0}^{}-\text{a}_{1}^{}\text{X}_{\text{i}}^{} \right) _{}^{2}}

(YiYj)2\sum{\left( \text{Y}_{\text{i}}^{}-\text{Y}_{\text{j}}^{} \right) _{}^{2}}

达到最小时, φ 对 a0、a1 求偏导数都等于零。
对a0求偏导:

2(a0+a1XiYi)2=0\sum{2\left( \text{a}_{0}^{}+\text{a}_{1}^{}\text{X}_{\text{i}}^{}-\text{Y}_{\text{i}}^{} \right) _{}^{2}=0}

对a1求偏导:

2Xi(a0+a1XiYi)2=0\sum{2\text{X}_{\text{i}}^{}\left( \text{a}_{0}^{}+\text{a}_{1}^{}\text{X}_{\text{i}}^{}-\text{Y}_{\text{i}}^{} \right) _{}^{2}=0}

亦即:

na0+(Xi)a1=Yi \text{na}_{0}^{}+\left( \sum{X_{i}^{}} \right) a_{1}^{}=\sum{Y_{i}^{}\ - ①}

(Xi)a0+(Xi2)a1=(XiYi)  ②\left( \sum{X_{i}^{}} \right) a_{0}^{}+\left( \sum{\text{X}_{\text{i}}^{2}} \right) \text{a}_{1}^{}=\sum{\left( \text{X}_{\text{i}}^{}\text{Y}_{\text{i}}^{} \right) \ -\ \text{②}}

得到的两个关于 a0、 a1 为未知数的两个方程组(1,2),解这两个方程组得出:

a0=xi2yixixiyinxi2(xi)2a_{0}^{}=\frac{\sum{x_{i}^{2}\sum{y_{i}^{}-\sum{x_{i}^{}\sum{x_{i}^{}y_{i}^{}}}}}}{n\sum{x_{i}^{2}}-\left( \sum{x_{i}^{}} \right) _{}^{2}}

a1=nxiyixiyinxi2(xi)2a_{1}^{}=\frac{n\sum{x_{i}^{}y_{i}^{}-\sum{x_{i}^{}\sum{y_{i}^{}}}}}{n\sum{x_{i}^{2}}-\left( \sum{x_{i}^{}} \right) _{}^{2}}

通过上面的方法我们就能快速确定模型参数的值,并且不需要迭代,只需要累加即可。这样就可以提高计算机求解线性回归问题的速度。


注:如果文中有什么问题,欢迎在评论区指出;有不懂的也可以在评论区提问哦!


References:

  1. https://blog.kamidox.com/gradient-descent.html
  2. https://www.jianshu.com/p/c7e642877b0e
  3. https://baike.baidu.com/item/最小二乘法/2522346
  4. 《scikit-learn 机器学习:常用算法原理及编程实战》- 黄永昌

logo   WRITTEN BY:Serence

一个程序员和文艺青年的博客!

本文章采用CC BY-NC-SA 4.0进行许可。转载请注明出处!

上一篇

机器学习 - 逻辑回归


下一篇

机器学习 - KNN