Machine Learning-线性回归(Linear Regression)

点击量:1261

引言
最近在学习Machine Learning,为什么要学呢?一来呢是觉得AI是未来的一大发展趋势几乎是板上钉钉的事了,他的应用范围实在是太过广泛,不仅仅是在被媒体宣传的火热的AlphaGo,自动驾驶,高级机器人等,还有很多很多你看不到的领域正在逐步应用人工智能技术,比如广告系统,推荐系统,金融领域的量化交易,大数据分析等等。而ml恰恰是AI里面一个非常重要的部分。其次是因为对这门学科分支很感兴趣,想知道这背后到底有什么奥秘,机器究竟是如何学习的?它到底能智能到何种水平?
其实在13年的时候看过Andrew Ng在standford上的一门公开课CS229 Machine Learning,一开始看还可以,可是到后面黑板上书写的各种数学公式推导很模糊,感觉很吃力,而且没什么人监督,学着学着就荒废了。今年卷土重来,查了查入门资料,有人推荐Coursera上的Andrew Ng的课程,一开始我以为这门课就是我以前在网易公开课上看的那门课程,觉得体验不怎么好。但后面真正看了之后才发现两门课很不一样,Coursera的课堂互动模式实在太赞了,秒杀各种公开课视频。不仅PPT上的公式写的很清楚,而且还有随堂检测,每周还有课程作业,每一份作业都有deadline,仿佛置身真实的课堂一般。完成作业之后还会有很强的成就感,简直让人学的停不下来!唯一只得说道的就是课程有点简单了,两周的内容不及周志华那本西瓜书的一张纸,哈哈。估计是为了照顾很多真的是没有基础的人吧。但是我想这也不是什么坏事,毕竟它的定位是一个入门课程,学完之后知道几种常见的ML算法,能够会一些简单应用,并且对整个学科有一定的认识就行了。相比而言,国内大牛周志华教授写的那本很出名的西瓜书《机器学习》就真的不适合入门了,全书基本就是数学公式,复习了高数和线代之后的我还是艰难地啃了几章,看的时候觉得懂了,但是书一合起来就感觉什么也没学到,过一段时间就忘了,为什么呢?因为没有实践,没有作业,学习的东西太过理论。好了下面言归正传,总结下线性回归。
本文覆盖Coursera Machine LearningWeek1&Week2的内容,只记录我觉得值得记录的内容。

Introduction
机器学习的严格定义:A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E. (Tom Mitchell 1998年提出)
机器学习的分类有很多种,常见的有监督学习,无监督学习,强化学习等
监督学习(Supervised learning):简单来说就是有一堆样本数据供你分析,每一份数据都会有一个标签,所谓标签就是每条数据都会有一个结果/判断/“正确解”,比如是不是垃圾邮件,房价是多少等,然后算法对下一个输入进行预测。
无监督学习(Unsupervised learning):数据集不会打标签,事先也不知道结果会是什么样的,而是根据样本集的某些特征自动进行聚合(cluster)得到结果

