【机器学习算法推导】简单线性回归与多元线性回归

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hemk340200600/article/details/85108862

线性回归,主要用于从数据中拟合出一条直线(或更高维的平面),这条直线能够很好地体现数据的特征,比如,它能够使得平面上的点都均匀地分布在这条直线上。

算法思想

对于简单线性回归和多元线性回归,其算法过程是相同的,不同之处在于简单线性回归只有一个特征需要拟合,多元线性回归有n个。在线性回归中,我们的数据集拥有一定的参数和相应的输出,令 x ( i ) x^{(i)} 表示第i个数据的参数, y ( i ) y^{(i)} 表示第i个数据的输出,令目标函数 H θ ( x ( i ) ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n H_θ(x^{(i)})=θ_0+θ_1x_1+θ_2x_2+...+θ_nx_n ,这是我们最终得到的函数,其中x1,x2,…,xn为我们拥有的一个个已知参数,比如我们的线性回归最终要预测房价,那么这里的x可能是房屋大小,离市中心的距离等等条件,函数的最终输出就是预测值。其中的θ都是未知的。不同的θ对应着不同的直线,为了得到最佳的拟合直线,我们的目标就是找到最佳的θ。因此线性回归的任务如下:
min θ 1 , θ 2 , . . . θ n { 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 } \min \limits_{θ_1,θ_2,...θ_n}\{\frac{1}{2m}\sum_{i=1}^{m}(h_θ(x^{(i)})-y^{(i)})^2\}
其中 ( h θ ( x ( i ) ) y ( i ) ) 2 (h_θ(x^{(i)})-y^{(i)})^2 表示函数的预测值与实际值的平方误差(square error)。由于我们有若干的数据,因此对他们的平方误差计算后累加,由于相加后误差会变大,因此我们取一个均值除以m,最后再除以2的原因是,方便后面的计算(2可以被约掉),并且多除一个2并不会影响整个式子的意义。

损失函数

定义 J ( θ 0 , θ 1 , . . . , θ n ) = 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 J(θ_0,θ_1,...,θ_n)=\frac{1}{2m}\sum_{i=1}^{m}(h_θ(x^{(i)})-y^{(i)})^2 ,其中的 ( h θ ( x ( i ) ) y ( i ) ) 2 (h_θ(x^{(i)})-y^{(i)})^2 作为损失函数,它定义了预测值与实际值之间的一种联系,当损失函数的值越小时,说明预测值与实际值越接近,从而我们的目标变为找到合适的θ使得损失函数的值越小越好。

梯度下降

梯度下降(Gradient Descent)算法是机器学习中一种常用的算法,可以用来最小化我们的损失函数。损失函数并不止上面用到的这种,还包括其他各种各样的损失函数,都可以利用梯度下降来找到一个局部最优解。
梯度下降算法的思想是这样的:对于一个由若干个θ形成的直线、曲线或者平面或其他形状,我们随机地给θ赋初始值,它必定位于图像上的某个位置,在那个位置上,寻找一个最陡的方向往下走,重复这个步骤,最终肯定能够到达某个点,并且没有比他更低的点,此时我们就找到了最优解。
所谓的“最陡”怎么定义的呢?我们知道一条曲线,最陡的地方就是它的切线方向,因此我们可以通过求导的方式来得到它,对于多元函数,我们需要用到偏导来求。因此得到参数的更新公式如下:
θ j : = θ j α θ J ( θ 0 , θ 1 , . . . , θ n ) θ_j:=θ_j-α\frac{∂}{∂θ}J(θ_0,θ_1,...,θ_n)

学习率

其中α定义为学习率,直观上看就是每次更新时的步长。当α较小时,每次更新变化的数值都比较小,因此可能需要多次迭代才能到达最优解。当α较大时,每次更新变化的数值较大,可能会跳过最低点,甚至导致无法收敛的情况。通常a从0.001,0.01,0.1,1这些值里面尝试。

计算公式

在简单线性回归的情况下,有 h θ ( x ( i ) ) = θ 0 + θ 1 x 1 h_θ(x^{(i)})=θ_0+θ_1x1
当j=0时, θ 0 J ( θ 0 , θ 1 ) = 1 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) \frac{∂}{∂θ_0}J(θ_0,θ_1)=\frac{1}{m}\sum_{i=1}^{m}(h_θ(x^{(i)})-y^{(i)})
当j=1时, θ 1 J ( θ 0 , θ 1 ) = 1 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) x ( i ) \frac{∂}{∂θ_1}J(θ_0,θ_1)=\frac{1}{m}\sum_{i=1}^{m}(h_θ(x^{(i)})-y^{(i)})·x^{(i)}
此时 θ 0 θ_0 θ 1 θ_1 的更新公式如下:
θ 0 = θ 0 α 1 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) θ_0=θ_0-α·\frac{1}{m}\sum_{i=1}^{m}(h_θ(x^{(i)})-y^{(i)})
θ 1 = θ 1 α 1 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) x ( i ) θ_1=θ_1-α·\frac{1}{m}\sum_{i=1}^{m}(h_θ(x^{(i)})-y^{(i)})·x^{(i)}
在多元线性回归的情况下,计算方式也是一样的。

