Python 一元线性回归实战:从数学推导到 3 行代码实现最小二乘法

发布时间:2026/7/6 10:26:58
Python 一元线性回归实战:从数学推导到 3 行代码实现最小二乘法 Python 一元线性回归实战从数学推导到 3 行代码实现最小二乘法在数据科学和机器学习领域线性回归是最基础且广泛应用的算法之一。它不仅是理解更复杂模型的基石也是许多实际业务场景中的首选工具。本文将带你深入一元线性回归的数学本质从最小二乘法的原理推导开始最终用 Python 实现一个仅需 3 行核心代码的线性回归类。1. 一元线性回归的数学基础一元线性回归描述的是单个自变量x和因变量y之间的线性关系其基本形式为y ax b其中a 是斜率回归系数b 是截距ε 是误差项最小二乘法的核心思想是通过最小化预测值与实际值之间的残差平方和来求解最优参数。具体来说我们需要找到 a 和 b 使得以下损失函数最小化L(a,b) Σ(y_i - (a*x_i b))²通过对损失函数分别关于 a 和 b 求偏导并令导数为零我们可以得到闭式解closed-form solutiona Σ(x_i - x̄)(y_i - ȳ) / Σ(x_i - x̄)² b ȳ - a*x̄其中 x̄ 和 ȳ 分别是 x 和 y 的样本均值。提示这个解被称为正规方程它直接给出了参数的最优解而不需要迭代优化。2. 手动实现最小二乘法理解了数学原理后我们可以用 NumPy 来实现这个计算过程。以下是完整的实现步骤import numpy as np class SimpleLinearRegression: def __init__(self): self.a None # 斜率 self.b None # 截距 def fit(self, X, y): # 计算均值 x_mean np.mean(X) y_mean np.mean(y) # 计算分子和分母 numerator np.sum((X - x_mean) * (y - y_mean)) denominator np.sum((X - x_mean) ** 2) # 计算斜率和截距 self.a numerator / denominator self.b y_mean - self.a * x_mean def predict(self, X): return self.a * X self.b这个实现虽然简单但完整包含了最小二乘法的核心逻辑。让我们分解一下关键部分fit方法计算 x 和 y 的均值计算协方差分子和方差分母根据公式求解 a 和 bpredict方法使用学得的参数进行预测3. 三行代码的极简实现如果追求极简我们可以将核心计算浓缩为 3 行代码class TinyLinearRegression: def fit(self, X, y): self.a np.cov(X, y, biasTrue)[0,1] / np.var(X) self.b np.mean(y) - self.a * np.mean(X) def predict(self, X): return self.a * X self.b这个版本利用了 NumPy 的协方差函数np.cov和方差函数np.var进一步简化了计算。虽然代码行数减少了但数学本质完全相同。4. 模型评估与应用实现模型后我们需要评估其性能。常用的评估指标包括指标公式解释R²得分1 - (Σ(y_i - ŷ_i)²)/(Σ(y_i - ȳ)²)解释方差的比例越接近1越好MSEΣ(y_i - ŷ_i)²/n均方误差越小越好MAEΣy_i - ŷ_i以下是评估代码示例def evaluate(y_true, y_pred): # 计算R² ss_res np.sum((y_true - y_pred) ** 2) ss_tot np.sum((y_true - np.mean(y_true)) ** 2) r2 1 - (ss_res / ss_tot) # 计算MSE和MAE mse np.mean((y_true - y_pred) ** 2) mae np.mean(np.abs(y_true - y_pred)) return {R²: r2, MSE: mse, MAE: mae}5. 实际应用示例让我们用一个实际例子演示如何使用这个模型。假设我们有以下工龄与薪资的数据# 示例数据 X np.array([1, 2, 3, 4, 5]) # 工龄(年) y np.array([30000, 35000, 48000, 40000, 55000]) # 薪资(元) # 创建并训练模型 model TinyLinearRegression() model.fit(X, y) # 预测 new_X np.array([6, 7]) # 预测6年和7年工龄的薪资 predictions model.predict(new_X) # 评估 train_pred model.predict(X) metrics evaluate(y, train_pred)在这个例子中模型会学习工龄与薪资之间的线性关系并可以预测新工龄对应的薪资水平。通过评估指标我们可以了解模型的拟合质量。注意在实际应用中数据预处理如归一化、处理异常值等和更复杂的模型评估如交叉验证通常也是必要的步骤。理解一元线性回归的数学原理和实现方式不仅有助于我们更好地应用这个基础模型也为理解更复杂的机器学习算法奠定了坚实基础。当遇到更复杂的问题时这种从基本原理出发的思考方式往往能带来更深入的理解和更灵活的解决方案。