雅乐网

计算机技术、学习成长

数学 » 机器学习 » Andrew Ng机器学习课程笔记2——线性回归

Andrew Ng机器学习课程笔记2——线性回归

单变量线性回归

假设我们有下面的房子面积和房价的数据

面积 价格
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 )。

scrn20160330210913

先看一下数据集的图

scrn20160330211110

线性回归中,我们用一条直线来拟合数据。因此可以令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)也会不同。

scrn20160330211346

训练集中的点到直线的垂直距离也就是预测值和实际值的差,叫做建模误差(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

scrn20160326234356

当 \(\theta_1\)偏离1的时候,直线或绕原点旋转,无论顺时针还是逆时针,都会导致误差增大

scrn20160326234702

由于取平方,所以误差增大的情况应该是对称的。很容易画出\(J(\theta_1)\)的图形:

scrn20160326234846

多维的时候,图形也是类似的:(注意到J关于\(\theta\)是二次的 它总是有局部最优 = 全局最优)

scrn20160327182112

梯度下降算法(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)\) ,直到到达一个局部最优值。

scrn20160327182832

那么怎么改变参数呢?从算法名字就知道,是使用梯度来改变。根据微积分中梯度的知识,梯度的方向就是函数值增长最快的方向。我们每次朝着反方向走出一步,就可以期望逐渐走到局部最小值点。更新的公式如下:

$$\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$$

 

 

 

待续。。。

如果文章对你有帮助,欢迎点赞或打赏(金额不限)。你的打赏将全部用于支付网站服务器费用和提高网站文章质量,谢谢支持。

版权声明:

本文由 原创,商业转载请联系作者获得授权。
非商业转载请注明作者 雅乐网 ,并附带本文链接:
http://www.yalewoo.com/andrew_ng_machine_learning_notes_2_linear_regression.html

上一篇:

下一篇:

我要评论

验证码*: 8 + 2 =