>
Home

登龙(DLonng)

选择大于努力

从 0 开始机器学习 - 多维特征 & 多变量梯度下降 & 多项式回归 & 正规方程


版权声明:本文为 DLonng 原创文章,可以随意转载,但必须在明确位置注明出处!

一、多变量梯度下降

1.1 多维特征

上篇文章我们介绍了第一个机器学习算法,即通过房屋面积来预测价格,这个问题中只使用一个输入特征房屋面积,可现实生活中要解决的问题通常都含有多个特征,并且用多个特征训练出的模型准确度更高,那么如何机器学习算法如何处理多个特征的输入呢?

我们还用预测房价的例子,不过这次要增加另外 3 个特征,卧室数量,房屋楼层,房屋年龄:

这样一来,我们就有了 4 个输入特征了,特征多了,表示的方法也要升升级了:

  • $n$:输入特征的数量,即特征矩阵列数,也即特征向量的维度
  • ${x^{\left( i \right)}}$:训练集中第 $i$ 个实例向量,就是特征矩阵的第 $i$ 行,比如列向量 ${x}^{(2)}\text{=}\begin{bmatrix} 1416\ 3\ 2\ 40 \end{bmatrix}^T$

  • ${x_j}^{\left( i \right)}$:训练集中第 $i$ 个实例的第 $j$ 个特征,比如 $x_2^{\left( 2 \right)}=3$

特征数量增加了,之前的假设函数肯定也需要修改,要把增加的特征变量和参数加上:$h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+…+{\theta_{n}}{x_{n}}$,虽然这样表示没问题,但是却不方便利用向量来计算,因为参数 $\theta$ 有 n + 1 个,但 $x$ 只有 n 个,那怎么办呢?

很简单,我们额外增加一个 ${x_0}=1$,则上式变为:

这样一来就可以写成向量相乘的形式:

你可能要问了为何要写成向量的形式?主要因为 2 点:

  • 使用向量方便程序编写,一句计算特征向量的代码就可以同时计算多个输入参数,因为一个特征向量中包含所有输入参数
  • 使用向量方便算法执行,梯度下降算法要求参数同时更新,如果不使用向量,那更新起来非常麻烦。

通过增加一个维度 $x_0 = 1$,最终训练集的特征矩阵的大小为:$m * (n + 1)$,其中 m 为行数,n + 1 为列数。通过特征向量的表示,我们就可以将特征矩阵的每一行作为一个特征向量(就是特征组成的向量 =_=),并用它们来训练机器学习算法。

以上就是我对多维特征作为机器学习算法输入的一些理解,非常感谢吴恩达老师的公开课 ^_^。

2.1 多变量梯度下降法