单变量线性回归(Linear regression with onevariable)
单变量线性回归是监督学习里最简单的一个模型,我们先引入一个常见的模型:房价预测。
housing_price_prediction
这个东西其实在高中就学过了,给你几个数据,然后让你算出他的模拟函数,最后再预测下房价,很简单。也许你会问,这也叫机器学习?别急,这只是最简单的模型,随着变量的增多,数据集的累积,以及线性模型的种种变体,使得它在多个领域都有很好的应用效果。
Hypothesis Function(假设函数)
$$h_{\theta}(x) = \theta_{0}+\theta_{1}x_{1}$$
所谓的假设函数,就是基于样本数据得到的一个能预测新样本的线性函数。
线性回归的目的是通过对样本数据集的分析,能够得到一个最能预测当前样本数据的假设函数,即确定两个参数\(\theta_{0}\)和\(\theta_{1}\),使得样本数据和假设函数之间的拟合度最高,从而达到能更准确地预测新数据的目的。那么如何才能使得他们之间的拟合度最高呢?对于线性回归算法而言,我们可以采用最小二乘法来获得最佳拟合效果,即预测值和真实值之间差的平方和(square error)最小。
Cost Function(暂且称为代价函数)
上面提到的最小二乘法就是线性回归的Cost Function,这个名字起得很好,代价函数,代价越高表示这个假设函数的拟合度越低。所以很多的工作都在追求最小的Cost Function。下面我们来看下线性回归的Cost Function的具体表达式:
$$J(\theta_{0},\theta_{1})=\frac{1}{2m}\sum_{i=1}^{m}\left ( \hat{y_{i}}-y_{i} \right )^2=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x_{i})-y_{i})^2$$
上面我们说的是差的平方和最小,那这里为什么要除以2m呢?因为我们算的的这个函数的最小值,所以在这个基础上再做加减乘除对最终结果是没有影响的,除以2是为了后面的求导可以约掉,除以m是为了保证在样本量很大的时候这个值能变得小一点的,即平方和的平均数。其次,看到这个函数要转换下思维,这里的x和y都是已知的样本数据值,而不是变量。现在的函数的变量变成了\(\theta_{0}\)和\(\theta_{1}\),也就是说Cost Function \(J(\theta_{0},\theta_{1})\)是关于\(\theta_{0}\)和\(\theta_{1}\)的二元二次函数,简化点就是类似于\(z=x^{2}+y^{2}\)这样的函数。这个函数的图像是一个三维的碗型(bowl shape)函数图:
cost_function_graph

总结一下:线性回归的流程是:先给出一个线性假设函数,然后得到他的cost function,最后通过某种算法求得这个cost function的最小值。下面就介绍如何计算cost function的最小值。

梯度下降(Gradient Descent)
梯度下降法是一个最优化算法,通常也称为最速下降法。简单点说就是沿着梯度向下的方向不断对变量进行迭代减少,不断收敛,以达到局部最小值的目的。所谓梯度方向指的是沿着该变量的切线向上的变化方向,所以梯度下降指的是切线向下的方向。对一个一元函数来说,他的梯度下降过程如下图所示:
one_variable_gd
相应的一个二元函数的梯度下降过程就是这样的:
two_variables_gd
具体地,梯度下降的算法如下:

按照以下公式不断计算 \(\theta\):
$$\theta_{j}:=\theta_{j} – \alpha\frac{\partial }{\partial \theta_{j}}J(\theta_{0},\theta_{1})$$
直到收敛
其中,\(j=0,1\) 表示的是特征的索引值。

其中,\(\frac{\partial }{\partial \theta_{j}}J(\theta_{0},\theta_{1})\)表示的是对\(\theta_{j}\)的偏导数,\(\alpha\)表示的是下降的步长,也称为learning rate。这里的\(\alpha\)值要控制好,如果太大则不会收敛;如果太小则收敛太慢。

如何正确地迭代?
正确的方式:
correct
而不是:
incorrect
也就是说要把所有的\(\theta\)都算出来之后再进行下一轮迭代,而不是边迭代边使用新的\(\theta\)值。

对于线性回归而言,我们只需要带入公式,对cost function的两个变量\(\theta_{0}\)和\(\theta_{1}\)分别求导数,皆可以得到梯度下降公式:
gd_linear_regression
咋一看\(\theta_{0}\)和\(\theta_{1}\)求导出来的函数还有点差异,但你稍微思考一下就会发现两者其实是一模一样的,因为可以在\(\theta_{0}\)公式的后面默认乘以一个\(x_{0}\),而\(x_{0}=1\)。求导过程就省略不说了。这里我们可以发现以上每一步迭代都用上了所有的样本数据(对导数求和),所以这种梯度下降也被称为“批量梯度下降”(batch gradient descent)。