局部最优与全局最优

由于上面的梯度下降算法是先累计m次的结果后再进行参数的更新,因此也称为批量梯度下降(Batch Gradient Descent)。它有一个明显的缺点,就是容易陷入局部最优解的情况,当我们的参数构成的图像并不完全是凸的时候,不同的初始值可能会陷入到不同的局部最优解中。当梯度下降算法接近一个最优解时,导数值会越来越小,最终收敛,但是这个局部最优解很可能不是一个全局最优解,虽然对于简单线性回归来说并没有这个问题,因为它的图像就是一个简单的凸平面,局部最优就是全局最优。这里涉及到凸优化理论,不做深入讨论,待之后再进行学习吧。

特征缩放(feature scaling)

我们的参数,通常有各种各样的范围,比如身高的范围在150到200。体重的范围在80到200,年龄到范围在0到150。当这些参数作用到损失函数上时,会导致我们的特征等高线图变得臃肿(实在不知道怎么形容)…在这样的图形上,局部下降需要迭代更多的次数,才能够到达最优解所在的位置。
为了防止这种情况,使用特征缩放将参数归一化到一个固定的范围,如-1到1之间。当所有特征都位于这个范围内时,特征等高线图会变得平滑,也更容易收敛。

均值归一化(mean normalization)

一种常见的特征缩放技巧,将特征 x i x_i 缩放为 x i x x m a x x m i n \frac{x_i-\overline{x}}{x_{max}-x_{min}} ,从而使 1 x i 1 -1\leq x_i\leq 1

标准方程法(正规方程法)

使用梯度下降来求解线性回归,需要较多次的迭代,还需要选择合适的a,才能够收敛到一个合适的值。使用标准方程法,可以一次性求解θ的最优值,下面看看标准方程法的具体过程。
首先,标准方程法是基于线性代数以及最小二乘法的一种方法。我们将所有的特征,比如 x 1 x_1 表示身高, x 2 x_2 表示体重, x 3 x_3 表示年龄,分别用列向量来表示,在将其组织成矩阵的形式如下:
X = { x 1 T x 2 T x 3 T } , θ = { θ 1 θ 2 θ 3 } , Y = { y 1 y 2 y 3 } X= \left\{ \begin{matrix} x_1^T \\ x_2^T \\ x_3^T \end{matrix} \right\} ,θ= \left\{ \begin{matrix} θ_1 \\ θ_2 \\ θ_3 \end{matrix} \right\} ,Y= \left\{ \begin{matrix} y_1 \\ y_2 \\ y_3 \end{matrix} \right\}

标准方程法推导

矩阵X中,每一列代表原始样本中的一行数据,都是已知的。矩阵Y也是已知的,我们需要求解Xθ=Y,找到合适的θ使得Xθ=Y成立。根据线性代数的知识我们知道Xθ=Y只有当 Y Y 中每个值是对应 X i X_i 每个值的线性组合,此方程才有解。因为θ矩阵反映了他们之间是怎样的一种线性组合。换句话说,Y向量必须存在于X矩阵列向量形成的列空间中,方程才能有解。但是这个不一定成立,所以我们想办法,将向量Y映射到X的列空间中。而实现这一步的步骤就是在方程左边同时乘上 X T X^T ,从而得到 X T X θ = X T Y X^TXθ=X^TY 。这一步相当于对Y进行了投影,本质上是最小二乘法。当 X T X X^TX 可逆时,便可以得到 θ = ( X T X ) 1 X T Y θ=(X^TX)^{-1}X^TY 。这就是标准方程法最终的形式。当 X T X X^TX 不可逆时,可以使用伪逆来计算,虽然这种情况很少出现。

标准方程法vs梯度下降法

标准方程法虽然可以一次性求出最优解,也不需要选择合适的学习率,但是在求 ( X T X ) 1 (X^TX)^{-1} 时需要耗费大量时间,当我们的特征数较多时,往往不推荐使用。通常当特征数小于10000时较为合适。
梯度下降法虽然需要迭代,需要选取合适的学习率,但是它的适用范围较广,在其他众多机器学习算法中,梯度下降算法往往是适用的,虽然迭代次数上可能有些差异,但是总体上表现良好。而标准方程法只适用于求线性回归的情况。

猜你喜欢

转载自blog.csdn.net/Hemk340200600/article/details/85108862