线性回归理解及代码实现

github:代码实现之一元线性回归代码实现之多元线性回归与多项式回归
本文算法均使用python3实现


1. 什么是线性回归

  《机器学习》对线性回归的定义为:

给定数据集 $ D = \lbrace (x^{(1)}, y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m) } ,y^{(m)}) \rbrace $ ,其中 $ x^{(i)} = \lbrace x_1^{(i)},x_2^{(i)},...,x_n^{(i)} \rbrace $ , $ y^{(i)} \in R $ ,共有 $ m $ 个样本,每个样本含有 $ n $ 个特征 ,“线性回归”(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记。

  以一元线性回归为例,我们通过例子来更好地理解什么是线性回归。
  现在我们有关于南京夫子庙附近房价的一些数据,$ D =\lbrace (x^{(1)}, y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}) \rbrace $ ,其中 $ x^{(i)} $ 只含有一个特征,表示房子的面积 , $ i = 1,2,...,m $ 表示是第 $ i $ 个训练样本 , $ y^{(i)} $ 是数值,表示房子的价格。我们将该数值绘制成下图。



  通过观察我们大致可以看出,房子的面积 $ x^{(i)} $ 与房子的价格 $ y^{(i)} $ 具有一定的线性关系,也就是说,我们可以画出能够大致表示 $ x^{(i)} $ 与 $ y^{(i)} $ 关系的一条直线,如下图:



  在该直线中,房子的面积 $ x^{(i)} $ 为自变量,房子的价格 $ \hat{y}^{(i)} $ 为因变量。而“线性回归”的目的就是,利用自变量 $ x^{(i)} $ 与因变量 $ \hat{y}^{(i)}$ ,来学习出这么一条能够描述两者之间关系的线。对于一元线性回归来说就是学习出一条直线,而对于多元线性回归来说则是学习出一个超平面


2. 一元线性回归模型

  在概念上理解了线性回归是什么之后,我们就需要将线性回归的问题进行抽象化,转换成我们能够求解的数学问题。
  在上面的例子中,我们可以看出自变量 $ x^{(i)} $ 与因变量 $ \hat{y}^{(i)} $ 大致成线性关系,因此我们可以对因变量做如下假设(hypothesis):\[ \hat{y}^{(i)}= \theta_1 x^{(i)} + \theta_0 \]
  或者记作: \[ h_{\theta}(x^{(i)}) = \theta_1 x^{(i)} + \theta_0 \]
  其中 $ i =1 ,2 ,...,m $
  在这里使用 $ \hat{y}^{(i)} $ 是由于通过观察,我们可以发现直线并没有完全拟合数据,而是存在一定的误差。该假设即为一元线性函数的模型函数,其中含有两个参数 $ \theta_1 与 \theta_0 $ 。其中 $ \theta_1 $ 可视为斜率, $ \theta_0 为则直线在 y $ 轴上的截距。接下来的任务就是如何求得这两个未知参数。


3. 损失函数的定义

  通过观察上图,对于 $ x^{(i)} $ 其对应的直线上的值为 $ \hat{y}^{(i)} $ ,但所给的数据集中 $ x^{(i)} $ 对应的值为 $ y^{(i)} $ 。而预测值 $ \hat{y}^{(i)} $ 与实际值 $ y^{(i)} $ 存在误差(或者也叫做残差(residual),在机器学习中也被称为代价(cost))。我们可以认为,预测值与实际值的误差越小越好
  在这里我们使用均方误差来描述所需要求解的目标函数(Objective function)代价函数(Loss function)\[ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(\hat{y}^{(i)}-y^{(i)}) ^2 = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 \]
  其中 $ i = 1,2,..,m $
  目标函数 $ J(\theta_0,\theta_1) $ 描述了所有训练样本实际值与预测值之间的均方误差,而我们的目的就是求解能够使得该误差 $ J(\theta_0,\theta_1) $ 值最小的参数 $ \theta_0, \theta_1 $ 。
  可将其表示为: \[ min_{\theta0,\theta1} J(\theta_0,\theta_1) \]
  在确定了代价函数以及所需要求解的目标( $ \theta_0 , \theta_1 $ )以及条件( $ minJ(\theta_0,\theta_1) $ )之后,接下来需要使用优化算法来进行参数的求解了。