多变量线性回归(Multivariate Linear Regression)
多变量线性回归和单变量线性回归本质上是一样的,只不过特征(feature)的数量变多了,唯一值得说道的是在多变量线性回归中引入了矩阵来方便计算。如果你学过线性代数,了解矩阵的基本运算,那就很简单了。引入矩阵之后,假设函数\(H(x)\):
$$h_{\theta}(x)=\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\theta_{3}x_{3}+…+\theta_{n}x_{n}$$
可以用矩阵表示成:
$$h_{\theta}(x)=\left [ \theta_{0} \ \theta_{1} \ … \ \theta_{n} \right ]\begin{bmatrix}
x_{0}\\ x_{1}\\ .\\ .\\ .\\ x_{n}\\\end{bmatrix}= \theta^{T}x
$$
简化后得到:
$$h_{\theta}(X) = \theta^{T}X$$
Feature Scaling(特征缩放)和Mean Normalization(均值归一化)
为了提高梯度下降的速度,我们可以使得所有的样本输入值都大致在同一个较小的范围内。那为什么样本值不在同一个范围内会影响收敛的速度呢?我们知道梯度下降有一个学习曲率(learning rate),对于所有的输入样本数据都用同一个\(\alpha\)值,如果样本数据之间变化范围太大,则会导致同一个\(\alpha\)值对差异太大的数据收敛效果不同,从而影响整体的收敛效果。理想的情况,我们希望特征值的范围是\([-1,1]\)或者\([-0.5,0.5]\),但是这不是必须的。我们可以使用如下的公式来达到这样的效果:
$$x_{i}:=\frac{x_{i}-\mu _{i}}{s_{i}}$$
其中\(\mu_{i}\)是特征\(i\)的均值,而\(s_{i}\)是样本的标准差,也就是\(\max-\min\)。结合以上公式粗略地解释下,特征缩放指的是除以某个值,而均值归一化指的是减去均值。
Polynomial Regression(多项式回归)
有时候为了达到更好的拟合效果,我们可以通过对已有的特征进行组合,从而得到新的特征,使得线性回归变成多项式回归。
Normal Equation
当你在使用梯度下降算法求cost function最小值的时候是否想过一个问题:我们好像是可以通过数学方法精确计算出cost function的最小值的。没错,因为说到底就是矩阵运算嘛。对于线性方程:\(h_{\theta}(X) = \theta^{T}X\)而言,它的\(\theta\)值可以通过下面的公式计算得出:\(\theta=(X^{T}X)^{-1}X^{T}y\)
其中,\(X^{T}\)表示转置矩阵,而\(X^{-1}\)表示逆矩阵。

Gradient Descent和Normal Equation的对比如下:

[table caption=””]
Gradient Descent,Normal Equation,
需要选择\(\alpha\)值,不需要\(\alpha\)值,
需要多次迭代计算,无需迭代计算,
复杂度是\(O(k*n^{2})\),复杂度是\(O(n^{3})\),需要计算\(X^{T}X\)的逆矩阵,
[/table]
那你肯定会问,既然\(\theta\)值可以直接算出来为什么还要使用梯度下降算法一步一步去寻找最小值呢?那是因为计算逆矩阵的算法复杂度是\(O(n^{3})\),当特征数量很大的时候,Normal Equation算法就会变得非常地慢。

值得注意的是,并不是所有的矩阵都是可逆的。如果\(X^{T}X\)是不可逆的,那么最可能是以下两种情况:

  1. 冗余的特征,比如两个特征非常接近,更直接的比如他们是线性相关的
  2. 特征数量太多



课后编程作业已经上传至本人GitHub,如有需要可以参考,但请遵守课堂准则,不要抄袭。

     

原创不易,如果您觉得本文对您有帮助,可以打赏博主一杯咖啡,鼓励博主持续创作!


  • Ethereum/Polygon/Bsc/Arbitrum: 0xa8c00949fd7dD23b5Ec36A9181966c8C8436A015
  • Bitcoin: bc1qdvf0j0rntarvdal62n35etwmjzwk307w4jtyjz
  •    
  • 支付宝:

  • 发表评论

    邮箱地址不会被公开。 必填项已用*标注