吴恩达《机器学习》课程学习笔记(三)—— 多元线性回归与多项式回归

吴恩达《机器学习》课程学习笔记(三)—— 多元线性回归与多项式回归

一、多元线性回归(Multivariate Linear Regression)的数值计算法

1.多元假设方程( The multivariable form of the hypothesis function)

若我们的假设方程h有多个特征量,如:​\( x_1 \)​表示房屋的面积,​\( x_2 \)​表示房间数,

\( x_3 \)表示层数,​\( x_4 \)​表示房屋的年龄,那么新的假设方程为:

\[ h_\theta=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+\theta_4x_4 \]

也就是说,我们可以推广单变量假设得到多变量假设方程:

\[ h_\theta=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+…+\theta_nx_n \space\space\space\space\space\space(1.1)\]

将其改写为矩阵的形式:

\[ h_\theta(x)=\left[\begin{array}{1} \theta_0 & \theta_1 & \theta_2 & … & \theta_n\end{array}\right] \left[\begin{array}{2} x_0\\x_1\\…\\x_n\end{array}\right]=\theta^Tx \space\space\space\space\space\space(1.2)\]

若令​\( X=\left[\begin{array}{1}x_0^{(1)} & x_1^{(1)} & … & x_n^{(1)}\\x_0^{(2)} & x_1^{(2)}& … & x_n^{(2)}\\x_0^{(3)} & x_1^{(3)}& … & x_n^{(3)}\\&&…\\x_0^{(m)} & x_1^{(m)} & … & x_n^{(m)}\end{array}\right],\theta=\left[\begin{array}{2}\theta_0\\\theta_1\\\theta_2\\\theta_3\\…\\\theta_n\end{array}\right] \)

则可以进一步化简为:

\[ h_\theta(X)=X\theta \space\space\space\space\space\space(1.3)\]

并且引入几个参数:

\( x_j^{(i)}= \)​第i个训练样例中第j个特征量的值

\( x^{(i)}= \)第i个训练样例的所有输入特征量组成的列向量

\( m= \)​训练样例的数量

\( n=|x^{(i)}| \)特征量的数量

这里要注意的是,在上面构造的假设方程里,​\( x_0 \)​天然是1,不要漏掉了。

2.代价函数(Cost function)

我们已经知道,单变量线性回归的代价函数为:

\[ J(\theta_1,\theta_2)=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space(1.4) \]

同理,我们可以推广为:

\[ J(\theta)=\frac{1}{2m}(X\theta-Y)^T(X\theta-Y)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space(1.5) \]

其中Y是所有输出量y组成的向量。

3.多元梯度下降算法(Gradient descent for multiple variables)

我们也已经知道,梯度下降算法为:

\[ \theta_{j}:=\theta_{j}-\alpha\frac{\partial }{\partial \theta_{j}}J(\theta_{0},\theta_{1}) \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space(1.6) \]

在多变量线性回归的情况下,即表示为:

\[ \theta:=\theta-\alpha\bigtriangledown J(\theta)\space\space\space\space\space\space\space\space(1.7) \]

 

其中,​\( \bigtriangledown J(\theta)=\left[\begin{array}{1}{\frac{\partial J(\theta)}{\partial\theta_0}\\\frac{\partial J(\theta)}{\partial\theta_1}\\\space\space\space.\\\space\space\space.\\\space\space\space.\\\frac{\partial J(\theta)}{\partial\theta_n}}\end{array}\right]\space\space\space\space\space\space(1.8) \)

对于线性回归,其代价函数关于第j个参数​\( \theta_j \)​的偏导数计算结果如下:

\[ \frac{\partial J(\theta)}{\partial\theta_j}=\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})\cdot x_j^{(i)} \space\space\space\space\space\space(1.9) \]

我们总结一下,把上面(1.7式)的“代价函数梯度” 和 “关于第j个参数的偏导数”用矩阵的形式表达出来:

\[ \frac{\partial J(\theta)}{\partial\theta_j}=\frac{1}{m}\overrightarrow{x_j}^T(X\theta-Y) \space\space\space\space\space\space(1.10)\]

