第1.2章:线性回归(Linear Regression)_参数的求解

简述一下线性回归流程:首先可以进行数据的预处理,包括但不限于:缺失值处理、线性相关的特征值处理、误差较大的脏数据处理。然后搭建一个线性回归模型,运用梯度下降或者正规方程法可以求出参数,这样模型就确定了。之后再用一些检测方法,评估模型是否合理并进行针对性的优化。

文中y ^ \hat{y}y^为预测值,y ( i ) y^{(i)}y(i)为实际值,x i x_{i}xi表示第i ii个变量(特征),x ( i ) x^{(i)}x(i)表示第i ii组数据(样本),同理x n ( m ) x_{n}^{(m)}xn(m)表示第m个样本的第n个特征

来源

Lecture_01

本章视频

06_线性回归算法原理推导、07_线性回归参数的求解

一、线性回归算法原理推导

二、线性回归参数的求解(求函数最小值)

1.正规方程法

  • 将目标函数(04)转化为矩阵形式可以简化推导过程,有利于代码实现:J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 2 ( X θ − Y ) T ( X θ − Y ) ( 06 ) J(\theta)=\frac{1}{2} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}=\frac{1}{2}(X \theta-Y)^{T}(X \theta-Y) (06)J(θ)=21i=1m(hθ(x(i))y(i))2=21(XθY)T(XθY)06 其中X = [ x 0 ( 1 ) x 1 ( 1 ) ⋯ x n ( 1 ) x 0 ( 2 ) x 1 ( 2 ) ⋯ x n ( 2 ) ⋯ ⋯ ⋯ ⋯ x 0 ( m ) x 1 ( m ) ⋯ x n ( m ) ] = [ 1 x 1 ( 1 ) ⋯ x n ( 1 ) 1 x 1 ( 2 ) ⋯ x n ( 2 ) ⋯ ⋯ ⋯ ⋯ 1 x 1 ( m ) ⋯ x n ( m ) ] \mathbf{X} = \left[\begin{array}{cccc}{x_{0}^{(1)}} & {x_{1}^{(1)}} & {\cdots} & {x_{n}^{(1)}} \\ {x_{0}^{(2)}} & {x_{1}^{(2)}} & {\cdots} & {x_{n}^{(2)}} \\ {\cdots} & {\cdots} & {\cdots} & {\cdots} \\ {x_{0}^{(m)}} & {x_{1}^{(m)}} & {\cdots} & {x_{n}^{(m)}}\end{array}\right] = \left[\begin{array}{cccc}{1} & {x_{1}^{(1)}} & {\cdots} & {x_{n}^{(1)}} \\ {1} & {x_{1}^{(2)}} & {\cdots} & {x_{n}^{(2)}} \\ {\cdots} & {\cdots} & {\cdots} & {\cdots} \\ {1} & {x_{1}^{(m)}} & {\cdots} & {x_{n}^{(m)}}\end{array}\right]X=x0(1)x0(2)x0(m)x1(1)x1(2)x1(m)xn(1)xn(2)xn(m)=111x1(1)x1(2)x1(m)xn(1)xn(2)xn(m)θ = [ θ 0 θ 1 ⋯ θ n ] \theta=\left[\begin{array}{l}{\theta_{0}} \\ {\theta_{1}} \\ {\cdots} \\ {\theta_{n}}\end{array}\right]θ=θ0θ1θnY = [ y ( 1 ) y ( 2 ) ⋯ y ( m ) ] Y=\left[\begin{array}{l}{y^{(1)}} \\ {y^{(2)}} \\{\cdots} \\ {y^{(m)}}\end{array}\right]Y=y(1)y(2)y(m)

  • 现在问题转化为求目标函数的极小值点,只要令d J ( θ ) d θ \frac{\mathrm{d} \mathrm{J}(\theta)}{\mathrm{d} \theta}dθdJ(θ)=0即可解出θ \thetaθ的值,目标函数J ( θ ) J(\theta)J(θ)θ \thetaθ求导得:∇ θ J ( θ ) = ∇ θ ( 1 2 ( X θ − Y ) T ( X θ − Y ) ) = ∇ θ ( 1 2 ( θ T X T − Y T ) ( X θ − Y ) ) \nabla_{\theta} J(\theta)=\nabla_{\theta}\left(\frac{1}{2}(X \theta-Y)^{T}(X \theta-Y)\right)=\nabla_{\theta}\left(\frac{1}{2}\left(\theta^{T} X^{T}-Y^{T}\right)(X \theta-Y)\right)θJ(θ)=θ(21(XθY)T(XθY))=θ(21(θTXTYT)(XθY))= ∇ θ ( 1 2 ( θ T X T X θ − θ T X T Y − Y T X θ + Y T Y ) ) =\nabla_{\theta}\left(\frac{1}{2}\left(\theta^{T} X^{T} X \theta-\theta^{T} X^{T} Y-Y^{T} X \theta+Y^{T} Y\right)\right)=θ(21(θTXTXθθTXTYYTXθ+YTY))= 1 2 ( 2 X T X θ − X T Y − ( Y T X ) T ) = X T X θ − X T Y ( 07 ) =\frac{1}{2}\left(2 X^{T} X \theta-X^{T} Y-\left(Y^{T} X\right)^{T}\right)=X^{T} X \theta-X^{T} Y (07)=21(2XTXθXTY(YTX)T)=XTXθXTY07结果是一个( n + 1 ) ∗ 1 (n+1) * 1(n+1)1的向量,形似[ Z 0 ⋮ Z n ] \left[\begin{array}{c}{Z_{0}} \\ {\vdots} \\ {Z_{n}}\end{array}\right]Z0Zn

  • 令(05)式为0,得最终参数值θ = ( X T X ) − 1 X T Y ( 08 ) \theta=\left(X^{T} X\right)^{-1} X^{T} Y (08)θ=(XTX)1XTY08

  • 关于正规方程法的几点说明:

  1. 对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量),正规方程方法是不能用的。也就是说,只有矩阵( X T X ) \left(X^{T} X\right)(XTX)是可逆矩阵的时候,这个方法才可行。矩阵可逆=矩阵对应的行列式不为0=满秩=行(列)向量线性无关
  2. 如果特征数量n nn较大则运算代价大,因为矩阵逆的计算时间复杂度为O ( n 3 ) O\left(n^{3}\right)O(n3),通常来说n nn小于100时还是可以接受的
  3. 只适用于线性模型,不适合逻辑回归模型等其他模型。事实上对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法,但对于这个特定的线性回归模型,正规方程法是一个比梯度下降法更快的替代算法。
  4. 关于矩阵求导术

