0%

「机器学习」线性回归原理与推导

在统计学中,线性回归(linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归(multivariable linear regression)

1. 一元线性回归

一元线性回归可谓非常简单。在中学时,我们都学过一元一次方程。我们将 x 作为自变量,y 作为因变量,得到方程(其中 \(\hat{y}\) 为预估值): \[\begin{aligned} \hat{y} = \omega x + b \end{aligned}\]

使用最小二乘法作为损失函数,乘以 \(\frac{1}{2m}\) 是为了简化求导且避免数据集越大损失值越大: \[\begin{aligned} J(\omega, b) = \frac{1}{2m} \mathop{\arg\min}_{\omega, b} \sum_{i=1}^{m}(\hat{y_i} - y_i)^2 \end{aligned}\]

使用梯度下降方法求解损失函数,分别对 \(\omega\)\(b\) 求偏导: \[\begin{aligned} \frac{\partial J(\omega, b)}{\partial \omega} & = \frac{1}{2m} \sum_{i=1}^{m} (\omega^2 x_i^2 + 2 \omega x_i b + b^2 - 2 \omega x_i y_i - 2 b y_i + y_i^2)' \\ & = \frac{1}{2m} \sum_{i=1}^{m} (2 \omega x_i^2 + 2 x_i b - 2 x_i y_i) \\ & = \frac{1}{m} \sum_{i=1}^{m} x_i(\omega x_i + b - y_i) \\ & = \frac{1}{m} \sum_{i=1}^{m} x_i(\hat{y_i} - y_i) \end{aligned}\]

\[\begin{aligned} \frac{\partial J(\omega, b)}{\partial b} & = \frac{1}{2m} \sum_{i=1}^{m} (\omega^2 x_i^2 + 2 \omega x_i b + b^2 - 2 \omega x_i y_i - 2 b y_i + y_i^2)' \\ & = \frac{1}{2m} \sum_{i=1}^{m} (2 \omega x_i + 2 b - 2 y_i) \\ & = \frac{1}{m} \sum_{i=1}^{m} (\omega x_i + b - y_i) \\ & = \frac{1}{m} \sum_{i=1}^{m} (\hat{y_i} - y_i) \end{aligned}\]

参数更新方程,其中 \(\alpha\) 是学习速率: \[\begin{aligned} \theta_j & = \theta_j - \alpha \frac{\partial J(\omega, b)}{\partial \omega} \\ & = \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} x_i(\hat{y_i} - y_i) \end{aligned}\]

2. 多元线性回归

把一元线性回归推广到多元线性回归,多元线性方程为(\(i\) 为第 \(i\) 行样本,\(j\) 为第 \(j\) 个特征,\(m\) 为总样本数,\(n\) 为总特征数): \[\begin{aligned} h(x^{(i)}) = \theta_0 + \theta_1 x_1^{(i)} + \theta_2 x_2^{(i)} + \cdots + \theta_n x_n^{(i)} \end{aligned}\]

方程式的向量表述式: \[\begin{aligned} h_\theta (x) = \begin{bmatrix} \theta_0 \quad \theta_1 \quad \cdots \quad \theta_n \end{bmatrix} \begin{bmatrix} x_0 \\ x_1 \\ \vdots \\ x_n \end{bmatrix} = \theta^T x \end{aligned}\]

多元函数损失函数: \[\begin{aligned} J(\theta_0, \theta_1, \cdots , \theta_m) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta (x_{(i)}) - y_{(i)})^2 \end{aligned}\]

使用梯度下降方法求解损失函数,对 \(\theta\) 求偏导: \[\begin{aligned} \frac{\partial J(\theta)}{\partial \theta} = \frac{1}{m} \sum_{i=1}^{m} x_j^{(i)}(h_\theta (x^{(i)} - y^{(i)})) \end{aligned}\]

参数更新方程,其中 \(\alpha\) 是学习速率: \[\begin{aligned} \theta_j = \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} x_j^{(i)}(h_\theta (x^{(i)} - y^{(i)})) \end{aligned}\]

3. Python 代码

使用 sklearn 线性回归模块拟合数据

1
2
3
4
5
6
7
8
9
10
11
from sklearn.linear_model import LinearRegression

x = np.linspace(0, 20, 32, endpoint=True).reshape(-1,1)
tmp = 2*x+3
y = np.array([i + random.uniform(-5, 5) for i in tmp])

reg = LinearRegression().fit(x, y)
print(reg.score(x, y))

x_p = np.linspace(0, 20, 32, endpoint=True).reshape(-1, 1)
y_p = reg.predict(x_p)

画预测图: