机器学习(1)多元线性回归

概述

线性回归是一个典型的监督学习问题,它常常被用来解决连续值的预测问题。我们通常需要给出一个训练集,训练集中包含已知的目的数据,同时还有与该预测可能相关的特征。
一个简单的一元线性回归的示例是:
我们能否给出房屋价格与房屋面积的关系预测?(或者给出当房屋面积为某个值时,房价的一个预测)
其中我们要给出一个训练集,训练集中包含多个房屋面积与对应房屋价格的真实数据。

符号约定与术语解释

术语解释

  • 特征:在本例中,房屋的面积、房屋的建筑年龄等一些与房屋价格可能相关的都是特征。
  • 特征向量:我们通常将同一个对象的特征数据使用一个特征向量来表示,该特征向量的分量都是该对象的一个特征。
  • 预测函数:我们想要得到的有关输入与输出的映射关系。
  • 代价函数:通常我们需要一种手段来衡量我们预测的好坏。我们一般使用一个代价函数来量化拟合与实际值的偏离程度。

符号约定

  • xix_i用来表示第i个特征,x(i)x^{(i)}用来表示第i个输入的特征向量,同样的xj(i)x^{(i)}_j表示第i个输入的第j个特征值。
  • 输出向量我们用yy来表示,其中y(i)y^{(i)}代表第i个输入向量对应的输出。
  • 预测函数我们表示为:
    hθ(x)=θ0+θ1x1+...+θnxn=θTxh_\theta(x)=\theta_0+\theta_1x_1+...+\theta_nx_n=\theta^Tx
    这表示预测函数的输入向量xx有n个分量,也即n个特征。
  • 代价函数我们表示为:J(θ)J(\theta)

代价函数

代价函数是衡量预测函数给出的预测值与实际值之间的偏离程度。
一个常用的代价函数是:
J(θ)=12mi=1m(hθ(x(i))y(i))2J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2
值得说明的是:这里的m指的是训练集中样本的个数,这里的12\frac{1}{2}是为了与求导时平方带来的2抵消。

目的

我们的目的是:确定一个预测函数
hθ(x)=θ0+θ1x1+...+θnxn=Xθh_\theta(x)=\theta_0+\theta_1x_1+...+\theta_nx_n=X\theta
对于每一个输入的向量xx,给出预测的yy值。
事实上是确定参数θ\theta,使得J(θ)J(\theta)取到最小值。
也即min(J(θ))min(J(\theta))

解决思路

可以看到我们经过问题形式的变化,已经将其转化为了一个最优化问题。由于线性回归的特殊性,其代价函数是一个凸函数,也就是说,不存在会陷入某个局部最优点的情况。
凸函数的解释详见 凸函数-维基百科
针对这个对于代价函数的最优化问题,我们想到了两种解决思路:梯度下降法正规方程法

梯度下降法

梯度下降法的思路是:把代价函数看做一个势函数,每次迭代时,选择向该点的梯度方向前进一步。
梯度的解释详见 梯度-维基百科
也即每次向势函数下降最快的方向前进一步,对于一个凸函数,只要我们每次前进的距离足够小,那么最终一定能到达该最优点。
值得注意的是,梯度下降法是一个普遍的最优化问题的启发算法,该算法并不保证能找到一个全局最优解,事实上这依赖于我们选择的初始点所在的位置。
该算法的工作过程示意图如下:
机器学习(1)多元线性回归
再次重申一下,这里目标是min(J(θ))min(J(\theta)),自变量是θ\theta
我们选择的初始位置是θ\theta,则每次我们都需要根据当前的梯度来更新下一次的θ\theta
更新公式是:
θj=θjαθjJ(θ)\theta_j=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta) α\alpha是学习率,也叫步长。
值得注意的是:这其中 αθjJ(θ)\alpha\frac{\partial}{\partial\theta_j}J(\theta) 部分是这个代价函数对于θj\theta_j的偏导数。
这就是我们所说的每次向该函数的梯度方向前进一步。

我们通常结束迭代的条件是,θj\theta_j收敛或改变在某个精确度内。编程上应当注意的点是,对于θ\theta,其各维度应当同步更新。

学习率的选择

学习率的选择是一个困难的问题。
当学习率过小时,其收敛速度实在太慢,我们将不得不重复进行更多次的迭代。
当学习率过大时,我们很容易跨过最优点,而到达一个没那么好的点,甚至有可能会比原来的代价函数更大。
在实践中,我们通常每3倍尝试一次,比如:

