线性回归最小二乘法 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_{i1}^{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_{i1}^{m}(f(x^{(i)}) - y^{(i)}) $$关于$w$的偏导数$$ \frac{\partial J}{\partial w} \frac{1}{m}\sum_{i1}^{m}(f(x^{(i)}) - y^{(i)})x^{(i)} $$令偏导数等于零得到正规方程$$ \begin{cases} \sum_{i1}^{m}(wx^{(i)} b - y^{(i)}) 0 \ \sum_{i1}^{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, colorred, 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特征缩放对于多元回归建议对特征进行标准化处理计算复杂度当特征数量很大时n10000正规方程的计算会很慢此时应考虑梯度下降法提示在实际应用中当数据量不大时m10000最小二乘法是高效且精确的选择对于大数据集可以考虑随机梯度下降等优化算法。