线性回归最小二乘法 Python 3.12 实现:从公式推导到 15 行核心代码
线性回归最小二乘法 Python 3.12 实现:从公式推导到 15 行核心代码
线性回归是机器学习领域最基础且应用最广泛的算法之一。它通过建立自变量与因变量之间的线性关系模型,帮助我们理解和预测数据的变化趋势。本文将深入探讨线性回归的核心数学原理——最小二乘法,并展示如何从数学公式推导出Python实现代码。
1. 最小二乘法的数学基础
最小二乘法的核心思想是通过最小化预测值与真实值之间的平方误差和,找到最优的模型参数。对于一元线性回归模型:
$$ y = w x + b $$
其中,$w$是斜率,$b$是截距。我们的目标是找到$w$和$b$的值,使得所有样本点的预测值与真实值的平方误差和最小。
**误差函数(损失函数)**定义为:
$$ J(w,b) = \frac{1}{2m}\sum_{i=1}^{m}(f(x^{(i)}) - y^{(i)})^2 $$
其中:
- $m$是样本数量
- $f(x^{(i)})$是第$i$个样本的预测值
- $y^{(i)}$是第$i$个样本的真实值
2. 正规方程的推导
为了找到使误差函数最小的$w$和$b$,我们需要对$J(w,b)$分别关于$w$和$b$求偏导,并令导数为零。
关于$b$的偏导数:
$$ \frac{\partial J}{\partial b} = \frac{1}{m}\sum_{i=1}^{m}(f(x^{(i)}) - y^{(i)}) $$
关于$w$的偏导数:
$$ \frac{\partial J}{\partial w} = \frac{1}{m}\sum_{i=1}^{m}(f(x^{(i)}) - y^{(i)})x^{(i)} $$
令偏导数等于零,得到正规方程:
$$ \begin{cases} \sum_{i=1}^{m}(wx^{(i)} + b - y^{(i)}) = 0 \ \sum_{i=1}^{m}(wx^{(i)} + b - y^{(i)})x^{(i)} = 0 \end{cases} $$
解这个方程组,可以得到$w$和$b$的最优解:
$$ w = \frac{m\sum xy - (\sum x)(\sum y)}{m\sum x^2 - (\sum x)^2} $$
$$ b = \frac{\sum y - w\sum x}{m} $$
3. Python实现的核心代码
基于上述推导,我们可以用NumPy实现最小二乘法的线性回归。以下是仅需15行的核心代码:
import numpy as np def linear_regression(X, y): """最小二乘法实现线性回归 参数: X -- 自变量数组 (m,) y -- 因变量数组 (m,) 返回: w -- 斜率 b -- 截距 """ m = len(X) X_mean, y_mean = np.mean(X), np.mean(y) # 计算分子和分母 numerator = np.sum((X - X_mean) * (y - y_mean)) denominator = np.sum((X - X_mean) ** 2) # 计算斜率和截距 w = numerator / denominator b = y_mean - w * X_mean return w, b代码解析:
- 首先计算X和y的均值
- 然后计算斜率的分子和分母
- 最后根据公式计算斜率和截距
4. 验证与可视化
为了验证我们的实现是否正确,我们可以生成一些测试数据并进行可视化:
# 生成测试数据 np.random.seed(42) X = np.random.rand(100) * 10 y = 2.5 * X + 1.2 + np.random.randn(100) * 2 # 添加噪声 # 计算回归系数 w, b = linear_regression(X, y) print(f"斜率w: {w:.4f}, 截距b: {b:.4f}") # 可视化 import matplotlib.pyplot as plt plt.scatter(X, y, label='原始数据') plt.plot(X, w*X + b, color='red', label='回归线') plt.xlabel('X') plt.ylabel('y') plt.legend() plt.show()输出示例:
斜率w: 2.5123, 截距b: 1.08355. 多元线性回归的扩展
对于多元线性回归(多个自变量),我们可以使用矩阵形式表示:
$$ \mathbf{y} = \mathbf{X}\mathbf{w} + \mathbf{b} $$
其中:
- $\mathbf{X}$是$m \times n$的设计矩阵(m个样本,n个特征)
- $\mathbf{w}$是$n \times 1$的权重向量
- $\mathbf{b}$是标量偏置项
正规方程的解为:
$$ \mathbf{w} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y} $$
对应的Python实现:
def multiple_linear_regression(X, y): """多元线性回归的最小二乘解""" # 添加偏置项 X_b = np.c_[np.ones((X.shape[0], 1)), X] # 计算正规方程的解 w = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) return w6. 性能优化与注意事项
- 数值稳定性:当$\mathbf{X}^T\mathbf{X}$不可逆时,可以使用伪逆
np.linalg.pinv代替np.linalg.inv - 特征缩放:对于多元回归,建议对特征进行标准化处理
- 计算复杂度:当特征数量很大时(n>10000),正规方程的计算会很慢,此时应考虑梯度下降法
提示:在实际应用中,当数据量不大时(m<10000),最小二乘法是高效且精确的选择;对于大数据集,可以考虑随机梯度下降等优化算法。