单变量线性回归
假设我们有下面的房子面积和房价的数据
面积 | 价格 |
---|---|
2104 | 460 |
1416 | 232 |
1534 | 315 |
852 | 178 |
… | … |
这些已有的数据我们称之为训练集(Training Set)。我们通常使用字母m表示数据集中实例的个数。x表示输入变量(input variable),y表示输出变量(output/target variable)。
(x, y)表示数据集中的一组实例
\((x^{(i)}, y^{(i)})\) 表示数据集中的第i个实例。例如上表中,\((x^{(2)}, y^{(2)})\)就是第二个实例(1416, 232)
之后我们的算法建立模型,通过训练集的数据,来得到解决方案或者函数h(hypothesis )。
先看一下数据集的图
线性回归中,我们用一条直线来拟合数据。因此可以令h为
$$h_{\theta_0, \theta_1}(x) = \theta_0 + \theta_1 x$$
其中下标 \(\theta_0, \theta_1\) 是h函数的参数(parameters),而其自变量是x。在不引起歧义的情况下,下标参数可以省略而写成h(x)。我们的目的是选择合适的参数 ,使预测最准确。
代价函数(cost function)
显然h(x)是关于x的一次函数,它的图形是一条直线。参数不同时,h(x)也会不同。
训练集中的点到直线的垂直距离也就是预测值和实际值的差,叫做建模误差(modeling error)。
对第i个训练集实例来说,实际值是 \(y^{(i)}\),预测值是 \(h(x^{(i)})\) 。它们之间的差是
$$h(x^{(i)}) – y^{(i)}$$
要评估对数据的拟合程度,很自然的想法是把每个实例的误差加起来。为了避免正负抵消,采用平方。还记得吗?我们用m表示训练集中实例个数。
$$\sum_{i=1}^{m} (h(x^{(i)}) – y^{(i)})^2$$
再把它除以m(为了表示平均误差),乘以\(\frac{1}{2}\)(为了求导后消去)(其实这对于求最值没有影响)。我们得到了代价函数
$$J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^{m} (h(x^{(i)}) – y^{(i)})^2$$
这里的代价函数实际上叫做均方误差(Mean Squared Error, MSE),它可以反映假设h的准确度。
\( J(\theta_0, \theta_1) \) 越小,误差就越小。我们现在的任务就是选取\( \theta_0 和 \theta_1 \) ,来使\( J(\theta_0, \theta_1) \)最小。
代价函数的直观理解
先看一个简单情况:假设有m=3的训练集 (1,1), (2, 2), (3, 3) ,并且假设h(x)中的 \(\theta_0 = 0\)
这时我们假设
$$h_{\theta_1}(x) = \theta_1 x$$
代价函数
$$J(\theta_1) = \frac{1}{2*3} \sum_{i=1}^{3} (h_{\theta_1}(x^{(i)}) – y^{i})^2$$
当 \(\theta_1 = 1\) 时,误差是0
当 \(\theta_1\)偏离1的时候,直线或绕原点旋转,无论顺时针还是逆时针,都会导致误差增大
由于取平方,所以误差增大的情况应该是对称的。很容易画出\(J(\theta_1)\)的图形:
多维的时候,图形也是类似的:(注意到J关于\(\theta\)是二次的 它总是有局部最优 = 全局最优)
梯度下降算法(Gradient Descent)
梯度下降算法是通过不断迭代求最小值的方法,它不仅用于线性回归,还可以用于其他算法。
上面说到我们有了一个代价函数
$$J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=0}^{m} (h(x^{(i)}) – y^{(i)})^2$$
通过梯度下降算法求J最小值的步骤如下:
1. 初始化参数 \(\theta_0, \theta_1\)
2. 不断改变 \(\theta_0, \theta_1\) 来缩小 \(J(\theta_0, \theta_1)\) ,直到到达一个局部最优值。
那么怎么改变参数呢?从算法名字就知道,是使用梯度来改变。根据微积分中梯度的知识,梯度的方向就是函数值增长最快的方向。我们每次朝着反方向走出一步,就可以期望逐渐走到局部最小值点。更新的公式如下:
$$\theta_j := \theta_j – \alpha \frac{\partial }{\partial \theta_j} J(\theta_0, \theta_1) (for j=0 and 1)$$
注意梯度下降算法中,每更新一次的时候,各个参数要同时更新。例如本例有2个参数\(\theta_0, \theta_1\) ,实际代码为
repeat until convergence {
$$\theta_0 := \theta_0 – \alpha \frac{\partial }{\partial \theta_0} J(\theta_0, \theta_1)$$
$$\theta_1 := \theta_1 -\alpha \frac{\partial }{\partial \theta_1} J(\theta_0, \theta_1)$$
}
注意花括号内的2条语句要同步改变,如果先改变了\(\theta_0\) ,会导致\(\theta_1\)更新时使用了新的\(\theta_0\),这样就不是梯度下降算法了。
应当这样实现
repeat until convergence {
$$tmp0 := \theta_0 -\alpha \frac{\partial }{\partial \theta_0} J(\theta_0, \theta_1)$$
$$tmp1 := \theta_1 -\alpha \frac{\partial }{\partial \theta_1} J(\theta_0, \theta_1)$$
$$\theta_0 := tmp0$$
$$\theta_1 :=tmp1$$
}
此处关键是要求 \(\frac{\partial }{\partial \theta_j} J(\theta_0, \theta_1)\)
$$J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=0}^{m} (h(x^{(i)}) – y^{(i)})^2$$
因此
$$\frac{\partial }{\partial \theta_j} J(\theta_0, \theta_1)$$
$$ = \frac{\partial }{\partial \theta_j} \frac{1}{2m} \sum_{i=0}^{m} (h(x^{(i)}) – y^{(i)})^2$$
$$ = 2 \cdot \frac{1}{2m} \sum_{i=0}^{m} \left( (h(x^{(i)}) – y^{(i)}) \cdot \frac{\partial }{\partial \theta_j} (h(x^{(i)}) – y^{(i)}) \right)$$
h是下面的样子
$$h(x) = \theta_0 + \theta_1 x$$
可以求出后面的偏导数
$$\frac{\partial }{\partial \theta_0} (h(x^{(i)}) – y^{(i)}) = 1$$
$$\frac{\partial }{\partial \theta_1} (h(x^{(i)}) – y^{(i)}) = x$$
最终结果:
$$\frac{\partial }{\partial \theta_0} J(\theta_0, \theta_1) = \frac{1}{m} \sum_{i=0}^{m} \left( (h(x^{(i)}) – y^{(i)}) \right) $$
$$\frac{\partial }{\partial \theta_0} J(\theta_0, \theta_1) = \frac{1}{m} \sum_{i=0}^{m} \left( (h(x^{(i)}) – y^{(i)}) \cdot x\right)$$
最终每次迭代时更新的公式:
$$\theta_0 := \theta_0 -\alpha \frac{1}{m} \sum_{i=0}^{m} \left( (h(x^{(i)}) – y^{(i)}) \right) $$
$$\theta_1 := \theta_1 -\alpha \frac{1}{m} \sum_{i=0}^{m} \left( (h(x^{(i)}) – y^{(i)}) \cdot x\right)$$
多变量线性回归
单变量模型中房价由面积决定。实际上,房价不仅仅由面积决定,还有其他的因素。考虑的因素多余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_j^{(i)}\) 表示第i个实例中第j个特征。例如 \(x_4^{(3)}\) 表示第3个实例第4个特征,也就是年限30 。
多变量模型下假设h如下:
$$h_{(\theta_0, \theta_1, …, \theta_n)} = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + … + \theta_n x_n$$
上式中只有\(\theta_0\)没有乘x,为了让公式统一,我们假设\(x_0 = 1\) ,这样就有
$$h_{(\theta_0, \theta_1, …, \theta_n)} = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + … + \theta_n x_n$$
$$h(x) = \sum_{i = 0}^{n} \left( \theta_i x_i \right)$$
若使用向量表示
$$\theta = \begin{pmatrix} \theta_0 \\ \theta_1 \\ … \\ \theta_n \end{pmatrix} , x = \begin{pmatrix} x_0 \\ x_1 \\ … \\ x_n \end{pmatrix}$$
则有
$$h(x) = \theta^{T} x$$
多变量模型下代价函数
$$J(\theta_0, \theta_1, …, \theta_n) = \frac{1}{2m} \sum_{i=0}^{m} (h(x^{(i)}) – y^{(i)})^2$$
梯度下降更新规则(j分别从0到n为一次迭代):
$$\theta_j := \theta_j – \alpha \frac{\partial }{\partial \theta_j} J(\theta_0, \theta_1, …, \theta_n) $$
和单变量推导类似,很容易得到最终结果
$$\theta_j := \theta_j -\alpha \frac{1}{m} \sum_{i=0}^{m} \left( (h(x^{(i)}) – y^{(i)}) \cdot x_j\right)$$
特征缩放(Feature Scaling)
特征缩放是为了收敛地更快。多特征的时候,如果特征之间的范围不一致,比如x1的范围是0-1,x2的范围却是0-99999 。这样会导致收敛很慢。通过特征缩放让不同特征尺度大致相同
$$x_n = \frac{x_n – \mu_n}{s_n}$$
\(\mu\)是所有样本的平均值,\(s_n\)是所有样本的范围差,就是样本中最大的数值减去样本中的最小值。
使用特征缩放后,对新输入的数据要做相同的处理,才能保证预测结果正确。
学习率(Learning Rate)
更新的公式中的\(\alpha \)叫做学习率。它关系到每次更新的步长,如果步长太小,则收敛过程很慢;若步长太大,可能跳过最优点。
多项式回归(POLYNOMIAL REGRESSION)
如果用线性不能很好地拟合数据,可以考虑多项式。例如
$$h(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2^2 + \theta_3 x^3$$
有个技巧是令
$$x_2 = x_2^2$$
$$x_3 = x_3^3$$
这样便转化为线性回归的问题。
正规方程法(NORMAL EQUATION)
该方法不需要和梯度下降算法一样迭代,而是通过数学方法直接求出令J最小的参数值。
令
$$\frac{\partial }{\partial \theta_j} J(\theta_j) = 0$$
可以解出
$$\theta = (x^Tx)^{-1} x^T y$$
待续。。。