网易云课堂-吴恩达机器学习-学习归纳-3-多变量线性回归

一、多维特征

https://blog.csdn.net/weixin_42049250/article/details/99758900中我们讨论了单变量的线性回归问
题,还拿预测房价的例子来说,在单变量线性回归的问题中,我们只有一个特征-------房子的面积;
假设,现在我们要考虑更多的特征,如卧室的数量、所在楼层、房子的使用年限等等,由此构建一个
含有多个特征的模型。

如下图中表格所示,每一行代表训练集中的一个样本,每一个样本有4个特征:面积、卧室数量、楼
层以及使用年限。在这里插入图片描述
m m m 代表训练集中样本的个数,本例中 m = 47 m=47 m=47

n n n 代表特征的数量,本例中 n = 4 n = 4 n=4
x ( i ) x^{(i)} x(i) 代表第 i i i 个训练样本,是特征矩阵中的第 i i i 行,是一个向量,例如 x ( 2 ) = [ 1416 3 2 40 ] x^{(2)} = \left[\begin{matrix}1416\\3\\2\\40\end{matrix} \right] x(2)=14163240

x j ( i ) x^{(i)}_j xj(i) 代表第 i i i 个训练样本的第 j j j 个特征,也就是特征矩阵中第 i i i 行第 j j j 列的元素,例如 x 2 ( 2 ) = 3 , x 1 ( 4 ) = 2 x^{(2)}_2 = 3,x^{(4)}_1 = 2 x2(2)=3,x1(4)=2

对于有 n n n 个特征的线性回归问题,我们给出如下假设: h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_{\theta}(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_nx_n hθ(x)=θ0+θ1x1+θ2x2+...+θnxn

这个公式中有 n + 1 n+1 n+1 个参数和 n n n 个变量,为了使得公式能够简化一些,引入 x 0 = 1 x_0=1 x0=1,则公式转化为: h θ ( x ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_{\theta}(x) = \theta_0x_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_nx_n hθ(x)=θ0x0+θ1x1+θ2x2+...+θnxn

此时模型中的参数 θ \theta θ 是一个 n + 1 n+1 n+1 维的向量,每个训练样本也是个 n + 1 n+1 n+1 维的向量,特征矩阵 X X X 的维度是 m ∗ ( n + 1 ) m*(n+1) m(n+1)。 因此上面的公式可以简化为: h θ ( x ) = θ T X h_θ (x)=θ^TX hθ(x)=θTX,其中上标 T T T 代表矩阵的转置。

二、多变量梯度下降

单变量线性回归的代价函数:
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 , 其 中 : h θ ( x ) = θ T X = θ 0 + θ 1 x 1 J(θ_0,θ_1)= \frac{1}{2m} \sum\limits_{i=1}^m(h_θ(x^{(i)} )-y^{(i)} )^2 , 其中:h_θ (x)=θ^TX=θ_0+θ_1x_1 J(θ0,θ1)=2m1i=1m(hθ(x(i))y(i))2hθ(x)=θTX=θ0+θ1x1
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,这个代价函数是所有建模
误差的平方和,即: J ( θ 0 , θ 1 . . . θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(θ_0,θ_1...θ_n )=\frac{1}{2m} \sum\limits_{i=1}^m(h_θ(x^{(i) } )-y^{(i) })^2 J(θ0,θ1...θn)=2m1i=1m(hθ(x(i))y(i))2 其 中 : h θ ( x ) = θ T X = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n 其中:h_θ (x)=θ^T X=θ_0+θ_1 x_1+θ_2 x_2+...+θ_n x_n hθ(x)=θTX=θ0+θ1x1+θ2x2+...+θnxn

我们的目标是要找出使得代价函数最小的一系列参数,多变量线性回归的批量梯度下降算法为:
θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 , . . . , θ n ) \theta_j := \theta_j - \alpha\frac{\partial}{\partial \theta_j}J(\theta_0,\theta_1,...,\theta_n) θj:=θjαθjJ(θ0,θ1,...,θn)
即, θ j : = θ j − α ∂ ∂ θ j 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \theta_j := \theta_j - \alpha\frac{\partial}{\partial \theta_j}\frac{1}{2m} \sum\limits_{i=1}^m(h_θ(x^{(i) } )-y^{(i) })^2 θj:=θjαθj2m1i=1m(hθ(x(i))y(i))2
求导后得到: θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha\frac{1}{m} \sum\limits_{i=1}^m(h_θ(x^{(i) } )-y^{(i) })x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)
注意:这里每个参数都是同步更新的。
n > = 1 n>=1 n>=1时,
θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) θ_0:=θ_0-\alpha \frac{1}{m} \sum\limits_{i=1}^m(h_θ(x^{(i) } )-y^{(i) })x_0^{(i)} θ0:=θ0αm1i=1m(hθ(x(i))y(i))x0(i)
θ 1 : = θ 1 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) θ_1:=θ_1-\alpha \frac{1}{m} \sum\limits_{i=1}^m(h_θ(x^{(i) } )-y^{(i) })x_1^{(i)} θ1:=θ1αm1i=1m(hθ(x(i))y(i))x1(i)
θ 2 : = θ 2 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 2 ( i ) θ_2:=θ_2-\alpha \frac{1}{m} \sum\limits_{i=1}^m(h_θ(x^{(i) } )-y^{(i) })x_2^{(i)} θ2:=θ2αm1i=1m(hθ(x(i))y(i))x2(i)
我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。