\[ \bigtriangledown J(\theta)=\frac{1}{m}X^T(X\theta-Y) \space\space\space\space\space\space(1.11)\]

那么,即可得到(1.7式)的矩阵表达:

\[ \theta:=\theta-\frac{\alpha}{m}X^T(X\theta-Y) \space\space\space\space\space\space(1.12)\]

4.特征量标准化(Feature normalization)

我们来考虑这么一个问题,我们的假设函数有四个特征量,其范围分布如下:

\[ 0\leqslant x_1\leqslant 3 \]

\[ -2\leqslant x_2\leqslant 0.2 \]

\[ 100000\leqslant x_3\leqslant 1000000000 \]

\[ 0.00001\leqslant x_4\leqslant 0.0001 \]

我们回顾一下机器学习参数的目标:通过数据集改善每个特征量x对应的权重参数θ,最终得到拟合度高的假设方程。而如果用上面的例子,我们要考虑下面两点:

  • 数值计算是通过计算来迭代逼近的,如果特征量数量级相差太大,则很容易在运算过程中丢失。
  • 直接把例子中的数据用在​\( h_\theta(x)=\theta_ix_i \)​上,那么整个方程的参数都是主要围绕\( x_3 \)这个特征量来学习的。换个角度来理解:如果我们把其中​\( x_3 \)​的单位由(单位量度)改为(100000个单位量度),那么的\( \theta_3x_3=10^5*\frac{x_3}{10^5}=\theta_{new} \space x_{new} \)即“天然地认为​\( x_new \)​的权重​\( \theta_{new} \)​很大”,这是不合理的。

出于这样的原因,我们需要通过预处理,让初始的特征量具有同等的地位,才能让机器学习算法更快地学习得到它们的权重θ,这个预处理的过程我们称之为数据标准化(Normalization)

如下图所示,直接使用数量级相差较大的特征量(图左)和标准化的特征量(图右)相比,前者的路径要长一些,也就是学习的速度要慢一些。

数据标准化的方法有很多,其中比较简单的特征缩放(feature scaling)方法如下:

\[ x_i:=\frac{x_i-\mu}{max-min}\space\space\space\space\space\space(1.13) \]

通过这个公式,我们可以将数据缩放为[-1,1]的范围。

举个例子,我们有一个数据集,​\( x_i \)​是房屋的面积,其取值范围是[100,2000],平均值是1000,那么\( x_{newi}:=\frac{x_i-1000}{1900}. \)

 

此外,我们还可以使用均值归一化(mean normalization),使得数据集的平均值为零:

\[ x_i:=\frac{x_i-\mu_i}{s_i}\space\space\space\space\space\space(1.14) \]

其中​\( \mu_i \)​是原特征量\( x_i \)平均值\( s_i \)标准差(standard deviation)。

(注意,更多关于特征缩放的问题,请参考维基百科:Normalization_(statistics),不同的取法对应了不同的标准化方法。)

对某种特征量进行标准化后,我们在使用假设函数h进行预测时,也要把输入的特征量标准化。

5.学习率α(Learning rate)

我们知道,梯度下降算法公式为

\[ \theta_{j}:=\theta_{j}-\alpha\frac{\partial }{\partial \theta_{j}}J(\theta_{0},\theta_{1}) \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space \]

我们也已经知道,梯度方向是逼近代价函数极小值的方向。那么,这里要讨论的是步长问题,即学习率的问题。

学习率较小的时候,学习的速度较慢,那么是不是越快越好呢?答案是否定的,这里给出了一个简单的例子:

可以看到,如果选取的学习率过大,那么有可能“矫枉过正”,偏离极值点更远,导致迭代发散或者震荡

因此,选取合适的学习率是很重要的,Andrew Ng给出的一个调参方法是画图,然后观察是否收敛。

在数值计算领域,有很多关于步长的讨论,若有兴趣,请参阅有关书籍的方程组求解模型。

————————下面是私货————————————

 