4. 优化算法

  在这里我们将使用两种方法进行参数的求解:(1)梯度下降法(2)最小二乘法
  我们先观察一下目标函数:\[ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 = \frac{1}{2m} \sum_{i=1}^m[(\theta_1 x^{(i)}+ \theta_0 )- y^{(i)} )]^2 \]
  此时将参数 $ \theta_1 $ 视作自变量,可将上式看成是 $ J(\theta_0,\theta_1) $ 是关于 $ \theta_1 $ 的二次函数并可作出下图( $ \theta_0 $ 亦同)。



  可看出函数图中存在最小点,而在该点处满足 $ \frac{\Delta J(\theta_0, \theta_1)}{\Delta \theta_1} = 0 $。此点即为最小值点。

4.1 梯度下降法(gradient descent)

  我们可以使用梯度下降法来求得该点的参数值。其思想为:“走一步看一步”,总是在每一步的小范围内找当前最优方向,再继续前进。
  梯度下降法的逻辑为:
  (1)从某个 $ \theta_0, \theta_1 $ 开始(一般设置为0或者取随机值)
  (2)不断修改 $ \theta_0, \theta_1 $ ,以使得 $ J(\theta_0, \theta_1) $ 越来越小,直到接近最小值点。
  其算法过程为:
   repeat {
        $ \theta_j := \theta_j - \alpha \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} $
   }
   其中 $ \alpha $ 为学习率(learning rate),也就是每一次的“步长”; $ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} $ 是方向,也可以看做是二次函数上每一点的切线斜率,可以使得整体上是朝着最小值点的方向进行。参见下图进行理解:



  由上面的梯度下降算法过程可知,我们需要求解学习率 $ \alpha $ 以及梯度 $ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} ,其中 j = 0,1 $ 。而学习率是人为设定,并不需要从训练集中学习,因此我们只需要求解梯度即可。
  对于一元线性回归来说: \[ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 = \frac{1}{2m} \sum_{i=1}^m(\theta_0+\theta_1 x^{(i)}-y^{(i)})^2 \]
  则 \[ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} = \frac{\Delta}{\Delta \theta_j} \frac{1}{2m} \sum_{i=1}^m (\theta_0 + \theta_1 x^{(i)} - y^{(i)})^2 \]
  当 $ j=0 $ 时: \[ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_0} = \frac{1}{m} \sum _{i=1}^m (\theta_0 + \theta_1 x^{(i)} - y^{(i)}) = \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) \]
  当 $ j=1 $ 时:\[ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_1} = \frac{1}{m} \sum _{i=1}^m (\theta_0 + \theta_1 x^{(i)} - y^{(i)}) \cdot x^{(i)} = \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)} \]
  于是对于一元线性回归,梯度下降算法过程为:
   repeat {
         $ \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) $
         $ \theta_1 := \theta_1 - \alpha \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)} $
   }
   重复以上过程直到收敛,或达到最大迭代次数。
   收敛判断条件为: \[ \mid J(\theta_0^{(k)},\theta_1^{(k)}) - J(\theta_0^{(k-1)},\theta_1^{(k-1)}) \mid < \epsilon \]
  其中 $ \epsilon $ 为阈值 ,当第 $ k $ 次所求代价值,与第 $ k-1 $ 代价值相差小于阈值时,可视为函数收敛到最优解附近。此时的 $ \theta_0^{(k)},\theta_1^{(k)} $ 即为所求参数。
  以上便是梯度下降算法的整个过程。