下面给出Python代码:

def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

三、梯度下降算法实践技巧----特征缩放

特征缩放(feature scaling)的思想大致是这样的:梯度下降算法中,在有多个特征的情况下,如果你能确保这些不同特征的值都处在一个相近的范围,这样梯度下降法就能更快地收敛。还是房价预测的例子,假如我们取两个特征,一个是房屋面积大小,它的取值在0到2000之间;另外一个是卧室的数量,这个值的取值范围在1到5之间。其代价函数 J ( θ ) J(θ) J(θ)是一个关于参数 θ 0 θ_0 θ0 θ 1 θ_1 θ1 θ 2 θ_2 θ2 的函数。这里我们暂时不考虑 θ 0 θ_0 θ0,并假想这个函数的参数只有 θ 1 θ_1 θ1 θ 2 θ_2 θ2。如果 x 1 x_1 x1 的取值范围远远大于 x 2 x_2 x2 的取值范围的话,那么最终画出来的代价函数 J ( θ ) J(θ) J(θ) 的图像就会呈现出像下图一样,是一种非常瘦长的椭圆形状,如果用这个代价函数来进行梯度下降的话,需要非常多次的迭代才能收敛。
在这里插入图片描述
那么如何解决这个问题呢?

举例来说,把特征 x 1 x_1 x1 定义为房子的面积大小除以2000,并且把 x 2 x_2 x2 定义为卧室的数量除以5。如此一来,表示代价函数 J ( θ ) J(θ) J(θ) 的轮廓图的形状偏移就会没那么严重。如果用这样的代价函数来进行梯度下降的话,算法会找到一条更快捷的路径通向全局最小,而不是像刚才那样,沿着一条让人摸不着头脑的路径、一条复杂得多的轨迹来找到全局最小值,如下图所示。
在这里插入图片描述
因此,通过特征缩放,通过“消耗掉”这些值的范围(在这个例子中,我们最终得到的两个特征 x 1 x_1 x1 x 2 x_2 x2 都在 0 和 1 之间),得到的梯度下降算法就会更快地收敛。更一般地,我们在执行特征缩放时,将特征的取值约束到-1 到 +1 的范围内(注意:特征 x 0 x_0 x0 总是等于1的,已经在这个范围内了)。但对其他的特征,我们可能需要通过除以不同的数来让它们处于同一范围内。

举一些例子来看看哪些情况下要进行特征缩放,哪些不用特征缩放:
如果你有一个特征 x 1 x_1 x1 ,它的取值在 0 到 3 之间,非常接近 -1 到 +1 的范围,不用特征缩放。如果你有另外一个特征,取值在-2 到 +0.5 之间,也非常接近 -1 到 +1 的范围,也不用特征缩放。但如果你有另一个特征,假如它的范围在 -100 到 +100 之间,那么这个范围跟 –1 到 +1 就有很大不同了,所以,这可能是一个不那么好的特征,需要进行特征缩放。类似地,如果你的特征在一个非常非常小的范围内,比如 -0.0001 和 +0.0001 之间,那么这同样是一个比 –1 到 +1 小得多的范围,因此,我们同样会认为这个特征也不太好。

所以,你所认可的范围可以大于或者小于 -1 到 +1 的范围,但是也别太大或者太小到不可以接受的范
围。通常不同的人有不同的经验,但是我们一般是这么考虑的:如果一个特征是在 -3 到 +3 的范围内,那么你应该认为这个范围是可以接受的。但如果这个范围大于了 -3 到 +3 的范围,我们可能就要
开始注意了。如果它的取值在 -1/3 到 +1/3 的话,我们觉得也还不错,可以接受,或者是 0 到 1/3 或 -1/3 到 0 这些典型的范围,我们都认为是可以接受的。但如果特征的范围取得很小的话,你就要开始考虑进行特征缩放了。