α=0.001,0.003,0.010.3,1α=0.001,0.003,0.01…0.3,1

特征缩放

有时我们会碰到参数的范围差异过大的情况。比如,一个参数取值在[0,1],而另一个参数的范围则在[0,100000],这在图中会显示出一个极其狭长的椭圆。(比下图还要夸张的多),我们每次在进行梯度下降迭代时,会遇到困难,这将使我们不得不进行更多次的迭代。
机器学习(1)多元线性回归
解决该问题的一个思路是:特征缩放(也叫归一化),该方法的思想是将所有特征的取值映射到一个合理的范围内。
通常,我们会将特征映射到[-0.5,0.5]的范围内,缩放公式是:
xi=xixˉimax(xi)min(xi)x_i=\frac{x_i-\bar x_i}{max(x_i)-min(x_i)}
经过映射后的代价函数像下图这样,不会再呈现出一种奇怪的狭长椭圆形。
该方法事实上是换了一个坐标系,将不同量度的特征映射到了量程差别不大的坐标系内。
机器学习(1)多元线性回归

正规方程法

还记得吗?我们的优化目标是min(J(θ))min(J(\theta)),自变量是θ\theta
上面的方法,令我们头疼的一点是学习率的选择,而且它需要频繁的迭代,除此之外,上面的方法并不能给出一个解析解。
因此我们尝试使用正规方程法来解决该问题:
值得注意的是:由于我们是多元线性回归,最后得到的是一个 yy 向量,因此我们根据
J(θ)=12mi=1m(hθ(x(i))y(i))2J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2
写出代价函数的向量表示方式:
J(θ)=12m(hθ(x)y)T(hθ(x)y)J(\theta)=\frac{1}{2m}(h_\theta(x)-y)^T(h_\theta(x)-y)
其中(hθ(x)y)(h_\theta(x)-y)是一个列向量。
下式是预测函数的定义:
hθ(x)=θ0+θ1x1+...+θnxn=Xθh_\theta(x)=\theta_0+\theta_1x_1+...+\theta_nx_n=X\theta
我们将其代入得到:
J(θ)=12m(Xθy)T(Xθy)J(\theta)=\frac{1}{2m}(X\theta-y)^T(X\theta-y)
其中XX是一个m×(n+1)m\times (n+1)的矩阵,构造方法是:
X={1x(1)T1x(2)T......1x(m)T}X= \left\{ \begin{matrix} 1 & x^{(1)^T} \\ 1 & x^{(2)^T} \\ ...&...\\ 1 & x^{(m)^T} \end{matrix} \right\}
其中x(i)x^{(i)}代表训练集中第 i 组数据,被写成一个(n×1n\times 1)的列向量形式。
dJ(θ)dθ=0\frac{d J(\theta)}{d\theta}=0 求使得代价函数取到最小值的点。
解得:
θ=(XTX)1XTy\theta=(X^TX)^{-1}X^Ty
这里不给出证明
只给出一个帮助记忆的方式:
最理想的情况是:(Xθy)=0(X\theta-y)=0
或者说是至少为一个很小很小的 δ\delta,因此有
Xθ=yX\theta=y
由于θ\theta是一个(n+1)×1(n+1)\times1的列向量,yy是一个(m×1m\times 1)的列向量。而XX是一个m×(n+1)m\times (n+1)的矩阵,X不是方阵无法求逆,因此需要左乘一个XTX^T在左边构造一个((n+1)×(n+1))((n+1)\times (n+1))的方阵XTXX^TX
此时等式变为:
XTXθ=XTyX^TX\theta=X^Ty
接着我们在两边左乘一个(XTX)1(X^TX)^{-1}
得到
θ=(XTX)1XTy\theta=(X^TX)^{-1}X^Ty
值得注意的是:(XTX)1(X^TX)^{-1}部分的计算要花费O(n3)O(n^3)的时间复杂度。同时(XTX)(X^TX)有时可能不可逆。
比如(XTX)(X^TX)不满秩,也即有两行内容线性相关,或者两个特征线性相关,或者训练集的样本个数小于特征数。

梯度下降与正规方程的对比

梯度下降法 正规方程法
时间复杂度 O(n2)O(n^2) O(n^3)
优点 计算速度快 写代码方便,不需迭代
缺点 需要选择适当的学习率α\alpha 当特征数相当高时,时间代价相当高,此外有时逆矩阵可能不存在。
应用场景 比较普遍,除此之外甚至能应用到一些更加复杂的算法中 当特征数不高时