2.梯度下降法

正规方程法并不是什么情况都能奏效的,事实上大多数复杂算法都不适用。而梯度下降法作为一种求函数最小值更加通用的手段,适用的范围更广,操作方法也更符合机器学习的理念(让机器循着特定的算法程序进行迭代运行)。梯度的方向是函数值变化最快的方向,如果是求极大值,沿着梯度的方向迭代即可;如果是求极小值,则沿着梯度相反的方向迭代

  • 【补充一点个人理解】为什么要用梯度来进行参数的更新?只有一个参数θ \thetaθ,初始化以后,下一步θ \thetaθ是变大还是变小呢?我们用导数就可以很好的回答这个问题,当这个点导数为正时,增大θ \thetaθ的值则函数值(这里是损失函数)增加,减小θ \thetaθ则函数值减小。所以梯度充当的就是一个方向的作用,它指导参数θ \thetaθ的变化方向,在这个时候梯度的大小不是非常重要,因为更新参数θ \thetaθ时还要乘上步长,可以通过调整步长来控制更新的幅度。当参数θ \thetaθ是一个向量时( θ 0 , θ 1 , … , θ n ) \left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right)(θ0,θ1,,θn),也是类似的,梯度代表的是向量的方向,是兼顾了各个参数方向最终得出来的,也可以认为一次性更新θ 0 , θ 1 , … , θ n \theta_{0}, \theta_{1}, \ldots, \theta_{n}θ0,θ1,,θn,幅度由步长来控制。

梯度下降背后的思想

  • 开始时我们随机选择一个参数的组合( θ 0 , θ 1 , … , θ n ) \left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right)(θ0,θ1,,θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。
  • 我们持续这么做直到得到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
  •  Repeat  { θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 , … , θ n ) } \begin{array}{l}{\text { Repeat }\{ } \\ {\qquad \theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J\left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right)} \\ {\}}\end{array} Repeat {θj:=θjαθjJ(θ0,θ1,,θn)}

梯度下降的迭代方法

1.代数法

