回归算法

2018/4/27 posted in  MachineLearning

什么是回归算法

  1. 回归算法是一种有监督算法;
  2. 回归算法是一种比较常用的机器学习算法,用于建立解释变量(自变量X)和观测值(因变量Y)之间的关系;
  3. 从机器学习的角度来讲,用于构建一个算法模型(函数)来做属性(X)与标签(Y)之间的映射关系,在算法的学习过程中,试图寻找一个函数h:使得\(R^d\to R\)使得参数之间的关系拟合性最好;
  4. 回归算法中,算法(函数)的最终结果是一个连续的数据值,输入值(属性值)是一个d维度的属性/数值向量;
  5. 因此,回归算法是用于预测连续型数值输出的算法.

线性回归

单变量线性回归

\[h_{\theta}=\theta_0+ \theta_1x\]

因为只含有一个特征/输入变量,因此这样的问题叫做单变量线性回归问题.

代价函数(Cost Function)

我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距就是建模误差(modeling error).

我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数.即使得代价函数最小.
\[J(\theta_0,\theta_1)=\dfrac{1}{2m}\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2\]

多变量线性回归

公式推导

\[\begin{align}
y^{(i)}& =\theta ^Tx^{(i)}+\epsilon^{(i)}\\\
p(\epsilon^{(i)})& =\frac{1}{\sqrt{2\pi}\sigma}e^{\left(-\dfrac{(\epsilon^{(i)})^2}{2\sigma^2}\right)} \\\
p(y^{(i)}|x^{(i)};\theta)& =\frac{1}{\sqrt{2\pi}\sigma}e^{\left(-\dfrac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}\right)} \\\
L(\theta)& =\prod_{i=1}^mp(y^{(i)}|x^{(i)};\theta)\\\
& = \prod_{i=1}^m\frac{1}{\sqrt{2\pi}\sigma}e^{\left(-\dfrac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}\right)}
\end{align}\]

最大似然,要使这个方程的结果最大

对数似然,目标函数及最小二乘法

\[
\begin{align}
\ell(\theta)& =\log L(\theta) \\\
& = \log\prod_{i=1}^m\frac{1}{\sqrt{2\pi}\sigma}e^{\Big(-\dfrac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}\Big)} \\\
& = \sum_{i=1}^m\log\frac{1}{\sqrt{2\pi}\sigma}+\sum_{i=1}^m \log e^{\Big(-\dfrac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2}\Big)} \\\
& = m\log\frac{1}{\sqrt{2\pi}\sigma}-\frac{1}{\sigma^2}\cdot\frac{1}{2}\sum_{i=1}^m\Big(y^{(i)}-\theta^Tx{(i)}\Big)^2
\end{align}
\]

那么就得让这个式子的结果最小

\[loss(y_j,\hat{y_j})=J(\theta)=\frac{1}{2}\sum_{i=1}^{m}\left(h_\theta(x^{(i)-y^{(i)}})\right)^2\]

我们的目标是最小化损失函数.

\[J(\theta)=\cfrac{1}{2}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2=\cfrac{1}{2}(X\theta-Y)^T(X\theta-Y) \to \min \limits_{\theta}J(\theta)\]

既然是求最小值,那么肯定是通过求导来计算.对这个损失函数进行求导运算.

\[
\begin{aligned}
\nabla J(\theta)& =\nabla_{\theta}\Big(\cfrac{1}{2}(X\theta-Y)^T(X\theta-Y)\Big) \\\
& = \nabla_{\theta}\Big(\cfrac{1}{2}(\theta^TX^T-Y^T)(X\theta-Y)\Big) \\\
& = \nabla_{\theta}\Big(\cfrac{1}{2}(\theta^TX^TX\theta-\theta^TX^TY-Y^TX\theta+Y^TY)\Big) \\\
& = \cfrac{1}{2}\Big(2X^TX\theta-X^T-(Y^TX)^T\Big) \\\
& = X^TX\theta-X^TY
\end{aligned}
\]

\[\theta=(X^TX)^{-1}X^TY\]

简述原理

\(\theta\)值推导过程以及求解

构造数据

import numpy as np
import pandas as pd

# 构造测试数据y=3x1+x2
df=pd.DataFrame({
    "x1":[1,2,3,4,5,6],
    "x2":[1,2,1,2,1,2],
    "y":[3,6,7,10,11,14]
})

抽取x和y

# 抽取x和y
x=df[['x1','x2']]
# 将y转换成n行1列的列向量
y=df['y'].values.reshape((-1,1))

求解\(\theta\) 值

根据公式计算\(\theta\)值,推导过程如图所示
\[\theta=(X^TX)^{-1}X^TY\]

numpy api说明:
+ mat:将ndarray转成matrix
+ dot:矩阵乘法
+ T:求矩阵的转置
+ I:求矩阵的逆

# 写出公式,计算theta值

np.dot(np.mat(x.T.dot(x)).I,x.T).dot(y)
matrix([[ 2.],
        [ 1.]])

很明显,计算结果正确.两个系数分别是2和1