多变量梯度下降与上一篇博客将的单变量梯度下降原理是一样的,只不过增加了特征变量,相应地参数也就增加了,比如线性回归的多变量假设函数、代价函数、梯度下降法如下:

  • 假设函数:$h_{\theta}\left( x \right)=\theta^{T}X={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+…+{\theta_{n}}{x_{n}}$
  • 代价函数:$J \left( \theta_0, \theta_1 … \theta_n\right) = \frac{1}{2m}\sum\limits_{i=1}^m \left( h_{\theta}(x^{(i)})-y^{(i)} \right)^{2}$
  • 多变量梯度下降法

因为参数增加到 n 个,所以梯度下降的偏导数也要分别对每个参数求一次,然后同时更新 n 个参数:

比如当 $n>=1$ 时更新前 3 个参数:

我觉得挺好理解的,只需要按照单变量梯度下降的逻辑拓展下变量和参数的数量即可,前提一定要完全理解单变量的梯度下降。

1.3 特征缩放

在有了多维特征向量和多变量梯度下降法后,为了帮助算法更快地收敛,还需要对选用的特征进行尺度缩放,其实就是缩小特征值,将多个特征的值都缩小到同样大小的区间,通常是缩小到 [-1, 1] 周围,以下图为例:

在没有进行特征缩放之前,两参数梯度下降的等高线图呈竖的椭圆形,这是因为横轴和纵轴参数范围不同,进而导致算法在寻找最小值时会迭代很多次,而当进行缩放使得横纵轴范围大致相同后,等高线图基本呈圆形,算法在迭代的时候往一个方向很快就能找到最小值,大大减少迭代次数。

缩放的最终结果不一定非要准确到 [-1, 1],比如 [-3, 3],[-2, 1] 这些范围不是太大都是可以的,一个又常用有简单的特征缩放计算方法是:

其中 ${\mu_{n}}$ 是平均值,${s_{n}}$ 是(max - min),比如用这个公式将所有的房屋面积和卧室数量进行缩放:

  • $x_1 = (size - 1000) / 2000$,其中 1000 是面积平均值,2000 是最大面积减最小面积。
  • $x_2 = (bedrooms - 2) / 5$,其中 2 是卧室数量平均值,5 个最大卧室数量减去最小卧室数量。

1.4 选择学习率的小技巧

上一篇文章中学习了梯度下降学习率的作用,这里再复习下吧,学习率 $\alpha$ 主要控制每次迭代的步长,步长太大可能导致算法不收敛,步长太小则导致收敛速度太慢,所以如何选择合适的学习率就至关重要了。

先来看下这个迭代次数和代价函数的图像,当迭代次数不断增加时,代价函数值不断减小,实际工作中可以通过查看这个图像来观察算法迭代是否符合实际情况,如果不是这样的曲线,那么选择的学习率可能就不合适。

吴恩达老师也分享了他常选择的学习率:0.01,0.03,0.1,0.3,1,3,10,可以参考老师的经验,站在巨人的肩膀上 ^_^。

二、多项式回归

多项式回归的用处是:用线性回归的方法来拟合比较复杂的函数,甚至是非线性函数。我们来配合一个例子理解它的作用:

还以预测房价为例,横轴是房屋面积,纵轴是价格,但我们打算采用二次曲线(蓝色)去拟合数据点时发现曲线最后会呈下降趋势显然不符合实际情况,应为房屋面积越大价格应该越高才对。

所以,我们选择使用呈上升趋势三次曲线(绿色曲线)来拟合数据点:

可问题来了,三次函数含有高阶的 2 次项和 3 次项,而我们之前介绍多维特征线性回归模型中只有一次项呀:

这可咋办?有办法,我们可以将三次曲线里面的高次项重新用新的变量替代,让数据值保持不变减小特征变量的阶次,就像这样:

  • $x_1 = (size)$:1 = 1
  • $x_2 = (size)^2$:100 = 10 的平方
  • $x_3 = (size)^3$:1000 = 10 的立方

即变量的值保持不变,只是换了个一次的表示,这样更换了之后,原来的三次预测模型就变为开头讲的多维特征的线性回归模型了:

不过要特别注意的是,这样替换后,上一节讲的特征缩放就要考虑进去了,因为替换后的 $x_1 = 1, x_2 = 10^2, x_3 = 10^3$ 的值没有变,但是特征值得范围差距太大,会导致梯度下降的等高线图不太圆,进而导致迭代步数太多,速度慢,没明白的再回头看看特征缩放那一节吧。

三、正规方程法

3.1 基本原理

之前介绍的梯度下降法求代价函数最小值用的是迭代的方法,但还记得高中学过的求函数极值的方法吗?就是令待求函数的导函数等于零,求出的变量 x 就是函数取最小值的位置。

这里介绍的正规方程法其实就是令代价函数对每个变量 $\theta_i$ 的偏导数等于 0,以此来求每个最优的 $\theta_i$:

上图就是正规方程求最优参数的原理,例子用的代价函数还是平方误差,关键步骤是对每个 $ j $ ,令 $\theta_j$ 的偏导数为 0,求出最后的 $\theta_0, \theta_1, \theta_2, …, \theta_n$。

上面的原理最终可以用一个矩阵公式来求解:

$X$ 表示输入的特征矩阵,$y$ 表示每个训练实例的结果组成的向量,$\theta$ 表示待求的参数,下面来看一个实际的例子。

3.2 用正规方程预测房价

我们还以预测房价为例,下面用正规方程法来求解:

假设我们有 4 个训练实例,那么特征矩阵 $X$ 就是 4 X 4,而 $y$ 就是每个房屋实例真实的房价,将这两个矩阵带入正规方程中就可以求出参数 $\theta$ 了:

原理搞清楚后,实际的代码其实就一行,毕竟是解方程,计算机很擅长这件事情:

import numpy as np
    
def normalEqn(X, y):
  # X.T@X 等价于 X.T.dot(X)
  theta = np.linalg.inv(X.T@X)@X.T@y 
  
  return theta

3.3 正规方程的 2 个缺陷

对于不可逆(奇异或退化)的矩阵 $X^TX$,正规方程是不能使用的,但这种不可逆的情况很少发生,导致这个矩阵不可逆的情况主要有以下 2 种(就是基本的线代不可逆理论):

  • 存在重复的特征变脸:用房价例子来解释就是说比如有一个特征 $x_1$ 以英尺来表示房屋尺寸,而另一个特征 $x_2$ 以米为尺寸,但是我们知道 1 米 = 3.28 英尺,所以这两个特征向量可以互相线性表示(相当于重复),则矩阵不可逆,解决方法就是找到删除重复的特征。
  • 特征数量大于训练实例数量:比如有 100 个特征变量,但是只有 10 个训练数据实例,即矩阵的行数小于列数,这样的情况也会导致矩阵不可逆,不过这种情况可以使用正则化技术解决,下次介绍吧。

3.4 正规方程 VS 梯度下降

我们已经学习了这两种方法,其中正规方程主要适用于特征变量数量不太大时(n < 10000),而梯度下降法在特征数量很多时效果比较好,下面是这两种方法的详细比较:

正规方程 梯度下降
不需要 需要选择学习率 $\alpha$
一次运算得出 需要多次迭代
特征数量 < 10000 可以接受 特征数量较大也能适用
只适用于线性回归模型 适用于各种模型

四、向量化

喜欢的小伙伴记得关注下面的公众号哦!

本文原创首发于同名微信公号「登龙」,关注我就是你今年做的最成功的一件事

DLonng at 03/24/20