当前位置: 首页 > news >正文

线性回归最小二乘法 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

代码解析

  1. 首先计算X和y的均值
  2. 然后计算斜率的分子和分母
  3. 最后根据公式计算斜率和截距

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.0835

5. 多元线性回归的扩展

对于多元线性回归(多个自变量),我们可以使用矩阵形式表示:

$$ \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 w

6. 性能优化与注意事项

  1. 数值稳定性:当$\mathbf{X}^T\mathbf{X}$不可逆时,可以使用伪逆np.linalg.pinv代替np.linalg.inv
  2. 特征缩放:对于多元回归,建议对特征进行标准化处理
  3. 计算复杂度:当特征数量很大时(n>10000),正规方程的计算会很慢,此时应考虑梯度下降法

提示:在实际应用中,当数据量不大时(m<10000),最小二乘法是高效且精确的选择;对于大数据集,可以考虑随机梯度下降等优化算法。

http://www.jsqmd.com/news/1120983/

相关文章:

  • 省时省力!德国宣誓翻译驾照认证件去哪办?24小时出件全攻略
  • cdc同步工具
  • AI大模型驱动自动化测试:从原理到落地的全链路实践指南
  • nginx模块以及反向代理配置
  • 【Java课程设计/毕业设计】基于 SpringBoot 的数字科技风险报告管理系统的设计与实现智能化科技风险报告编制与溯源管理系统【附源码、数据库、万字文档】
  • 5分钟掌握163MusicLyrics:让每首歌都有完美歌词的终极解决方案
  • 从0到1打造终端工作流:gh_mirrors/do/dotfiles-archive的插件与主题安装教程
  • JoyAI-Image-Edit-Plus参数优化指南:30步出图+CFG=4.0,效果提升300%的秘密
  • Tabled API集成指南:如何将表格提取功能嵌入到你的应用中
  • Micro Journal Rev.7电子墨水屏版本:护眼写作的革命性突破
  • 融云「北极星」数据监控平台:数据可视通晓全局,精准分析定位问题
  • Auto Playwright:用自然语言驱动AI自动化测试,提升测试效率与健壮性
  • Instatic媒体批量上传:拖放功能与进度监控的终极指南
  • Android Debug Bridge (ADB) v1.0.41
  • 协议之RTCP介绍
  • readpe高级用法:CSV/XML/HTML输出格式定制与自动化分析技巧
  • postcss-write-svg与构建工具集成:Gulp/Grunt/PostCSS配置教程
  • Windows Research Kernel (WRK) 本地过程调用(LPC):Windows进程间通信的内核实现
  • 陶瓷基板在PCB设计中的核心价值与应用解析
  • Moodle完全指南:如何用3步创建您的第一个在线课程?
  • SC PV PVC volume svc的定义和区别
  • Node.js应用安全防护:从SQL注入与XSS攻击原理到实战防御体系构建
  • 3个颠覆性方法解决Iwara视频下载难题:让你的收藏效率提升500%
  • 3分钟掌握猫抓Cat-Catch:网页视频音频资源一键捕获终极指南
  • 【免费下载】 JHenTai 漫画阅读器开源项目教程
  • 开源Unity替代引擎Prowl:从痛点分析到完整解决方案
  • 炉石传说HsMod插件:让游戏体验焕然一新的55个实用功能
  • C语言内存编址
  • Ubuntu遭DDoS攻击事件剖析:漏洞修复受阻与基础设施韧性思考
  • Mermaid Live Editor:告别拖拽,用代码思维重塑图表创作体验