既然选取过大的步长会导致发散,那我是否可以根据这个特点设置一个“自适应”的学习率呢?

1.在路由拥塞控制的时候,有这么一个流程:

拥塞窗口的指数增长->

到达阈值后线性增长->

拥塞后窗口减半

2.而在数值计算领域,以前学过一个牛顿下山法(我Google不到相关的英文资料,可能英文不叫这个名字吧),它的自适应思想是:

记住第i-1轮迭代的结果;

尝试下一轮迭代;

将第i轮的结果与第i-1轮比较,如果发现迭代后结果变大了,那么将迭代回退到第i-1轮,并且将步长减半,再次尝试。

参考这个思想,我们似乎就能有一个“自适应”的学习率了。

二、多项式回归(Polynomial Regression)

1.多项式回归要注意的问题

上面学习了多元线性回归,接下来我们学习一元多项式回归。其中包含形如\( x^3、\sqrt x \)的指数形式。

这里只是简单地说一下,因为思想和上面一样,都是依靠

\[ \theta_{j}:=\theta_{j}-\alpha\frac{\partial }{\partial \theta_{j}}J(\theta) \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space(2.1) \]

来进行求解的。

一定要注意的是,多项式求解一定要处理好特征标准化,因为当\( x_1 \)

取值范围为[1,1000]时,​\( x_1^2 \)​为[1,1000000],​\( x_1^3 \)​为[1,1000000000]。

至于多元非线性回归,要在后面的课程讲。

2.数值计算法求回归参数θ与解方程组的关系

如果你学习过用数值计算求解方程组,会发现这和用数值计算求回归参数θ的思想是有相似的:

  • 两者都是通过迭代运算,最终收敛。
  • 若方程组有解,那么数值解的精度δ可以自定,比如设置两次迭代所得根的差值δ < 0.0001时停止迭代;对于回归问题,我们也可以同样的自定代价函数的差值(不过本章的编程作业中是通过人为设置迭代次数来控制精度的)。
  • 解方程组求的是满足\( y=f(x) \)的自变量x;而求θ是在求系数使得\( h(x)\rightarrow f(x) \)(这样说其实不严谨,因为在实际的回归模型中,我们要考虑的先是选取什么数学模型,然后才是求模型的系数)。

三、正规方程(Normal Equation)

1.正规方程

我们学习了数值解法,接下来学习解析解。这使得我们免于一步步的迭代。

Andrew Ng不加证明的给出了我们结论:

\[ \theta=(X^TX)^{-1}X^Ty \space\space\space\space\space\space(3.1) \]

由于是解析解,因此我们不必进行数据标准化。证明资料如下:

https://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)

http://eli.thegreenplace.net/2014/derivation-of-the-normal-equation-for-linear-regression

最后给出了梯度下降法和正规方程法的对比:

\[ \begin{array}{1} \hline 梯度下降算法&正规方程法\\ \hline 需要选择学习率&不需要选择学习率\\ \hline 需要迭代&不需要迭代\\ \hline O(kn^2)&O(n^3), 需要求X^TX的逆\\ \hline 当n很大时也表现良好&当n很大时运算速度慢\\ \hline \end{array} \]

可以看到数据集的大小也影响了我们的方法选取。那么我们怎么根据n多少来选择学习方法呢?没有定论,对于Andrew Ng来说,他选择的是当n>10000时使用梯度下降法。

2.当​\( X^TX \)​不可逆时怎么办

我们知道,正规方程需要求逆,那么我们对于那些奇异矩阵该怎么办?Andrew Ng不加证明的给出了方法:摩尔-彭若斯广义逆(wiki:  https://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_inverse)。

在Octave里面,有inv()函数和pinv()函数,分别求逆、广义逆。

虽然求广义逆的算法较慢,但稳妥起见,我们还是选择它。

 

四、第一次编程作业

第一次编程作业全都是套公式,代码传送门:

https://github.com/YongyiZhou/Andrew-Ng/tree/master/ex1

如果有疑问欢迎留言讨论。



Leave a Reply

Your email address will not be published.

*
*
*

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert