斯坦福机器学习课程 第二周

(1) 编程环境设置-Octave/MATLAB

(2) 多元线性回归分析

多特征量

用一个例子来说明,假如我有房屋面积、卧室数量、楼层数量以及房子的使用年龄作为预测房屋价格的特征量或者变量。

多特征量的表示

先简单介绍一下记法:

  • $n$ = 特征量的数目

在这个例子中有4个特征量,因此这里n=4

  • $x^{(i)}$ = 第$i$个训练样本的输入特征值

这个例子中$x^{(i)}$就表示第二个训练样本的特征向量:
$$
x^{(2)}=\left|
\begin{array}{c}
1416 \
3 \
2 \
40 \
\end{array} \right|
$$

  • $x_j^{(i)}$ = 第$i$个训练样本的第$j$个特征量

这个例子中,$x_3^{(2)}$代表着第2个训练样本的第3个特征量。这里值是2。

多特征量的假设函数

这是我们之前使用的假设形式
$$
h_\theta(x)=\theta_0+\theta_1*x
$$
其中$x$就是我们唯一的特征量,但现在我们有了多个特征量我们就不能再 使用这种简单的表示方式了。取而代之的,我们将把线性回归的假设改成这样:
$$
h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+…+\theta_nx_n
$$
接下来要简化这个等式的表示方式:

为了表示方便,将$x_0$的值设为1。所以现在的特征向量$x$是一个从0开始标记的$n+1$维的向量:
$$
x=\left[\begin{array}{c}
x_0 \
x_1 \
x_2 \
… \
x_n
\end{array}\right]
\in \mathbb{R}^{n+1}
$$
但我要从0开始标记,同时我也想把我的参数都看做一个向量,所以我们的参数就是:
$$
\theta=\left[\begin{array}{x}
\theta_0 \
\theta_1 \
\theta_2 \
… \
\theta_n
\end{array}\right]
\in \mathbb{R}^{n+1}
$$
所以假设等式可以写成:
$$
h_\theta(x)=\theta^Tx
$$

请注意,这里$x_0=1$

这样的表示方法让我们可以以这种紧凑的形式写出假设,这就是多特征量情况下的假设形式。起另一个名字:就是所谓的多元线性回归

多特征的梯度下降

假设函数(Hypothesis):
$$
h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+…+\theta_nx_n
$$
参数(Parameters)如下:
$$
\theta_0\theta_1\theta_2…\theta_n
$$
代价函数(Cost function)如下:
$$
J(\theta_0,\theta_1,…,\theta_n)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2
$$
梯度下降法(Gradient descent)

我们将会不停地用$\theta_j$减去$\alpha$倍的导数项来替代$\theta_j$。

梯度下降实用技巧1:特征缩放以及均值归一化

这两个方法都是为了保证特征的取值在合适的范围内的。

特征缩放(feature scaling)

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

举个例子来说明:
$$
x_1=size(0-2000feet^2) \
x_2=卧室的数量(1-5)
$$
假如你有一个具有两个特征的问题,其中$x_1$是房屋面积大小,它的取值在0到2000之间;$x_2$是卧室的数量,可能这个值的取值范围在1到5之间。在这个例子中$x_1$远大于$x_2$,这样的话梯度下降的过程可能会很缓慢,需要花更长的时间反复来回振荡,最终才找到一条正确通往全局最小值的路。

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

具体来说把特征$x$定义为:
$$
x_1=\frac{size(feet^2)}{2000} \
x_2=\frac{卧室的数量}{5}
$$
因此在这个例子中,通过特征缩放,我们最终得到的两个特征$x_1$和$x_2$都在0和1之间,这样你得到的梯度下降算法就会更快地收敛。

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

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

均值归一化(mean normalization)

除了在特征缩放中将特征除以最大值以外,有时候我们也会进行一个称为均值归一化(mean normalization)的工作。

具体做法就是:如果你有一个特征$x_i$你就用$x_i-\mu_i$来替换。这样做的目的是为了让你的特征值具有为0的平均值。具体做法是用:
$$
\frac{x_n-\mu_n}{S_n}
$$
来替换原来的特征$x_n$。其中定义$\mu_n$是在训练集中$x_n$的平均值。而$S_n$是该特征值的范围(最大值减去最小值)

最后直的一提的是:特征缩放其实并不需要太精确,其目的只是为了让梯度下降能够运行得更快一点,让梯度下降收敛所需的循环次数更少一些而已。

梯度下降使用技巧2:学习速率(Learning Rate)

这一节主要讨论两点:

  • 如何调试:也就是如何确定梯度下降是正常工作的。
  • 如何选择学习率$\alpha$:如何选择这个参数才能保证梯度下降正常工作。

收敛的判断

这条曲线显示的是梯度下降算法迭代过程中代价函数$J(\theta)$的值。如果梯度下降算法正常工作,那么每一步迭代之后$J(\theta)$都应该下降。

