机器学习部分:特征缩放

特征缩放(feature scaling)

其中,特征缩放(feature scaling)大致的思路是这样的:梯度下降算法中,在有多个特征的情况下,如果你能确保这些不同的特征都处在一个相近的范围,这样梯度下降法就能更快地收敛。

举个例子来说明:

x1=size(0−2000)feet2x1=size(0−2000)feet2 
x2=卧室的数量(1−5)x2=卧室的数量(1−5)

假如你有一个具有两个特征的问题,其中x1x1是房屋面积大小,它的取值在0到2000之间;x2x2是卧室的数量,可能这个值的取值范围在1到5之间。其代价函数J(θ)J(θ)是一个关于参数θ0,θ1和θ2θ0,θ1和θ2的函数。但这里我们暂时不考虑θ0θ0并假想一个函数的变量只有θ1和θ2θ1和θ2。

如果x1x1的取值范围远远大于x2x2的取值范围的话,那么最终画出来的代价函数J(θ)J(θ)的轮廓图就会呈现出这样一种非常偏斜并且椭圆的形状:

这里写图片描述

如果你用这个代价函数来运行梯度下降的话,你要得到梯度值最终可能需要花很长一段时间,并且可能会来回波动,然后会经过很长时间最终才收敛到全局最小值。

这里写图片描述

事实上如果这些轮廓再被放大一些的话,如果你画的再夸张一些把它画的更细更长,那么可能情况会更糟糕,梯度下降的过程可能更加缓慢,需要花更长的时间反复来回振荡,最终才找到一条正确通往全局最小值的路。

在这样的情况下一种有效的方法是进行特征缩放(feature scaling)。

具体来说把特征xx定义为:

x1=size(feet2)2000x1=size(feet2)2000

x2=卧室的数量5x2=卧室的数量5

通过这样的变化,表示代价函数J(θ)J(θ)的轮廓图的形状就会变得偏移没那么严重,可能看起来更圆一些了。

这里写图片描述

如果你用这样的代价函数来执行梯度下降的话,那么可以从数学上来证明梯度下降算法将会找到一条更捷径的路径通向全局最小,而不是像刚才那样 沿着一条让人摸不着头脑的路径,来找到全局最小值。

因此在这个例子中,通过特征缩放,我们最终得到的两个特征x1x1和 x2x2都在0和1之间,这样你得到的梯度下降算法就会更快地收敛。

更一般地,我们执行特征缩放时,我们通常的目的是将特征的取值约束到−1到+1的范围内。其中,特征x0x0总是等于1,因此这已经是在这个范围内了,但对于其他的特征,你可能需要通过除以不同的数来让它们处于同一范围内。

−1和+1这两个数字并不是太重要,所以如果你有一个特征x1x1它的取值在0 ~ 3之间,这没问题 如果你有另外一个特征取值在-2 ~ +0.5之间,这也没什么关系,因为这也非常接近-1 ~ +1的范围。

但如果你有另一个特征x3,假如它的范围在-100 ~ +100之间,那么这个范围跟-1 ~ +1就有很大不同了。所以这可能是一个不那么好的特征。类似地,如果你的特征在一个非常非常小的范围内,比如另外一个特征x4,它的范围在-0.0001 ~ +0.0001之间,那么这同样是一个比-1 ~ +1小得多的范围,因此我同样会认为这个特征也不太好。所以可能你认可的范围,也许可以大于或者小于-1 ~ +1,但是也别太大或太小,只要与-1 ~ +1范围偏差不多就可以接受。

因此,总的来说不用过于担心你的特征是否在完全相同的范围或区间内,但是只要它们足够接近的话,梯度下降法就会正常地工作。

猜你喜欢

转载自blog.csdn.net/wyqwilliam/article/details/81750879