该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。
本章含盖
- 5.1多维特征
- 5.2 多元梯度下降法
- 5.3 多元梯度下降法演练!—— 特征缩放
- 5.4 多元梯度下降法 —— 学习率
- 5.5 特征和多项式回归
- 5.6 正规方程(区别于迭代方法的直接解法)
- 5.7 正规方程在矩阵不可逆情况下的解决方法
5.1多维特征
n :特征量的数目
x^(i) :第 i 个训练样本的输入特性值
x^(i)_j :第 i 个训练样本中第 j 个特征量的值
- 新的假设函数公式:
为了方便标记,我们定义 x_0 为 1,也就是说在已有的 n 个特征外,我们额外增加了一个 x_0 特性,但这个 x_0 总是为 1 。
所以我们的特征向量是一个从0开始标记的 n+1 维的向量。
参数向量 与 特征向量 的内积
『 一个行向量乘以一个列向量称作向量的内积,又叫作点积,结果是一个数 』
因此,假设函数 h_θ(x) = θ_0*x_0 + θ_1*x_1 + θ_2*x_2 + … + θ_n*x_n
可以简化为 h_θ(x) = θ^T * X
多元线性回归
5.2 多元梯度下降法
不把 J 看做一个 n+1 个数的函数,我们会使用更通用的方式把 J 写成参数Θ这个向量的函数
- 当 n = 1 时
- 当 n > 1 时
5.3 多元梯度下降法演练!—— 特征缩放
不同的特征向量值,在相近的范围内。这样梯度下降法就能更快的收敛
- eg:
特征1 —— x1 为房屋的大小(0 ~ 2000)
特征2 —— x2 为房间数 (1~5)
如果 x1 和 x2 的值差的很多,那么 代价函数J(Θ) 的等高线图就会是非常歪斜且椭圆的形状。其实 2000 比 5 的比例会让这个椭圆更加瘦长。
如果你再这种代价函数(非常歪斜且椭圆的代价函数J(Θ))上运行梯度下降的话,你的梯度最终可能需要花很长一段时间,并且可能会来回波动。然后会经过很长时间最终才收敛到全局最小值
个人理解:【如果 x1 和 x2 的值差的很多,那么 代价函数J(Θ) 的等高线图就会是非常歪斜且椭圆的形状】这句话可以这么理解:
如下图所示。你看最外层的等高线,也就是代价函数误差最大的时候,当 x1 的值范围 远大于 x2 值的时候。当 θ2 取同一个值时,θ1只需要改变很小的值,就能得到一样误差很大的等高线。因为,x1 太大了,J(Θ) = θ_0 + θ_1 * x1 + θ_2 * x2 - y 的值一下就大了(即使 θ1改变的很小)。而当 x1 与 x2 在近视范围中的时候。等高线图看起来更加的“圆”。
如果,这个等值线图更细更长,结果就是梯度下降的过程可能更加缓慢,反复来回震荡,需要更长的时间才找到一条通往全局最小值的路。
个人理解:因为,如等值线越细长,J(Θ1)的导数会比较大(可以理解为,每次 Θ1 的改变较大,Θ2 的改变较小),因此会导致梯度下降的过程是一个左右斜率很低的振荡路线)。所以就可能导致来回波动,导致要经过更长的时间才可以收敛到全局最小值
特征缩放
有两种常见的特征缩放
- 将特征除以最大值
- 均值归一化
将特征除以最大值
在这样的情况下,一种有效的方法是进行特征缩放。
把特征 x1 定位为,房子的面积大小除以2000。并且把 x2 定义为,卧室的数量除以5.
所以,通过这种特征缩放,它们的值的范围变得更相近。
更一般的,我们执行特征缩放时,我们通常的目的是将特征的取值约束到 -1 到 +1 的范围内。
特性 x0 总是等于 1.
x1 和 x2 虽然不在 -1 ~ +1 之间,但是它们很靠近这个范围,所以是ok 的。(这里说的约等于 -1 <= xi <= 1 访问,指的是,最小值靠近与 -1,最大值靠近与 +1)
而 x3 显然不符合;x4 也是如此。
经验:如果一个特征是在 -3 到 +3 的范围内,这个范围是可以接受的。
-1/3 ~ 1/3 、0 ~ 1/3 、-1/3 ~ 0 也是可以接受的。
这些是典型的范围
均值归一化
除了,将特征除以最大值以外,在特征缩放中,有时候我们也会进行一个称为“均值归一化”的工作
u_i 为特征值 x_i 的平均值。
均值归一化后的结果,会使得 x_i 的范围靠近 -0.5 ~ +0.5
s_i :就是特征值的范围(即,最大值 - 最小值 ,也称作’标准差’)
均值归一化的运算并不需要太精确,它只是为了让梯度下降能够运行的更快一点而已。
5.4 多元梯度下降法 —— 学习率
横轴为 梯度下降法迭代的次数
如果梯度下降正常工作,那么每一步迭代后 J(Θ) 都应该下降
通过这条曲线可以帮助你判断,梯度下降法是否已经收敛。
对于每个特定的问题,梯度下降算法所需的迭代次数可能相差会很大。实际上,我们很难预算梯度下降算法需要多少步迭代才能收敛。我们通常画出这样的曲线,来判断梯度下降算法是否已经收敛。
另外,也可以进行一些自动的收敛测试。也就是说,用一种算法来告诉你梯度下降法是否已经收敛。这里是自动收敛测试的一个典型例子
通常这样的曲线图通常意味着你应该使用较小的学习率 α
通常这样的曲线图通常也意味着你应该使用较小的学习率 α
- For sufficiently small α,J(Θ) should decrease on every iteration.
- But if α is too small,gradient descent can be slow to converge.
两个结论适用于“线性函数”,因为线性函数只有一个局部最优解,即全局最优解
- 总结
每隔 10 倍取一个值。
根据每隔 α 值,我们都绘制一个 J(Θ) 同 迭代次数的曲线图,然后根据曲线图选择一个最合适的 α 值。
经验:α 值之间间隔为3倍(而非10倍)
5.5 特征和多项式回归
与选择特征的想法密切相关的一个概念,被称为多项式回归。那么我们如何将模型与数据进行拟合了?
使用多元线性回归的方法,我们可以对算法做一个简单的修改来实现它
为了将 h_θ(x) = θ_0 + θ_1 * x_1 + θ_2 * x_2 + θ_3 * x_3 与 “θ_0 + θ_1 * x + θ_2 * x^2 + θ_3 * x^3” 对应起来。
特征向量 x_1 为 房屋面积
特征向量 x_2 为 房屋面积的平方
特征向量 x_3 为 房屋面积的立方
然后再应用线性回归的方法,我们就可以拟合这个模型。
注意,如果你像这样选择特征,那么特征缩放就变得更重要了
- 特征选择:
二次函数不合理的地方在于,存在一个最高点之后y值会慢慢下降(因为,如图所见,这里的 θ_2 是一个负数,所以 θ_2*(size)^2 存在一个最高点),我们不认为随着房屋面积的增大,房屋价格会降下。
除了选择用三次函数外,我们还可以选择用平方根函数,基于我我们对平方根函数的了解(到一定值之后会缓慢提升)
5.6 正规方程(区别于迭代方法的直接解法)
对于某些线性回归问题,它会给我们更好的方法,来求得参数Θ的最优值。
目前为止,我们一直使用的线性回归算法是“梯度下降法”。
正规方程法
直观理解
- J 是 Θ 的一个函数,Θ 为实数:
最小化一个函数的方式,是对它求导,并将导数置0。
因为,导数就是函数曲线的斜率,当导数为 0 的时候,说明是斜率水平与 x 轴,也就是曲线在最低点的时候。
- 当 Θ 不是实数时,而是一个 n+1 维的参数向量:
我们如何最小化代价函数了?微积分的知识告诉我们,逐个对对象参数 Θ_j 求 J 的偏导数,然后把它们全部置零,求出 Θ_0、Θ_1、…、Θ_n 的值,这样就能得到能够最小化代价函数 J 的 Θ 值。
而这样的微积分最终可能很复杂。实际上接下来要讲的算法,可以不用计算所有的Θ的导数,也可以求得 J 的最优解。。。
举例
X 是 m * (n+1) 维矩阵,y 是一个 m 维向量
m :样本数
n :特征变量数
这个求得的 Θ 即为 使得代价函数最小化的 Θ。
如果你使用“正规方程法”,那么就不需要特征缩放。(梯度下降算法,需要特征缩放,让特征值靠近一个区间范围)
梯度下降算法 VS 正规方程法
实现逆矩阵计算( (X^T * X)^-1 )的代价,以矩阵维度的三次方增长。即 O(n^3)。
所以,如果 n 很大,我们可能还是会使用梯度下降法。
那么什么是大,什么是小了?
若 n 是百位数级别,或千位数级别,现代计算机对其计算逆矩阵算法还是很快的。
若 n 是万级别的,可能有用“正规方程法”就会比较慢了,此时可能会倾向于使用梯度下降法。万级别是一个中间级别,可以都试试看。。。
若 n 远大于万级别,我们可能就会使用梯度下降法了。如,一个百万级别个数的特征量
经验:当 n 在一万左右,会考虑换成“梯度下降法”或其他算法。
关于复杂的学习算法,如,分类算法,logistic回归算法,正规方程法不适用于这些复杂的学习算法,我们将不得不仍然使用梯度下降法。
5.7 正规方程在矩阵不可逆情况下的解决方法
我们称那些不可逆矩阵为 奇异或退化矩阵。
如果 X^T*X 不可逆,通常有两种最常见的原因:- 如果由于某些原因,你的学习问题中包含了多余的特征。
如,两个特征,x1 是为单位为英尺的面积;x2是单位为米的面积
这样 x1 = (3.28)^2 * x2 。这样 x1 与 x2 就互为线性函数了!!
这种情况,X 的‘行列式’为0 (|X|=0)。X 不可逆
- 在 m < n 的时候,即,具有了很多的特征
解决:减少特征参数或者使用一个叫“正则化”的方法
“正则化”可以让你使用很多的特征来配置很多参数,即使你有一个相对较小的训练集。