事实上,通常我们需要画出这类代价函数随迭代步数数增加的变化曲线,因为看这种曲线来试着判断梯度下降算法是否已经收敛。另外也可以进行一些自动的收敛测试

自动收敛测试一个非常典型的例子是:如果代价函数$J(\theta)$的下降小于一个很小的值$\varepsilon$那么就认为已经收敛。但通常要选择一个合适的阈值是相当困难的。

判断梯度下降算法是否正常工作

在线性回归上可以很容易从数学上证明:只要学习率足够小,那么每次迭代之后,代价函数$J(θ)$都会下降。因此如果代价函数没有下降,那可能意味着学习率过大,这时你就应该尝试一个较小的学习率。当然,你也不希望学习度太小,因为如果这样,那么梯度下降算法可能收敛得很慢,你需要迭代很多次才能到达最低点。因此如果学习率$\alpha$太小,梯度下降算法的收敛将会很缓慢。

总结:

  • 如果学习率$\alpha$太小,你会遇到收敛速度慢的问题。
  • 如果学习率$\alpha$太大,代价函数$J(θ)$可能不会在每次迭代都下降,甚至可能不收敛。

在某些情况下,如果学习率$\alpha$过大,也可能出现收敛缓慢的问题。

如何选择$\alpha$

在为梯度下降算法选择合适的学习速率时,会尝试一系列的$\alpha$值,然后绘制$J(\theta)$随迭代步数变化的曲线,然后选择一个下降最快的$\alpha$值。

特征的选择和多项式回归

(3) 参数的计算分析

正规方程(Normal Equation)

对于某些线性回归问题,用正规方程法求解参数$\theta$的最优质更好。梯度下降法通过多次迭代来计算梯度下降收敛到全局最小值。而正规方程法提供了一种可以直接一次性求解$\theta$的最优值的解法

正规方程法

在一般情况下,加入我们有$m$个训练样本:
$$
(x^{(1)},y^{(1)}),…,(x^{m},y^{m})
$$
$n$个特征变量:
$$
x^{(i)}=\left[
\begin{array}{c}
x_0^{(i)} \
x_1^{(i)} \
x_2^{(i)} \
… \
x_n^{(i)} \
\end{array}
\right]
\in \mathbb{R}^{n+1}
$$
每一个训练样本$x^{(i)}$看起来像一个$n+1$维的特征向量。

然后构建矩阵$X$,也被称为设计矩阵(design matrix)。如下所示:
$$
X=\left[
\begin{array}{c}
(x^{(1)})^T \
(x^{(2)})^T \
(x^{(3)})^T \
… \
(x^{(m)})^T \
\end{array}
\right]
=\left[
\begin{array}{c}
x_0^{(1)} & x_1^{(1)} & x_2^{(1)} & … & x_n^{(1)} \
x_0^{(2)} & x_1^{(2)} & x_2^{(2)} & … & x_n^{(2)} \
x_0^{(3)} & x_1^{(3)} & x_2^{(3)} & … & x_n^{(3)} \
… \
x_0^{(4)} & x_1^{(4)} & x_2^{(4)} & … & x_n^{(4)} \
\end{array}
\right]
$$
向量$y$为:
$$
y = \left[
\begin{array}{c}
y^1 \
y^2 \
… \
y^m
\end{array}
\right]
$$
最后,构建完$X$和$y$,我们就可以通过以下方程来得到$\theta$
$$
\theta=(X^TX)^{-1}X^Ty
$$

使用Octave来执行正规方程

$$
\theta=(X^TX)^{-1}X^Ty
$$

这个方程在Octave中的表达方式如下:

1
pinv(X`*X)*X`*y

(4) Octave/Matlab 使用说明

基本操作

移动数据

对数据进行运算

数据可视化

控制语句:for,while,if 符号的使用

使用函数求解代价函数值:

定义函数costFunctionJ.m,入参分别为Xy以及$\theta$:

1
2
3
4
5
6
7
function J = costFunctionJ(X, y, theta)
% X is the "design matrix" containing our training examples.
% y is the class labels
m = size(X,1); % number of training examples
predictions = X*theta; % predictions of hypothesis on all m examples
sqrErrors = (predictions-y).^2; % squaed errors
J = 1/(2*m) * sum(sqrErrors);

使用这个方法求解代价函数$J(\theta)$值:

1
2
3
4
5
6
7
8
9
10
11
12
13
>> X = [1 1; 1 2; 1 3]
X =
1 1
1 2
1 3
>> y = [1; 2; 3]
y =
1
2
3
>> theta = [0; 1];
>> j = costFunctionJ(X,y,theta)
j = 0

可以看到xy对应的值能够被所给的$\theta$值完全拟合,所以得到$J(\theta)=0$。

向量化