news 2026/7/6 10:26:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 solution):

a = Σ(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

这个实现虽然简单,但完整包含了最小二乘法的核心逻辑。让我们分解一下关键部分:

  1. fit方法

    • 计算 x 和 y 的均值
    • 计算协方差(分子)和方差(分母)
    • 根据公式求解 a 和 b
  2. predict方法

    • 使用学得的参数进行预测

3. 三行代码的极简实现

如果追求极简,我们可以将核心计算浓缩为 3 行代码:

class TinyLinearRegression: def fit(self, X, y): self.a = np.cov(X, y, bias=True)[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)

在这个例子中,模型会学习工龄与薪资之间的线性关系,并可以预测新工龄对应的薪资水平。通过评估指标,我们可以了解模型的拟合质量。

注意:在实际应用中,数据预处理(如归一化、处理异常值等)和更复杂的模型评估(如交叉验证)通常也是必要的步骤。

理解一元线性回归的数学原理和实现方式,不仅有助于我们更好地应用这个基础模型,也为理解更复杂的机器学习算法奠定了坚实基础。当遇到更复杂的问题时,这种从基本原理出发的思考方式往往能带来更深入的理解和更灵活的解决方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 10:25:01

STM32F407ZG与MC6470 IMU的硬件协同设计与姿态解算

1. MC6470与STM32F407ZG的硬件协同设计MC6470作为一款6自由度惯性测量单元(IMU),其核心价值在于集成了三轴加速度计和三轴陀螺仪于单芯片中。在实际项目中,这款IMU的加速度计量程可达16g,陀螺仪范围达2000dps,且内置数字运动处理器…

作者头像 李华
网站建设 2026/7/6 10:24:06

闭眼入不翻车!2026实测好用的AI论文网站|避坑精选版

2026 年学术写作工具已高度分化,千笔AI与ThouPen为全流程首选,豆包、DeepSeek 为专项强手;避坑关键:拒绝假文献、严控 AIGC 率、优先国内适配、免费试用先行。 一、TOP3 全流程首选(亲测不踩雷) 1. 千笔AI&…

作者头像 李华
网站建设 2026/7/6 10:23:50

AWS Amplify全栈开发实战:CLI、GraphQL API与托管Auth深度解析

1. 项目概述:这不是又一个“云平台宣传稿”,而是一线开发者用三个月真实项目踩出来的路AWS Amplify 这个名字,过去两年在前端圈子里出现的频率,几乎和“微服务”“Serverless”一样高。但很多人点开官网文档,看到一堆 …

作者头像 李华
网站建设 2026/7/6 10:22:40

开源会议设计:从Open Source Bridge看社区驱动的协作范式

1. 项目概述:一场扎根社区、拒绝套路的开源实践现场 去年六月, Portland 的 Hilton Downtown 酒店里没有西装革履的展台销售员,没有循环播放的PPT背景音,也没有被塞满议程的“黄金三小时”。取而代之的是瑜伽垫铺在会议厅地毯上、…

作者头像 李华
网站建设 2026/7/6 10:22:33

技术团队如何用专业能力做可持续社区公益

1. 项目概述:当系统管理员脱下工装裤,换上骑行服——一次技术人参与社区公益的实操复盘 你可能在招聘启事里见过“我们重视企业社会责任”这种话,也可能在年会PPT上扫过几眼“年度公益贡献”数据。但真正把服务器巡检表和自行车链条放在一起看…

作者头像 李华