4.2 最小二乘法(least square method)

  梯度下降是通过迭代的方法求解参数 $ \theta $ ,而最小二乘法,或者叫正规方程,是解析地求解参数 $ \theta $。下面我们来介绍一下如何使用最小二乘法来求得参数。
  对于模型函数,我们可以表示为: \[ h(x) = X \cdot \Theta \]
  其中 \[ X = \begin{bmatrix} 1 & x^{(1)}_1 \\ 1 & x^{(2)}_1 \\ 1 & x^{(3)}_1 \\ \vdots & \vdots \\ 1 & x^{(m)}_1 \\ \end{bmatrix} , \Theta = \begin{bmatrix} \theta_0 \\ \theta_1 \\ \end{bmatrix}, h(x) = \begin{bmatrix} h_\theta(x^{(1)}) \\ h_\theta(x^{(2)}) \\ h_\theta(x^{(3)}) \\ \vdots \\ h_\theta(x^{(m)}) \end{bmatrix} \]
  在这里我们对 $ X $ 添加了偏置项 ,$ x_0^{(i)}=1,其中 i = 1,2,...,m $
  这是因为 $ h_{\theta}(x^{(i)}) = \theta_1 x^{(i)} + \theta_0 = \theta_1 \cdot x_1^{(i)} + \theta_0 \cdot x_0^{(i)} = \theta_1 \cdot x_1^{(i)} + \theta_0 \cdot 1 $ 而 $ x_1^{(i)} $ 为训练样本集中给出的特征。
  对于代价函数我们可以表示为: \[ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(\theta_0+\theta_1 x^{(i)}-y^{(i)})^2 = \frac{1}{2m} [h(x) - y]^T \cdot [h(x)-y] = \frac{1}{2m} [X \cdot \Theta - y]^T[X \cdot \Theta - y] \]
  其中 \[ y = \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ y^{(3)} \\ \vdots \\ y^{(m)} \\ \end{bmatrix} \]
  我们可以把 $ \sigma = [X \cdot \Theta - y]^T[X \cdot \Theta - y] $ ,因此 $ \sigma $ 是关于 $ \Theta $ 的二次函数。当 $ \frac{\Delta \sigma}{\Delta \Theta} = 0 $ 时,$ \sigma $ 取得最小值。
  因此我们需要直接求解 $ \frac{\Delta \sigma}{\Delta \Theta} = 0 $ ,即求解 $ \frac{\Delta}{\Delta \Theta} [(X \cdot \Theta - y)^T(X \cdot \Theta - y)] = 0 $
   而 \[ \frac{\Delta}{\Delta \Theta} [(X \cdot \Theta - y)^T(X \cdot \Theta - y)] = \frac{\Delta}{\Delta \Theta} [({\Theta}^T X^T - y^T)(X \cdot \Theta - y)] \]
   而 \[ \frac{\Delta}{\Delta \Theta} [({\Theta}^T X^T - y^T)(X \cdot \Theta - y)] = \frac{\Delta}{\Delta \Theta}({\Theta}^T X^T X \Theta - {\Theta}^T X^T y - y^T X \Theta + y^T y) \]
   而 \[ \frac{\Delta}{\Delta \Theta}({\Theta}^T X^T X \Theta - {\Theta}^T X^T y - y^T X \Theta + y^T y) = X^T X \Theta + X^T X \Theta - X^T y - X^T y \]
   因此 $ X^T X \Theta + X^T X \Theta - X^T y - X^T y = 0 $
   则 $ 2X^T X \Theta = 2 X^T y $ ,由于 $ X^T X $ 是方阵,因此 $ \Theta = (X^T X)^{-1} X^T y $
   以上便是使用最小二乘法进行参数求解的过程。另外一般来说,矩阵的逆运算算法复杂度为 $ O(n^3) $ ,当训练样本容量很大时,计算非常耗时。

4.3 以上两种方法的比较

\begin{array}{c|lcr}
n & \text{左对齐} & \text{居中对齐} & \text{右对齐} \
\hline
1 & 0.24 & 1 & 125 \
2 & -1 & 189 & -8 \
3 & -20 & 2000 & 1+10i
\end{array}

猜你喜欢

转载自www.cnblogs.com/lliuye/p/9120839.html