线性回归

机器学习的典型的学习过程是:首先给出一个输入数据,学习算法就是要学得一个估计的函数,这个函数能对未知数据给出一个估计,这也称为构建一个模型。

 

线性回归是假设特征和结果满足线性关系。

估计函数:$h\left(x\right)=h_\theta\left(x\right)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n$

              令$x_0=1$  => $h_\theta\left(x\right)=\theta^Tx$

用损失函数对 $h\left(x\right)$进行评估,即损失函数

损失函数:$J\left(\theta\right)=\frac{1}{2}\sum_{i=1}^m\left(h_\theta\left(x^\left(i\right)\right)-y^\left(i\right)\right)^2$

              $\min_\limits{\theta}{J\left(\theta\right)}$

如何调整$\theta$使得$J\left(\theta\right)$取得最小值:最小二乘法、梯度下降法。

 

梯度下降法:

1.首先对$\theta$赋值,这个值可以是随机的,也可以让$\theta$为一个全为0的向量。

2.改变$\theta$的值,使得$J\left(\theta\right)$按照梯度下降的方向进行减少。梯度的方向由$J\left(\theta\right)$对$\theta$的偏导决定。

3.直到收敛为止

 

批量梯度下降法:(每次迭代计算$\theta^T$的时候都用了整个数据集)

当只有数据集中只有一个样本的时候:

$\frac{\partial J\left(\theta\right)}{\partial \theta_j}=\frac{\partial \frac{1}{2}\left(h_\theta\left(x\right)-y\right)^2}{\partial \theta_j}=\left(h_\theta\left(x\right)-y\right)\frac{\partial \left(\sum_{i=0}^n\theta_i x_i - y\right)}{\partial\theta_j}=\left(h_\theta\left(x\right)-y\right)x_j$

 $\theta_j := \theta_j + \alpha \left(y^\left(i\right) - h_\theta\left(x^\left(i\right)\right)\right) x_j^\left(i\right)$

当样本数量m不为1时,每个参数的改变方向由下面的公式确定:

 $\theta_j := \theta_j + \alpha \sum_{i=1}^m \left(y^\left(i\right) - h_\theta\left(x^\left(i\right)\right)\right) x_j^\left(i\right)$

当样本集数据量m很大时,批量梯度下降算法每迭代一次的复杂度为O(mn),复杂度很高。因此,为了减少复杂度,当m很大时,我们更多时候使用随机梯度下降算法。

还有一个很重要的地方值得注意的是,梯度是有方向的,对于一个向量$\theta$,每一维分量$\theta_i$都可以求出一个梯度的方向,我们就可以找到一个整体的方向,在变化的时候,我们就朝着下降最多的方向进行变化就可以达到一个最小点,不管它是局部的还是全局的。

用矩阵描述:

$\nabla_\theta J =\begin{bmatrix}\frac{\partial J}{\partial \theta_0} \\ \vdots \\ \frac{\partial J}{\partial \theta_n} \end{bmatrix}$

$\theta = \theta - \alpha \nabla_\theta J $

 

随机梯度下降法

每读取一条样本,就迭代对$\theta^T$进行更新,然后判断其是否收敛,若没收敛,则继续读取样本进行处理,如果所有样本都读取完毕了,则循环重新从头开始读取样本进行处理。这样迭代一次的算法复杂度为O(n)。

对于数据集很大的情况,很有可能只需读取一小部分数据,函数$J\left(\theta\right)$就收敛了。比如样本集数据量为100万,有可能读取几千条或几万条时,函数就达到了收敛值。所以当数据量很大时,更倾向于选择随机梯度下降算法。

但是,相较于批量梯度下降算法而言,随机梯度下降算法使得$J\left(\theta\right)$趋近于最小值的速度更快,但是有可能造成永远不可能收敛于最小值,有可能一直会在最小值周围震荡,但是实践中,大部分值都能够接近于最小值,效果也都还不错。

 

为了克服批量梯度下降法和随机梯度下降法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降。

mini-batch gradient decent:把数据分为若干个批,按批来更新参数。这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。

 

如何判断算法是否受理了:

1.参数$\theta^T$的变化距离为0,或者说变化距离小于某一阈值($\theta^T$中每个参数的变化绝对值都小于一个阈值)。为减少计算复杂度,该方法更为推荐使用。

2.$J\left(\theta\right)$不再变化,或者说变化程度小于某一阈值。计算复杂度较高,但是如果为了精确程度,那么该方法更为推荐使用。

 

 线性回归中,若特征较多,经常会出现过拟合,但选择较少的特征,又会出现欠拟合问题。预测$x_i$的$y_i$,其实主要关注的是$x_i$周围的值,基于这种想法,我们可以给每个$x_j$一个权重,距离$x_i$较近的其权重值较大,这就是带权重的线性回归。

带权重的线性回归

误差函数:$\sum_i^m w^\left(i\right) \left(y^\left(i\right) - \theta^T x^\left(i\right) \right)^2$

              $w^\left(i\right) = e^\left(-\frac{\left(x^\left(i\right) - x \right)^2}{2\tau^2}\right)$

              其中x是要预测的样本

posted @ 2017-04-15 16:12  江小修  阅读(113)  评论(0编辑  收藏  举报