单变量线性回归
假设我们有下面的房子面积和房价的数据
面积 | 价格 |
---|---|
2104 | 460 |
1416 | 232 |
1534 | 315 |
852 | 178 |
… | … |
这些已有的数据我们称之为训练集(Training Set)。我们通常使用字母m表示数据集中实例的个数。x表示输入变量(input variable),y表示输出变量(output/target variable)。
(x, y)表示数据集中的一组实例
(x (i) ,y (i) ) (x(i),y(i)) 表示数据集中的第i个实例。例如上表中,(x (2) ,y (2) ) (x(2),y(2))就是第二个实例(1416, 232)
之后我们的算法建立模型,通过训练集的数据,来得到解决方案或者函数h(hypothesis )。
<img class="alignnone size-full wp-image-2468" src="http://7d9rd6.com1.z0.glb.clouddn.com/wp-content/uploads/2016/03/scrn20160330210913.png" alt="scrn20160330210913" width="414" height="344" /></a></p>先看一下数据集的图
<img class="alignnone size-full wp-image-2469" src="http://7d9rd6.com1.z0.glb.clouddn.com/wp-content/uploads/2016/03/scrn20160330211110.png" alt="scrn20160330211110" width="587" height="269" /></a></p>线性回归中,我们用一条直线来拟合数据。因此可以令h为
其中下标 θ 0 ,θ 1 θ0,θ1 是h函数的参数(parameters),而其自变量是x。在不引起歧义的情况下,下标参数可以省略而写成h(x)。我们的目的是选择合适的参数 ,使预测最准确。
代价函数(cost function)
显然h(x)是关于x的一次函数,它的图形是一条直线。参数不同时,h(x)也会不同。
<img class="alignnone size-full wp-image-2470" src="http://7d9rd6.com1.z0.glb.clouddn.com/wp-content/uploads/2016/03/scrn20160330211346.png" alt="scrn20160330211346" width="795" height="347" /></a></p>训练集中的点到直线的垂直距离也就是预测值和实际值的差,叫做建模误差(modeling error)。
对第i个训练集实例来说,实际值是 y (i) y(i),预测值是 h(x (i) ) h(x(i)) 。它们之间的差是
要评估对数据的拟合程度,很自然的想法是把每个实例的误差加起来。为了避免正负抵消,采用平方。还记得吗?我们用m表示训练集中实例个数。
再把它除以m(为了表示平均误差),乘以12 12(为了求导后消去)(其实这对于求最值没有影响)。我们得到了代价函数
这里的代价函数实际上叫做均方误差(Mean Squared Error, MSE),它可以反映假设h的准确度。
J(θ 0 ,θ 1 ) J(θ0,θ1) 越小,误差就越小。我们现在的任务就是选取θ 0 和θ 1 θ0和θ1 ,来使J(θ 0 ,θ 1 ) J(θ0,θ1)最小。
代价函数的直观理解
先看一个简单情况:假设有m=3的训练集 (1,1), (2, 2), (3, 3) ,并且假设h(x)中的 θ 0 =0 θ0=0
这时我们假设
代价函数
当 θ 1 =1 θ1=1 时,误差是0
<img class="alignnone size-full wp-image-2361" src="http://7d9rd6.com1.z0.glb.clouddn.com/wp-content/uploads/2016/03/scrn20160326234356.png" alt="scrn20160326234356" width="912" height="501" /></a></p>当 θ 1 θ1偏离1的时候,直线或绕原点旋转,无论顺时针还是逆时针,都会导致误差增大
由于取平方,所以误差增大的情况应该是对称的。很容易画出J(θ 1 ) J(θ1)的图形:
<img class="alignnone size-full wp-image-2363" src="http://7d9rd6.com1.z0.glb.clouddn.com/wp-content/uploads/2016/03/scrn20160326234846.png" alt="scrn20160326234846" width="881" height="500" /></a></p>多维的时候,图形也是类似的:(注意到J关于θ θ是二次的 它总是有局部最优 = 全局最优)
<img class="alignnone size-full wp-image-2365" src="http://7d9rd6.com1.z0.glb.clouddn.com/wp-content/uploads/2016/03/scrn20160327182112.png" alt="scrn20160327182112" width="739" height="425" /></a></p>梯度下降算法(Gradient Descent)
梯度下降算法是通过不断迭代求最小值的方法,它不仅用于线性回归,还可以用于其他算法。
上面说到我们有了一个代价函数
通过梯度下降算法求J最小值的步骤如下:
1. 初始化参数 θ 0 ,θ 1 θ0,θ1
2. 不断改变 θ 0 ,θ 1 θ0,θ1 来缩小 J(θ 0 ,θ 1 ) J(θ0,θ1) ,直到到达一个局部最优值。
<img class="alignnone size-full wp-image-2367" src="http://7d9rd6.com1.z0.glb.clouddn.com/wp-content/uploads/2016/03/scrn20160327182832.png" alt="scrn20160327182832" width="751" height="379" /></a></p>那么怎么改变参数呢?从算法名字就知道,是使用梯度来改变。根据微积分中梯度的知识,梯度的方向就是函数值增长最快的方向。我们每次朝着反方向走出一步,就可以期望逐渐走到局部最小值点。更新的公式如下:
注意梯度下降算法中,每更新一次的时候,各个参数要同时更新。例如本例有2个参数θ 0 ,θ 1 θ0,θ1 ,实际代码为
repeat until convergence {
}
注意花括号内的2条语句要同步改变,如果先改变了θ 0 θ0 ,会导致θ 1 θ1更新时使用了新的θ 0 θ0,这样就不是梯度下降算法了。
应当这样实现
repeat until convergence {
}
此处关键是要求 ∂∂θ j J(θ 0 ,θ 1 ) ∂∂θjJ(θ0,θ1)
因此
h是下面的样子
可以求出后面的偏导数
最终结果:
最终每次迭代时更新的公式:
多变量线性回归
单变量模型中房价由面积决定。实际上,房价不仅仅由面积决定,还有其他的因素。考虑的因素多余1个时,就要用到多变量模型。
假设我们有如下数据:
面积 | 卧室数目 | 卫生间数目 | 年限 | 价格 |
---|---|---|---|---|
2104 | 5 | 1 | 45 | 460 |
1416 | 3 | 2 | 40 | 232 |
1534 | 3 | 2 | 30 | 315 |
852 | 2 | 1 | 36 | 178 |
… | … | … | … | … |
我们通常用字母n表示变量(特征)个数。本例中n= 4 。
使用x的下标表示第几个特征
x (i) j xj(i) 表示第i个实例中第j个特征。例如 x (3) 4 x4(3) 表示第3个实例第4个特征,也就是年限30 。
多变量模型下假设h如下:
上式中只有θ 0 θ0没有乘x,为了让公式统一,我们假设x 0 =1 x0=1 ,这样就有
若使用向量表示
则有
多变量模型下代价函数
梯度下降更新规则(j分别从0到n为一次迭代):
和单变量推导类似,很容易得到最终结果
特征缩放(Feature Scaling)
特征缩放是为了收敛地更快。多特征的时候,如果特征之间的范围不一致,比如x1的范围是0-1,x2的范围却是0-99999 。这样会导致收敛很慢。通过特征缩放让不同特征尺度大致相同
μ μ是所有样本的平均值,s n sn是所有样本的范围差,就是样本中最大的数值减去样本中的最小值。
使用特征缩放后,对新输入的数据要做相同的处理,才能保证预测结果正确。
学习率(Learning Rate)
更新的公式中的α α叫做学习率。它关系到每次更新的步长,如果步长太小,则收敛过程很慢;若步长太大,可能跳过最优点。
多项式回归(POLYNOMIAL REGRESSION)
如果用线性不能很好地拟合数据,可以考虑多项式。例如
有个技巧是令
这样便转化为线性回归的问题。
正规方程法(NORMAL EQUATION)
该方法不需要和梯度下降算法一样迭代,而是通过数学方法直接求出令J最小的参数值。
令
可以解出
待续。。。