目录

  • 1.线性回归
  • 1.1什么是线性回归
  • 1.2线性回归的最优解
  • 2.梯度下降法
  • 2.1什么是梯度下降法
  • 2.2线性回归梯度下降法
  • 2.3随机梯度下降法(SGD)
  • 2.4Mini-Batch


1.线性回归

1.1什么是线性回归

java 二元线性回归 二元线性回归分析案例_机器学习可以写成java 二元线性回归 二元线性回归分析案例_机器学习_02,其中java 二元线性回归 二元线性回归分析案例_机器学习_03是乘坐出租车的公里数,如果我们获得的数据是公里数java 二元线性回归 二元线性回归分析案例_机器学习_03和费用java 二元线性回归 二元线性回归分析案例_机器学习,要求是给一个java 二元线性回归 二元线性回归分析案例_机器学习_03算出一个java 二元线性回归 二元线性回归分析案例_机器学习,通过最小二乘法拟合出的这条直线就是回归的结果。另一方面,如果我们将标签的+1和-1当做值,就可以做分类问题了。当然,线性回归做分类并不太好用,logistic回归会是更好选择,因为最小二乘法使用的是平方误差,不难想象,一个异常值造成的偏差影响是很大的。

1.2线性回归的最优解

  下面我们可以开始愉快的推公式环节了,导出理论上的线性回归的最优解。
  首先我们假设变量,java 二元线性回归 二元线性回归分析案例_人工智能_08为一个样本的特征向量,假设有D+1个维度(最后一个维度是1,为了把常数项放进来),java 二元线性回归 二元线性回归分析案例_java 二元线性回归_09为样本组成的nd+1的矩阵,而java 二元线性回归 二元线性回归分析案例_梯度下降法_10是待求的d+1维的权重,或者说回归系数,java 二元线性回归 二元线性回归分析案例_线性回归_11是第n个样本对应的输出值,java 二元线性回归 二元线性回归分析案例_线性回归_12是输出值构成的n1矩阵,java 二元线性回归 二元线性回归分析案例_人工智能_13则是预测的输出值。最小二乘法其实说穿了就是在优化这么一个损失函数,使之最小:
java 二元线性回归 二元线性回归分析案例_机器学习_14
将我们假设的变量带入,并且略去不影响结果的系数项,我们得到:
java 二元线性回归 二元线性回归分析案例_线性回归_15
而我们要求的就是:
java 二元线性回归 二元线性回归分析案例_机器学习_16
自然而然的,我们可以想到对java 二元线性回归 二元线性回归分析案例_机器学习_17求导,令java 二元线性回归 二元线性回归分析案例_机器学习_18,不会矩阵求导的朋友可以参考Matrix Cookbook。求导后得到如下的结果:
java 二元线性回归 二元线性回归分析案例_梯度下降法_19
当样本数量大于特征维度时,java 二元线性回归 二元线性回归分析案例_人工智能_20是满秩矩阵,因此可以求逆,得到java 二元线性回归 二元线性回归分析案例_机器学习_17的解:
java 二元线性回归 二元线性回归分析案例_线性回归_22
在这里解释一下这个解,最小二乘法是可以给出最优解的。这个java 二元线性回归 二元线性回归分析案例_机器学习_17就代表着在当前样本下,使得样本均方误差最小的解,这是全局的最优解,是唯一且确定的。

2.梯度下降法

2.1什么是梯度下降法

java 二元线性回归 二元线性回归分析案例_java 二元线性回归_24,当输入的特征维度很高的时候,计算逆矩阵是很困难的。因此,引入了梯度下降的概念。梯度下降法的直观理解可以参考下图:

java 二元线性回归 二元线性回归分析案例_机器学习_25

2.2线性回归梯度下降法

java 二元线性回归 二元线性回归分析案例_机器学习_17下寻找一个使损失函数变小的方向,通过迭代来完成,这样就避免了逆矩阵的求取,之前的求导过程我们得到java 二元线性回归 二元线性回归分析案例_java 二元线性回归_27
java 二元线性回归 二元线性回归分析案例_java 二元线性回归_28
于是我们设定一个正的学习率java 二元线性回归 二元线性回归分析案例_机器学习_29,就可以得到java 二元线性回归 二元线性回归分析案例_机器学习_17的更新公式:
java 二元线性回归 二元线性回归分析案例_人工智能_31
结合上图可以看出,java 二元线性回归 二元线性回归分析案例_线性回归_32始终在向java 二元线性回归 二元线性回归分析案例_梯度下降法_33也就是java 二元线性回归 二元线性回归分析案例_java 二元线性回归_34更小的方向迭代。

2.3随机梯度下降法(SGD)

  梯度下降法固然不用求导,但是每一次迭代仍然使用了所有的样本,而SGD则是选择了抽取单个样本,从而损失函数从全局变成了局部:
java 二元线性回归 二元线性回归分析案例_人工智能_35
  于是梯度也变成了:
java 二元线性回归 二元线性回归分析案例_人工智能_36
  更新公式:
java 二元线性回归 二元线性回归分析案例_人工智能_31
  显然,采用了SGD计算量小了很多,但是缺点也很直观,容易受到噪声影响,收敛的速度会变慢,震荡会更加厉害。

2.4Mini-Batch

  Mini-Batch可以说是SGD和BGD的折中选择,具体做法就是每一次迭代先将样本集分成若干个小的Batch,随后根据梯度下降法的公式,在每一个batch上更新梯度,这样既可以减少计算量,又可以抑制噪声,属于改进方法。我生成了两类遵从高斯分布的样本点,测试了一下梯度下降和最小二乘的结果,分类面是差不多的。

java 二元线性回归 二元线性回归分析案例_线性回归_38

LMS为最小二乘,SSE为梯度下降。