A Great Ship Asks for Deep Waters

机器学习算法总结-线性回归

 

1. 什么是回归(Regression)

回归是基于已知样本对输入变量(自变量)和输出变量(因变量)之间关系的建模。即是,对一个样本中抽象出$n$个自变量特征,每一个特征$x_i\in\mathbb{R}$,回归模型会学习输出函数$f:\mathbb{R}^n\rightarrow\mathbb{R}$。回归问题通常运用在输出在实数范围内的场景,比如股价预测。

 

2. 线性回归(Linear Regression)

线性回归是包括一个或多个称为回归系数的模型参数的线性组合。拥有单个变量就是单元回归,多个变量则为多元回归。线性回归意在找到一条在多元空间中的直线拟合已知样本数据。
假定有样本集$S = \left\{(X_1,y_1),(X_2,y_2),(X_3,y_3)…(X_n,y_n)\right\}$
每一个样本可以表示成由多个自变量特征组成的向量,即$X = \left[x_1, x_2, …, x_m, 1\right], X\in\mathbb{R}^n$。
需要估计的回归系数可以表示成向量,$W = \left[w_1, w_2, …, w_m, b\right], W\in\mathbb{R}^n$, $b$为偏置项。
这样,我们可组建一个从输入向量$X$到输出标量$y$的一个映射函数,$y = W^TX$,线性回归的目的就是为了估计其中的回归系数。

 

3. 性能度量(Performance)

为了能够度量待估计参数的好坏,均方误差(Mean Squared Error)可用来度量模型性能。即模型估计值与实际值之差的平方的期望。
\begin{gather*}
\begin{aligned}
E = \frac{1}{n}\sum_m(\hat{y} \; -\; y)^2.
\end{aligned}
\end{gather*}直观上看,当模型估计值$\hat{y}$和实际值$y$欧几里得距离增加时,误差也会增加。换而言之,均方误差能够较好的度量模型估计值与真实值之间的误差。

 

4. 算法-正规方程(Normal Equation)

我们可以通过求得估计参数的最优解以此获得在假设空间中的表达最佳的估计参数。
为此,可以对均方误差$E$求关于参数项$W$的偏导数。偏导数为0时,估计参数得到最优解。那么为什么偏导数为0为最优解呢,首先导数为0代表着极值,其次误差函数的值不可能达到最大。因此我们可通过使偏导数为0求的最小值,以此求的最佳估计参数。
\begin{gather*}
\begin{aligned}
& \nabla{{}_W} \frac{1}{n}\sum_m(\hat{y} \; -\; y)^2 = 0, \\
\Rightarrow& \nabla{{}_W} \frac{1}{n}\sum_m(W^TX \; -\; y)^2 = 0, \\
\Rightarrow& \nabla{{}_W} (XW \; -\; y)^T(XW \; -\; y) = 0, \\
\Rightarrow& \nabla{{}_W} (XW \; -\; y)^T(XW \; -\; y) = 0, \\
\Rightarrow& \nabla{{}_W} (W^TX^TXW \; -\; 2W^TX^Ty \; +\; y^Ty) = 0, \\
\Rightarrow& 2X^TXW \; -\; 2X^Ty = 0, \\
\Rightarrow& W = (X^TX)^{-1}X^Ty.
\end{aligned}
\end{gather*}从而,我们只需要将所有既存数据的特征矩阵和实际值向量带入公式,即可得最优解$W$。

 

5. 源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np
from sklearn.datasets import make_regression

class Linear(object):

    def __init__(self):
        self.W = None

    def train(self, X, y):
        X = np.insert(X, 0, 1, axis=1)
        y = np.reshape(y, (100, 1))
        XTX = np.matrix(X.T.dot(X))
        XTXIXT = XTX.I.dot(X.T)
        w = XTXIXT.dot(y)
        self.W = w

    def predict(self, X):
        X = np.insert(X, 0, 1, axis=1)
        y_pred = X.dot(self.W)
        return y_pred

# Training data
X, y = make_regression(n_samples=100, n_features=4, noise=20)
linear = Linear()
linear.train(X, y)
print(linear.W)

# Testing data
test, testy = make_regression(n_samples=10, n_features=4, noise=20)
y_pred = linear.predict(test)
print(y_pred)
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注