python中matplotlib实现最小二乘法拟合的过程详解

发布时间 - 2026-01-11 02:17:18    点击率:

前言

最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

下面这篇文章主要跟大家介绍了关于python中matplotlib实现最小二乘法拟合的相关内容,下面话不多说,来一起看看详细的介绍:

一、最小二乘法拟合直线

生成样本点

首先,我们在直线 y = 3 + 5x 附近生成服从正态分布的随机点,作为拟合直线的样本点。

import numpy as np 
import matplotlib.pyplot as plt

# 在直线 y = 3 + 5x 附近生成随机点
X = np.arange(0, 5, 0.1) 
Z = [3 + 5 * x for x in X] 
Y = [np.random.normal(z, 0.5) for z in Z]

plt.plot(X, Y, 'ro') 
plt.show() 

样本点如图所示:

拟合直线

设 y = a0 + a1*x,我们利用最小二乘法的正则方程组来求解未知系数 a0 与 a1。

numpy 的 linalg 模块中有一个 solve 函数,它可以根据方程组的系数矩阵和方程右端构成的向量来求解未知量。

def linear_regression(x, y): 
 N = len(x)
 sumx = sum(x)
 sumy = sum(y)
 sumx2 = sum(x**2)
 sumxy = sum(x*y)

 A = np.mat([[N, sumx], [sumx, sumx2]])
 b = np.array([sumy, sumxy])

 return np.linalg.solve(A, b)

a0, a1 = linear_regression(X, Y) 

绘制直线

此时,我们已经得到了拟合后的直线方程系数 a0 和 a1。接下来,我们绘制出这条直线,并与样本点做对比。

# 生成拟合直线的绘制点
_X = [0, 5] 
_Y = [a0 + a1 * x for x in _X]

plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2) 
plt.title("y = {} + {}x".format(a0, a1)) 
plt.show() 

拟合效果如下:

二、最小二乘法拟合曲线

生成样本点

与生成直线样本点相同,我们在曲线 y = 2 + 3x + 4x^2 附近生成服从正态分布的随机点,作为拟合曲线的样本点。

import numpy as np 
import matplotlib.pyplot as plt

# y = 2 + 3x + 4x^2
X = np.arange(0, 5, 0.1) 
Z = [2 + 3 * x + 4 * x ** 2 for x in X] 
Y = np.array([np.random.normal(z,3) for z in Z])

plt.plot(X, Y, 'ro') 
plt.show() 

样本点如图所示:

拟合曲线

设该曲线的方程为 y = a0 + a1*x + a2*x^2,同样,我们通过正则方程组来求解未知量 a0、a1 和 a2。

# 生成系数矩阵A
def gen_coefficient_matrix(X, Y): 
 N = len(X)
 m = 3
 A = []
 # 计算每一个方程的系数
 for i in range(m):
  a = []
  # 计算当前方程中的每一个系数
  for j in range(m):
   a.append(sum(X ** (i+j)))
  A.append(a)
 return A

# 计算方程组的右端向量b
def gen_right_vector(X, Y): 
 N = len(X)
 m = 3
 b = []
 for i in range(m):
  b.append(sum(X**i * Y))
 return b

A = gen_coefficient_matrix(X, Y) 
b = gen_right_vector(X, Y)

a0, a1, a2 = np.linalg.solve(A, b) 

绘制曲线

我们根据求得的曲线方程,绘制出曲线的图像。

# 生成拟合曲线的绘制点
_X = np.arange(0, 5, 0.1) 
_Y = np.array([a0 + a1*x + a2*x**2 for x in _X])

plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2) 
plt.title("y = {} + {}x + {}$x^2$ ".format(a0, a1, a2)) 
plt.show() 

拟合效果如下:


总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# python最小二乘法拟合  # matplotlib  # 拟合曲线  # python  # python中最小二乘法详细讲解  # Python中实现最小二乘法思路及实现代码  # python实现最小二乘法线性拟合  # Python数据拟合实现最小二乘法示例解析  # 小二  # 平方和  # 正态分布  # 这篇文章  # 马里  # 如图所示  # 相关内容  # 右端  # 中有  # 也可  # 这条  # 它可以  # 还可  # 谢谢大家  # 多说  # 并与  # 得到了  # 有疑问  # py  # plt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在橙子建站中快速调整背景颜色?  Laravel如何配置和使用缓存?(Redis代码示例)  JS经典正则表达式笔试题汇总  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Laravel如何处理和验证JSON类型的数据库字段  昵图网官网入口 昵图网素材平台官方入口  如何用PHP快速搭建CMS系统?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在搬瓦工VPS快速搭建网站?  如何在阿里云ECS服务器部署织梦CMS网站?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Laravel Docker环境搭建教程_Laravel Sail使用指南  如何在腾讯云服务器上快速搭建个人网站?  如何在云虚拟主机上快速搭建个人网站?  如何在建站之星网店版论坛获取技术支持?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何使用Sanctum进行API认证?(SPA实战)  网站制作企业,网站的banner和导航栏是指什么?  JS实现鼠标移上去显示图片或微信二维码  如何用IIS7快速搭建并优化网站站点?  Laravel如何使用Service Container和依赖注入?(代码示例)  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何在建站之星绑定自定义域名?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  浅谈redis在项目中的应用  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何在阿里云虚拟主机上快速搭建个人网站?  微信小程序 wx.uploadFile无法上传解决办法  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  EditPlus中的正则表达式 实战(1)  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)