第一周笔记:线性回归

第一周笔记:线性回归

我们知道,在做数学题的时候,解未知数的方法,是给定自变量和函数,通过函数处理自变量,以获得解。而机器学习就相当于,给定自变量和函数的解,求函数。

类似于:这样:function(x)=y

机器学习就是样本中有大量的x(特征量)和y(目标变量)然后求这个function。

求函数的方法,基于理论上来说,大部分函数都能找到一个近似的泰勒展开式。而机器学习,就是用数据去拟合这个所谓的“近似的泰勒展开式”。

大致可以把机器学习分为Supervised learning(监督学习)和Unsupervised learning(非监督学习)两类。两者区别在于训练样本。

简单理解的话:

监督学习就是你做卷子,做完以后给你正确答案你可以对答案,从而得出获得正确答案的方法。

非监督学习就是只给你一堆题,你做的题多了,自然也能判断出获得正确答案的规律。

监督学习多用于回归分析(求解是连续值,比如某一区间)和分类问题(求解是离散值,比如对错)。非监督学习初步多用于聚类算法(群分析)


线性回归:

假设h(x)=y,有大量样本,求h(x)是什么。

那么可以假设h(x)=\theta_{0} *x^0 +\theta _{1}*x^1+\theta _{2}*x^2+...+\theta _{n}*x^n+...因为x^0==1所以\theta_{0} *x^0可以简化为\theta_{0}

为了方便,这里先记只有\theta_{0} \theta_{1} 的情况,原公式就简化为了:h(x)=\theta_{0} +\theta_{1} *x

假设实际结果为y,y=f(x)

那么,h(x)在什么情况下最接近f(x)呢?

h(x)-f(x)最接近0的情况下啦。

那大量样本(m组样本)呢?

我们给h(x)-f(x)做一个平方,保证它为正,为正了以后,就是求最小了对吧。方便很多:(h(x)-f(x))^2

然后把这些样本相加:\sum_{i}^{m}{} (h(x_{i} )-f(x_{i} ))^2这个相加后的值最小的时候,就是我们的假定函数h(x)最接近实际函数f(x)的时候。

由于方程中没有f(x),而f(x)=y,所以方程可以写为:\sum_{i}^{m}{} (h(x_{i} )-y_{i} )^2


假设我们有m个样本,那么我们的目标就是:计算这些样本下,找到至少一个\theta_{0} \theta_{1} 的值,使得在这个值下,样本所有结果得到的偏差最小。现在我们有两个方程:

\sum_{i}^{m}{} (h(x_{i} )-y_{i} )^2
h(x)=\theta_{0} +\theta_{1} *x

我们的目标就是,找到至少一个\theta_{0} \theta_{1} 的值,使得\sum_{i}^{m}{} (h(x_{i} )-y_{i} )^2最小,这个值下得到的函数h(x)=\theta_{0} +\theta_{1} *x就是最接近真实函数的假定函数。

实际操作很简单……

h(x)=\theta_{0} +\theta_{1} *x,所以min(\theta_{0} ,\theta_{1} )=\sum_{i}^{m}{} (h(x_{i} )-y_{i} )^2=\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )^2

假设这个min(\theta_{0} ,\theta_{1} )的平方差函数为J_{\theta} (\theta_{0} ,\theta_{1} )那么,J_{\theta} (\theta_{0} ,\theta_{1} )=1/2m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )^2

那么当这个函数J_{\theta} (\theta_{0} ,\theta_{1} )最小的时候,就是我们得到\theta_{0} ,\theta_{1} 的时候。

具体做法叫做“梯度下降”

对方程J_{\theta}=1/2m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )^2\theta_{j}进行求导,得到:

\frac{d}{d\theta_{j} } J_{\theta} =\frac{d}{d\theta_{j} } 1/2m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )^2

\theta_{j}=\theta_{0}的时候,\frac{d}{d\theta_{0} } J_{\theta} =1/m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )

\theta_{j}=\theta_{1}的时候,\frac{d}{d\theta_{1} } J_{\theta} =1/m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )*x_{i}

(注意,求导的意思是,得到一个微小变量,所以上面的\frac{d}{d\theta_{0} } J_{\theta} \frac{d}{d\theta_{1} } J_{\theta} 可以看作分别是对于\theta_{0}\theta_{1}的变化的一个变化量(方向)的预测。你也可以写为、\theta_{0}、\theta_{1},看个人习惯。)

那么,因为我们的目标是要得\theta_{0}\theta_{1}的值,这个值使得J_{\theta} (\theta_{0} ,\theta_{1} )最小。那么我们就可以随便选个起始点J_{\theta} (\theta_{0} ,\theta_{1} ),假设选取的点是J_{\theta} (0,0),你可以选J_{\theta} (3,7)J_{\theta} (6,9),无所谓。反正最终会使得\theta_{0}\theta_{1}不断改变的……

具体做法是,分别对于\theta_{0}\theta_{1}\pm \lambda ,使得J_{\theta} (\theta_{0}\pm \lambda ,\theta_{1} \pm \lambda )<J_{\theta} (\theta_{0} ,\theta_{1} )不断重复,直到再也找不到一个\lambda (或者找到的\lambda 太小可以忽略不计)使得J_{\theta} (\theta_{0}\pm \lambda ,\theta_{1} \pm \lambda )<J_{\theta} (\theta_{0} ,\theta_{1} ),那么此时的\theta_{0}\theta_{1}的值就是我们想要的。使得J_{\theta} (\theta_{0} ,\theta_{1} )最小的值。这时候得到的h(x)=\theta_{0} +\theta_{1} *x,就是我们想要的最接近目标函数的假定函数。


具体做法如下:

分别对于\theta_{0}\theta_{1},求出其\frac{d}{d\theta_{0} } J_{\theta} \frac{d}{d\theta_{1} } J_{\theta} 的值,分别乘以一个参数\alpha 控制下降速度。让计算机重复如下运算:

\theta_{0}=\theta_{0}-\alpha *\frac{d}{d\theta_{0} } J_{\theta}

~→

\theta_{0}=\theta_{0}-\alpha /m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )

\theta_{1}=\theta_{1}-\alpha *\frac{d}{d\theta_{1} } J_{\theta} ~→\theta_{1}=\theta_{1}-\alpha/ m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i} )*x_{i}

控制重复的方法很多。比如可以每次计算J_{\theta} (\theta_{0} ,\theta_{1} )和上一次的J_{\theta} (\theta_{0} ,\theta_{1} )的差值(J_{\theta} (\theta_{0}\pm \lambda ,\theta_{1} \pm \lambda )-J_{\theta} (\theta_{0} ,\theta_{1} )),如果两次得到的差值>0,也就是变化方向反了,那就控制函数改方向(改变\alpha 的值,加个+号或者-号)。如果每次计算都得到的差值都很奇怪,比如一下大一下小,一下正一下负,可能是控制幅度太大,缩小\alpha 的值即可。不断重复直到差值小于一个你觉得合适的极小值。方法很多,不一一枚举。

注意:梯度下降,每一次都需要用到所有样本(或者一堆样本,其它用来做测试,但是对于你用到的样本来说,每一次训练依然是用到所有样本。)来训练数据。这叫做“批量梯度下降”。编程的时候不需要用到循环语句,用矩阵相乘,或者向量相乘即可。方便很多。

第一周笔记到此结束。安德鲁ng的课程在第一周最后几节课及作业是给大家复习线性代数的。这里就不继续做笔记了。当然我的纸质笔记本上是记了这部分的……如果有很多人留言说有需要那我就贴上来就是了……

编辑于 2016-08-22 09:39