线性回归

线性回归(linear regression)是一种用于预测回归问题的算法.

一、线性回归模型

线性回归是对“目标变量随着某个特征变量的增大而增大(或者减小)”这种关联性建模的方法。其假设目标变量yy 是自变量x\mathbf{x} 的线性函数。可以分为一元线性回归和多元线性回归。

1. 一元线性回归

一元线性回归是最简单的线性回归模型,它只有一个自变量xx。其数学表达式为:

y=wx+by = wx + b

其中,ww 是斜率(或叫权重),bb 是截距。

2. 多元线性回归

多元线性回归扩展了一元线性回归,它包含多个自变量。其数学表达式为:

y=w1x1+w2x2++wdxd+by = w_1 x_1 + w_2 x_2 + \cdots + w_d x_d + b

用向量表示为:

y=wTx+by = \mathbf{w}^T \mathbf{x} + b

其中,w=(w1,w2,,wd)\mathbf{w} = (w_1, w_2, \ldots, w_d)x=(x1,x2,,xd)\mathbf{x} = (x_1, x_2, \ldots, x_d)

二、损失函数和最优化算法

在线性回归中,常用的损失函数是均方误差(Mean Squared Error, MSE)。均方误差衡量了预测值与实际值之间的差异,其公式为:

E(w,b)=i=1m(yi(wTxi+b))2E(\mathbf{w}, b) = \sum_{i=1}^m (y_i - (\mathbf{w}^T \mathbf{x}_i + b))^2

最优化算法的目标是找到使损失函数最小的参数w\mathbf{w}bb。基于均方误差最小化来进行模拟求解的方法称为 “最小二乘法”。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。

三、最小二乘法

最小二乘法通过最小化预测值与实际值之间的平方误差来求解参数。下面详细介绍一元线性回归和多元线性回归中最小二乘法的计算。

1. 一元线性回归的最小二乘法

对于一元线性回归,损失函数为:

E(w,b)=i=1m(yi(wxi+b))2E_{(w, b)} = \sum_{i=1}^{m} (y_i - (wx_i + b))^2

wwbb 求导得到:

E(w,b)w=2(wi=1mxi2i=1m(yib)xi),E(w,b)b=2(mbi=1m(yiwxi)),\begin{aligned} \frac{\partial E_{(w, b)}}{\partial w} &= 2 \left( w \sum_{i=1}^m x_i^2 - \sum_{i=1}^m (y_i - b)x_i \right), \\ \frac{\partial E_{(w, b)}}{\partial b} &= 2 \left( mb - \sum_{i=1}^m (y_i - wx_i) \right), \end{aligned}

上式推导过程如下:

E(w,b)w=w[i=1m(yiwxib)2]=i=1mw[(yiwxib)2]=i=1m[2(yiwxib)(xi)]=2i=1m[(wxi2yixi+bxi)]=2(wi=1mxi2i=1myixi+bi=1mxi)=2(wi=1mxi2i=1m(yib)xi)\begin{aligned} \frac{\partial E_{(w, b)}}{\partial w} &= \frac{\partial}{\partial w} \left[ \sum_{i=1}^m (y_i - wx_i - b)^2 \right] \\ &= \sum_{i=1}^m \frac{\partial}{\partial w} \left[ (y_i - wx_i - b)^2 \right] \\ &= \sum_{i=1}^m \left[ 2(y_i - wx_i - b)(-x_i) \right] \\ &= 2 \sum_{i=1}^m \left[ (wx_i^2 - y_i x_i + bx_i) \right] \\ &= 2 \left( w \sum_{i=1}^m x_i^2 - \sum_{i=1}^m y_i x_i + b \sum_{i=1}^m x_i \right) \\ &= 2 \left( w \sum_{i=1}^m x_i^2 - \sum_{i=1}^m (y_i - b) x_i \right) \end{aligned}