总的来说,不用过于担心你的特征是否在完全相同的范围或区间内,只要他们足够接近的话,梯度下降法就会正常地工作。在特征缩放中,除了将特征除以最大值以外,有时我们也会进行一个称为均值归一化的工作(mean normalization)。如果你有一个特征 x i x_i xi,你就用 x i − μ i x_i - μ_i xiμi 来替换它,通过这样缩放以后,所有特征的均值都变成了0,( μ i μ_i μi 指所有 x i x_i xi 的平均值)。

很明显,我们不需要把这一步应用到 x 0 x_0 x0 中,因为 x 0 x_0 x0 总是等于1的,所以它不可能有为0的平均值。但是对其他的特征来说,比如房子的大小,取值介于 0 到 2000,并且假设房子面积的平均值等于1000,那么你可以用这个公式将 x 1 x_1 x1 的值变为 x 1 x_1 x1 减去平均值 μ 1 μ_1 μ1,再除以2000。类似地,如果你的房子有五间卧室,并且平均一套房子有两间卧室,那么你可以使用这个公式来归一化你的第二个特征 x 2 x_2 x2

更一般地:令 x n = ( x n − μ n ) / s n x_n=(x_n-μ_n)/s_n xn=(xnμn)/sn 来替换原来的特征 x n x_n xn,其中 μ n μ_n μn是平均值, s n s_n sn是标准差。

这类公式将把你的特征变成如下这样的范围,也许不是完全这样,但大概是这样的范围:

-0.5 < x i x_i xi < 0.5

四、梯度下降算法实践技巧----选取学习率

迭代次数和代价函数之间的图像,如下图所示:
在这里插入图片描述
如果梯度下降算法正常工作,那么每一步迭代之后 J ( θ ) J(θ) J(θ) 都应该下降。从上图的这条曲线中可以看到,当迭代次数达到300到400步之间时, J ( θ ) J(θ) J(θ) 并没有下降多少。当达到400步迭代时,这条曲线看起来已经很平坦了。也就是说,400步迭代后,梯度下降算法基本上已经收敛了。对于每一个特定的问题而言,梯度下降算法所需的迭代次数可以相差很大。也许对于某一个问题,梯度下降算法只需要30步迭代就可以收敛;然而换一个问题,也许梯度下降算法就需要3000步迭代;再对于另一个机器学习问题而言,则可能需要三百万步迭代。实际上,我们很难提前判断梯度下降算法需要多少步迭代才能收敛。因此,通常我们需要画出这类曲线,画出代价函数随迭代步数增加的变化曲线。

通常,我们可以通过看这种曲线,来试着判断梯度下降算法是否已经收敛。也有一些自动测试是否收敛的方法,例如将代价函数的变化值与某个阀值(例如0.001)进行比较,但一般来说,看图像的方法更好一些。

此外,这种曲线图也可以在算法没有正常工作时,提前警告你,如下图:
在这里插入图片描述
左上角这张图,代价函数 J ( θ ) J(θ) J(θ) 随着迭代步数的增加在不断上升,表明梯度下降算法没有正常工作。对于这样的曲线,通常意味着你应该使用较小的学习率 α \alpha α。左下角这张图,代价函数 J ( θ ) J(θ) J(θ) 随着迭代次数,先下降,然后上升,接着又下降,然后又上升,如此往复。解决这种情况的方法,通常同样是选择较小 α \alpha α 值。对于线性回归问题,只要学习率选择得足够小,每次迭代之后,代价函数 J(θ)都会下降。因此如果代价函数没有下降,可以认为是学习率选择过大造成的。此时,你就应该尝试一个较小的学习率。当然,也不能选得太小,因为如果这样,梯度下降算法可能收敛得很慢。

总结:
1、梯度下降算法的每次迭代受到学习率的影响,如果学习率 α \alpha α 过小,则达到收敛所需的迭代次数会非常高;如果学习率 α \alpha α 过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。

2、为了调试所有这些情况,绘制 J ( θ ) J(θ) J(θ) 随迭代步数变化的曲线,通常可以帮助我们弄清楚到底发生了什么。
当我们运行梯度下降算法时,通常会尝试一系列 α \alpha α 值,如:
α α α = 0.01,0.03,0.1,0.3,1,3,10
在实践中,怎么选取一个比较好的学习率呢?

通常会尝试一系列 α \alpha α 值,你可以先把学习速率设置为0.01,然后观察曲线的走向,如果 J ( θ ) J(θ) J(θ) 在减小,那你可以逐步地调大学习速率,试试0.03,0.1,0.3,1.0….如果 J ( θ ) J(θ) J(θ) 在增大,那就得减小学习速率,试试0.003,0.001,0.0003….经过一番尝试之后,你可以大概确定学习速率的合适的值。

所以,在选择学习率时,可以大致按3的倍数来取值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值