构建一个代价函数(参照(05)式):J ( θ 0 , θ 1 … θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 , 其 中 h θ ( x ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + … + θ n x n , x 0 = 1 J\left(\theta_{0}, \theta_{1} \ldots \theta_{n}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2},其中h_{\theta}(x)=\theta_{0} x_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\ldots+\theta_{n} x_{n},x_{0}=1J(θ0,θ1θn)=2m1i=1m(hθ(x(i))y(i))2hθ(x)=θ0x0+θ1x1+θ2x2++θnxnx0=1 ∂ ∂ θ j J ( θ 0 , θ 1 , … , θ n ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , 导 数 可 能 是 正 的 也 可 能 是 负 的 , 取 决 于 切 线 的 斜 率 \frac{\partial}{\partial \theta_{j}} \mathrm{J}\left(\theta_{0}, \theta_{1}, \ldots, \theta_{\mathrm{n}}\right)=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)},导数可能是正的也可能是负的,取决于切线的斜率θjJ(θ0,θ1,,θn)=m1i=1m(hθ(x(i))y(i))xj(i)线
重复迭代:θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 , … , θ n ) , 其 中 j = 0 , 1 , . . . , n \theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} \mathrm{J}\left(\theta_{0}, \theta_{1}, \ldots, \theta_{\mathrm{n}}\right),其中j=0,1,...,nθj:=θjαθjJ(θ0,θ1,,θn)j=0,1,...,n即 θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ( 09 ) 即\theta_{j} :=\theta_{j}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)} (09)θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)09

2.矩阵法

构建一个代价函数(参照(06)式):J ( θ ) = 1 2 m ( X θ − Y ) T ( X θ − Y ) , ∇ θ J ( θ ) = 1 m ( X T X θ − X T Y ) J(\theta)=\frac{1}{2m}(X \theta-Y)^{T}(X \theta-Y),\nabla_{\theta} J(\theta)=\frac{1}{m}(X^{T} X \theta-X^{T} Y)J(θ)=2m1(XθY)T(XθY)θJ(θ)=m1(XTXθXTY)
重复迭代:θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 , … , θ n ) , 其 中 j = 0 , 1 , . . . , n \theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} \mathrm{J}\left(\theta_{0}, \theta_{1}, \ldots, \theta_{\mathrm{n}}\right),其中j=0,1,...,nθj:=θjαθjJ(θ0,θ1,,θn)j=0,1,...,n即 θ : = θ − α 1 m ( X T X θ − X T Y ) ( 10 ) 即\theta :=\theta-\alpha\frac{1}{m}\left(X^{T} X \theta-X^{T} Y\right) (10)θ:=θαm1(XTXθXTY)10

3.几点补充

  • α \alphaα取正数,以凸函数为例(形如y = x 2 y=x^{2}y=x2):当θ j \theta_{j}θj位于极小值点右侧,导数大于0,更新后θ j \theta_{j}θj向左移动;当θ j \theta_{j}θj位于极小值点左侧,导数小于0,更新后θ j \theta_{j}θj向右移动。同理,若是凹函数,则会远离极大值点。也就是说,在学习率a的大小选取合适的情况下,θ j \theta_{j}θj越来越靠近极小值点,随着迭代次数不断增加,函数值在极小值点左右晃动。
  • θ \thetaθ的更新方式一般采用同时更新,即采用老的一组( θ 0 , θ 1 , … , θ n ) \left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right)(θ0,θ1,,θn)来更新θ j \theta_{j}θj,也就是说更新θ 1 \theta_{1}θ1的时候,θ 0 \theta_{0}θ0还是那个没有更新的θ 0 \theta_{0}θ0。其实矩阵法就很能说明过程
  • 不适用于非光滑函数,即某些位置的导数可能不存在

梯度下降的参数选取

1.初始参数

  • 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值
  • 由于有局部最优解的风险,需要多次用不同初始值运行算法,比较这些局部最优解,选择使目标函数最小的值

2.学习率(步长)

  • α \alphaα是学习率(learning rate),它决定了我们让代价函数下降的步子有多大。如果α \alphaα选取太小,它会需要很多步才能到达最低点。如果α \alphaα选取的太大,它会导致无法收敛甚至发散。可以考虑尝试这些学习率:α \alphaα=0.001,0.003,0.01,0.03,0.1,0.3,1…每两个取值大概相差三倍,起始位置可以考虑α \alphaα=0.01
  • 之所以让代价函数除以一个样本数m mm,就是考虑对于不同的模型来说样本数可能是100也可能是100万,为了使每次取的α \alphaα变化不会太过剧烈(让人对起始位置无从下手),于是对误差的求和除以一个m mm,这样每次都可以用α \alphaα=0.01来开始尝试
  • 当我们接近局部最低时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度,因此实际上没有必要再另外减小α \alphaα,当然非要进行减小也是可以的