E(w,b)b=b[i=1m(yiwxib)2]=i=1mb[(yiwxib)2]=i=1m[2(yiwxib)(1)]=2i=1m[byi+wxi]=2[i=1mbi=1myi+i=1mwxi]=2(mbi=1m(yiwxi))\begin{aligned} \frac{\partial E_{(w, b)}}{\partial b} &= \frac{\partial}{\partial b} \left[ \sum_{i=1}^m (y_i - wx_i - b)^2 \right] \\ &= \sum_{i=1}^m \frac{\partial}{\partial b} \left[ (y_i - wx_i - b)^2 \right] \\ &= \sum_{i=1}^m \left[ 2(y_i - wx_i - b)(-1) \right] \\ &= 2 \sum_{i=1}^m \left[ b - y_i + wx_i \right] \\ &= 2 \left[ \sum_{i=1}^m b - \sum_{i=1}^m y_i + \sum_{i=1}^m wx_i \right] \\ &= 2 \left( mb - \sum_{i=1}^m (y_i - wx_i) \right) \end{aligned}

令上式为零可得到wwbb 最优解的闭式解:

w=i=1myi(xix)i=1mxi21m(i=1mxi)2w = \frac{\sum_{i=1}^m y_i (x_i - \overline{x})}{\sum_{i=1}^m x_i^2 - \frac{1}{m} \left( \sum_{i=1}^m x_i \right)^2}

b=1mi=1m(yiwxi)b = \frac{1}{m} \sum_{i=1}^m (y_i - wx_i)

2. 多元线性回归的最小二乘法

我们把wwbb 吸收入向量形式w^=(w;b)\hat{\mathbf{w}} = (\mathbf{w}; b)

X=(x11x12x1d1x21x22x2d1xm1xm2xmd1)=(x1T1x2T1xmT1)\mathbf{X} = \begin{pmatrix} x_{11} & x_{12} & \ldots & x_{1d} & 1 \\ x_{21} & x_{22} & \ldots & x_{2d} & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ x_{m1} & x_{m2} & \ldots & x_{md} & 1 \end{pmatrix} = \begin{pmatrix} \mathbf{x}_1^\mathrm{T} & 1 \\ \mathbf{x}_2^\mathrm{T} & 1 \\ \vdots & \vdots \\ \mathbf{x}_m^\mathrm{T} & 1 \end{pmatrix}

w^=argminw^(yXw^)T(yXw^)\hat{\mathbf{w}}^* = \arg\min_{\hat{\mathbf{w}}} \left( \mathbf{y} - \mathbf{X} \hat{\mathbf{w}} \right)^\mathrm{T} \left( \mathbf{y} - \mathbf{X} \hat{\mathbf{w}} \right)

对于多元线性回归,损失函数为:

Ew^=(yXw^)T(yXw^)E_{\hat{\mathbf{w}}} = (\mathbf{y} - \mathbf{X} \hat{\mathbf{w}})^\mathrm{T} \left( \mathbf{y} - \mathbf{X} \hat{\mathbf{w}} \right)

w^\hat{\mathbf{w}} 求导得到:

Ew^w^=2XT(Xw^y)\frac{\partial E_{\hat{\mathbf{w}}}}{\partial \hat{\mathbf{w}}} = 2 \mathbf{X}^\mathrm{T} \left( \mathbf{X} \hat{\mathbf{w}} - \mathbf{y} \right)

令上式为零可得:

w^=(XTX)1XTy\hat{\mathbf{w}}^* = \left( \mathbf{X}^\mathrm{T} \mathbf{X} \right)^{-1} \mathbf{X}^\mathrm{T} \mathbf{y}

四、代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

# 构建数据集
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) # 输入变量
y = np.array([1, 2, 2, 3]) # 目标变量

# 添加偏置项
X_b = np.c_[np.ones((X.shape[0], 1)), X]

# 最小二乘法求解
beta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)

# 预测
X_new = np.array([[0, 2], [2, 5]])
X_new_b = np.c_[np.ones((X_new.shape[0], 1)), X_new]
y_predict = X_new_b.dot(beta_best)

print("预测结果:", y_predict)

五、总结

线性回归通过最小二乘法来最小化预测值和实际值之间的误差,从而得到模型参数。一元线性回归适用于单一特征,多元线性回归适用于多特征。

参考文献: