Linear Regression 线性回归
线性回归,给定一个样本集合 D=(x1,y1),(x2,y2),⋯,(xm,ym) 这里的xi,yi都可以是高维向量,可以找到一个线性模拟f(xi)=wxi+b,只要确定了w跟b,这个线性模型就确定了,如何评估样本y与你的f(x)之间的差别,最常用的方法是最小二乘法。
也就是说,我们用一条直线去模拟当前的样本,同时预测未来的数据,即我们给定某一个x值,根据模型可以返回给我们一个y值,这就是线性回归。
为了表示方便,我们使用如下的形式表示假设函数,为了方便 hθ(x) 也可以记作 h(x)。
hθ(x)=θ0+θ1x
现在的问题是我们如何选择θ0跟θ1 ,使得对于训练样本(x,y),h(x)最『接近』y。h(x)与y越是接近,说明假设函数越是准确。这里我们选择均方误差作为衡量标准,即每个样本的估计值与实际值之间的差的平方的均值最小。
用公式表达为
minθ0,θ112mm∑i=0(hθ(x(i))−y(i))2
12m是为了后续求导的计算方便,不影响最小化均方误差。
下面引入代价函数(cost function)
。
Linear Regression cost function
J(θ0,θ1)=12mm∑i=0(hθ(x(i))−y(i))2
|
|
也就是我们的优化目标,使得代价函数J(θ0,θ1)最小,即minθ0,θ1J(θ0,θ1)
对应于不同的θ0 θ1 ,函数hθ(x)=θ0+θ1x表示不同的直线。如下图,是我们最理想的情况。
我们需要不断的尝试不同的θ0θ1直到找到一个最佳的hθ(x)。是否有特定的算法,来帮助我们自动的找到最佳的hθ(x)呢?下面我们介绍梯度下降法。
梯度下降(Gradient descent)
梯度下降法是一种优化方法,它可以帮助我们快速的找到一个函数的局部极小值点,也就是minJ(θ0,θ1)。它的基本思想是:我们先随机一个初始的θ0θ1,通过不断的改变它们的值,使得J(θ)变小,最终找到J(θ)的最小值点。
为了更好的理解梯度下降法,我们同时设置的θ0θ1的值,再绘出J(θ0,θ1)的图形,因为有两个变量,因此J(θ0,θ1)的图形为一个曲面。如下所示,图形的最低点即为我们想要求得的minJ(θ0,θ1)。
3D的图形不方便研究Gradient descent
因此我们使用二维的等高线,同一等高线上的点对应的J(θ0,θ1)的值相同,如下图所示,越靠近二维等高线的中心,表示J(θ0,θ1)的值越小。
Have some function J(θ0,θ1)
want minθ0,θ1J(θ0,θ1)
Outline:
- Start with some θ0,θ1
- keep changing θ0,θ1 to reduce J(θ0,θ1) until we hopefully end up at minθ0,θ1J(θ0,θ1)
下面看看算法的具体过程,如下所示,其中α叫做学习率(learn rate)
用来控制梯度下降的幅度,∂∂θjJ(θ0,θ1)叫做梯度(代价函数对每个θ的偏导)。这里要注意的是每次必须同时的改变θ0和θ1的值。
Gradient descent algorithm
repeat until convergence {
θj:=θj−α∂∂θjJ(θ0,θ1)
(simultaneously update θj for j=0 and j=1)
}
当j=0时,
∂∂θ0J(θ0,θ1)=1m∑mi=1(hθ(x(i))−y(i))
θ0:=θ0−α1m∑mi=1(hθ(x(i))−y(i))
当j=1时,
∂∂θ1J(θ0,θ1)=1m∑mi=1(hθ(x(i))−y(i))x(i)
θ1:=θ1−α1m∑mi=1(hθ(x(i))−y(i))x(i)
|
|
学习率α会影响梯度下降的幅度,如果α太小,θ的每次变化幅度会很小,梯度下降的速度就会很慢,如果α过大,则θ每次的变化幅度就会很大,有可能使得J(θ)越过最低点,永远无法收敛到最小值。随着J(θ)越来越接近最低点,对应的梯度值∂∂θjJ(θ0,θ1)也会越来越小,每次下降的程度也会越来越慢,因此我们并不需要刻意的去减少α的值。
事实上,由于线性回归的代价函数总是一个凸函数(Convex Function)这样的函数没有局部最优解,只有一个全局最优解,因此我们在使用梯度下降的时候,总会找到一个全局的最优解。
Linear Regression with Mulitiple Variables
在实际问题中,输入的数据会有很多的特征值,而不仅仅只有一个。这里我们约定,用n来表示特征的数量,m表示训练样本的数量。x(i)表示第i个训练样本,x(i)j表示第i个训练样本的第j个特征值。
单元线性回归中的假设函数为
hθ(x)=θ0+θ1x
同理类比得,在多元线性回归中的假设函数为
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn
hθ(x)=θ0x0+θ1x1+θ2x2+⋯+θnxn=θTx
cost function
多元线性回归的代价函数跟一元线性回归的代价函数相同。只是x由Scale Value变为了Vector Value。
J(θ)=12mm∑i=0(hθ(x(i))−y(i))2
梯度下降(Gradient descent)
repeat until convergence {
θj:=θj−α∂∂θjJ(θ)
(simultaneously update θj for j=0,⋯,n )
}
∂∂θjJ(θ)=1mm∑i=1(hθ(x(i))−y(i))x(i)j
θ0:=θ0−α1mm∑i=1(hθ(x(i))−y(i))x(i)0
θ1:=θ1−α1mm∑i=1(hθ(x(i))−y(i))x(i)1
θ2:=θ2−α1mm∑i=1(hθ(x(i))−y(i))x(i)2
(x(i)0 =1)
特征放缩
对于多元线性回归,如果每个特征值的相差范围很大,梯度下降的速度会很慢,这时候就需要对特征值数据做缩放处理(Feature Scaling),从而将所有特征的数据数量级都放缩在一个很小的范围内,以加快梯度下降的速度。
常用的特征处理的方法就是均值归一化(Mean Normalization)
xi=xi−μimax−min
或者
xi=xi−μiσi
正规方程
当我们使用梯度下降法去求未知参数θ的最优值时,需要通过很多次的迭代才能得到全局最优解,有的时候梯度下降的速度会很慢。有没有其他更好的方法呢?假设代价函数J(θ)=aθ2+bθ+c,θ是一个实数,求θ的最优解,只需要令它的导数为零。
事实上的θ是一个n+1维向量,需要我们对每个θi求偏导,令偏导为零,就可以求出每个θi的值。
首先, 在数据集前加上一列x0, 值都为1;然后将所有的变量都放入矩阵X中(包括加上的x0);再将输出值放入向量y中,最后通过公式θ=(XTX)−1XTy, 就可以算出θ的值。这个公式就叫做正规方程,正规方程不需要进行特征放缩。
对于正规方程中XTX不可逆的情况,可能是我们使用了冗余的特征,特征的数量超过了样本的数量,我们可以通过删掉一些不必要的特征或者使用正则化来解决。
|
|
Gradient Descent VS Normal Equation
Gradient Descent | Normal Equation |
---|---|
Need to choose α. | No need to choose α. |
Need many iterations. | No need to iterate. |
Works well even when n is large. | need to compute (XTX)−1,slow if n is very large. |
参考文献
- 《机器学习》周志华老师著
- 《统计学习方法》李航老师著
- Couresera Machine Learning Andrew-Ng
- Machine-Learning-Andrew-Ng-My-Notes