3.特征缩放

  • 在我们面对多维特征问题的时候,我们要尽量使这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
  • 以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图,则图像会显得扁长,梯度下降算法需要非常多次的迭代才能收敛,而我们理想的等高线图尽量是圆形的好。解决的方法是尝试将所有特征的尺度都尽量缩放到-1到1之间(-1/3到1/3,-3到3都可以)
    在这里插入图片描述
  • 另一种可行的方法是令:x i = x i − μ n s n x_{i}=\frac{x_{i}-\mu_{n}}{s_{n}}xi=snxiμn,其中μ n \mu_{n}μn是平均值,S n S_{n}Sn是标准差(用最大值减最小值就可以了)。特征缩放不需要太精确,主要是让梯度下降算法运行的能够更快一些。

4.终止条件

可以通过绘制“迭代次数”和“代价函数的值”的图,来观测算法在何时趋于收敛

  • 一种方法是:定义一个合理的阈值如0.001,当两次迭代之间J ( θ ) J(\theta)J(θ)的差值小于该阈值时,迭代结束。

  • 或者设置一个大概的迭代步数,比如1000或500,梯度下降法最终的迭代肯定会收敛,只要达到相应迭代次数,多了也没关系。

5.其他模型转化为线性模型

  • 有时对于一批数据,线性模型不一定是最好的拟合方式,可能需要曲线来适应我们的数据,比如一个二次方模型:h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 2 h_{\theta}(x)=\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}^{2}hθ(x)=θ0+θ1x1+θ2x22,或者三次方模型:h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 2 + θ 3 x 3 3 h_{\theta}(x)=\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}^{2}+\theta_{3} x_{3}^{3}hθ(x)=θ0+θ1x1+θ2x22+θ3x33
  • 此时,我们可以令:x 2 = x 1 2 , x 3 = x 1 3 x_{2}=x_{1}^{2}, x_{3}=x_{1}^{3}x2=x12,x3=x13,从而将模型转化为线性回归模型。
    在这里插入图片描述
  • 根据函数图形特性,我们还可以使:h θ ( x ) = θ 0 + θ 1 ( s i z e ) + θ 2 siz ⁡ e h_{\theta}(x)=\theta_{0}+\theta_{1}(s i z e)+\theta_{2} \sqrt{\operatorname{siz} e}hθ(x)=θ0+θ1(size)+θ2size

3.梯度下降法家族

批量梯度下降

  • 上文所提到的就是批量梯度下降(Batch Gradient Descent),这是梯度下降法最基本的形式,具体做法就是在更新参数θ \thetaθ时用上所有的m mm个样本
  • 优点是计算得精度比较高,容易得到最优解。
  • 缺点是由于样本数量太大,计算速度很慢。

随机梯度下降

  • 随机梯度下降(Stochastic Gradient Descent),在更新参数θ \thetaθ时没有用所有的m个样本的数据,而是随机选取一个样本i ii来求梯度:θ j : = θ j − α ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , 其 中 j = 0 , 1 , . . . , n ( 11 ) \theta_{j} :=\theta_{j}-\alpha \left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)},其中j=0,1,...,n (11)θj:=θjα(hθ(x(i))y(i))xj(i)j=0,1,...,n11
  • 优点:相比于批量梯度下降,随机梯度下降只选取了一个样本,因此迭代速度提升了很多
  • 缺点:由于随机梯度下降法每次迭代只选择一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。如果选择的样本属于一个误差比较大的脏数据,前进的方向都不一定是收敛方向。

小批量梯度下降

  • 小批量梯度下降(Mini-batch Gradient Descent),是批量梯度下降法和随机梯度下降法的折衷。也就是对于m个样本,我们选取其中的x xx个样本来迭代,1 < x < m 1<x<m1<x<m,即:θ j : = θ j − α 1 x ∑ i = t x + t − 1 ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , 其 中 j = 0 , 1 , . . . , n ( 12 ) \theta_{j} :=\theta_{j}-\alpha \frac{1}{x} \sum_{i=t}^{x+t-1}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)} ,其中j=0,1,...,n (12)θj:=θjαx1i=tx+t1(hθ(x(i))y(i))xj(i)j=0,1,...,n12
  • 这个算法每次选择一部分数据更新,在实际操作中是最实用的。每次选择的样本数x xx可以是32、64、128,差不多选择64就可以了,具体取决于你能容忍算法运行多久,选择的越多则精度越高。

三、线性回归的模型评估


版权声明:本文为weixin_41577426原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。