运用scipy库进行线性拟合

embedded/2025/3/29 8:06:11/

一、概述

此代码运用 Python 的numpymatplotlibscipy库,完成对带噪声线性数据的线性模型拟合与可视化。具体步骤为定义线性模型函数,生成带有噪声的线性数据,利用curve_fit函数进行数据拟合,最后借助matplotlib库将原始数据与拟合直线进行可视化展示。

二、依赖库说明

  • numpy:用于数值计算,像生成数组、进行随机数生成等操作。
  • matplotlib.pyplot:用于数据可视化,可绘制散点图、折线图等。
  • scipy.optimize.curve_fit:用于曲线拟合,能找出与给定数据最佳匹配的模型参数。

三、代码详细解释

1. 导入必要的库

python

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

  • 导入numpy库并简称为np,便于后续使用numpy的函数和类。
  • 导入matplotlib.pyplot库并简称为plt,用于绘图。
  • scipy.optimize模块导入curve_fit函数,用于曲线拟合。

2. 定义模型函数

python

def linear_model(x, a, b):return a * x + b

  • 定义一个名为linear_model的函数,它代表一个线性模型。
  • 该函数接受三个参数:自变量x、斜率a和截距b
  • 函数返回值是线性方程a * x + b的计算结果。

3. 生成数据

python

x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 1, x.shape)

  • np.linspace(0, 10, 100):生成一个包含 100 个元素的一维数组x,元素范围从 0 到 10 且均匀分布。
  • 2 * x + 1 + np.random.normal(0, 1, x.shape):生成因变量y,它基于真实的线性关系2 * x + 1,并添加了均值为 0、标准差为 1 的高斯噪声。np.random.normal(0, 1, x.shape)用于生成与x相同形状的随机噪声数组。

4. 拟合数据

python

params, _ = curve_fit(linear_model, x, y)
a, b = params

  • curve_fit(linear_model, x, y):调用curve_fit函数对linear_model进行拟合,传入自变量x和因变量y
  • params:存储拟合得到的参数,即线性模型的斜率a和截距b
  • _:表示忽略curve_fit函数返回的协方差矩阵。
  • a, b = params:将拟合得到的参数解包,分别赋值给变量ab

5. 可视化结果

python

plt.scatter(x, y, label='Data')
plt.plot(x, linear_model(x, a, b), color='red', label='Fitted line')
plt.legend()
plt.show()

  • plt.scatter(x, y, label='Data'):绘制xy的散点图,标签为Data,用于展示原始数据点。
  • plt.plot(x, linear_model(x, a, b), color='red', label='Fitted line'):绘制拟合直线,使用拟合得到的参数ab计算直线上的点,颜色为红色,标签为Fitted line
  • plt.legend():显示图例,方便区分原始数据和拟合直线。
  • plt.show():显示绘制好的图形。

四、注意事项

  • 此代码假设数据符合线性关系,若数据呈现非线性特征,需重新定义模型函数。
  • 噪声的标准差可根据实际情况调整np.random.normal函数的参数。
  • 对于curve_fit函数的使用,若数据存在异常值,可能会影响拟合效果,可考虑对数据进行预处理或使用更鲁棒的拟合方法。

完整代码

python">import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit# 定义模型函数
def linear_model(x, a, b):return a * x + b# 生成数据
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 1, x.shape)# 拟合数据
params, _ = curve_fit(linear_model, x, y)
a, b = params# 可视化结果
plt.scatter(x, y, label='Data')
plt.plot(x, linear_model(x, a, b), color='red', label='Fitted line')
plt.legend()
plt.show()


http://www.ppmy.cn/embedded/176702.html

相关文章

Qt 隐式共享

隐性共享 Qt 中的许多 C 类都使用隐式数据共享,以最大限度地提高资源利用率并减少复制。隐式共享类在作为参数传递时既安全又高效,因为只传递指向数据的指针,只有在函数写入数据时才复制数据,即写时复制。 概述 共享类由指向共…

java+selenium(资源全备,打开已使用浏览器信息,保留用户信息)

javaselenium(资源全备,打开已使用浏览器信息,保留用户信息) 一、介绍 我的代码可以实现以下效果: 保留用户信息,好处:可以在登录好一个账号后还保留原来的token验证信息 使用javaselenium实现爬取vue元素内容&…

接口自动化框架篇:自定义异常日志封装!

在接口自动化测试中,异常日志是非常重要的一部分。通过记录和封装异常日志,我们可以更好地定位和解决接口问题,提高测试效率和可维护性。本文将介绍如何从零开始,详细规范地编写自定义异常日志封装的接口自动化框架。 1. 确定异常…

流影---开源网络流量分析平台(一)(小白超详细)

目录 流影介绍 一、技术架构与核心技术 二、核心功能与特性 流影部署 流影介绍 一、技术架构与核心技术 模块化引擎设计 流影采用四层模块化架构:流量探针(数据采集)、网络行为分析引擎(特征提取)、威胁检测引擎&…

mysql传统主从模式下,主从中断接续

现象描述 传统模式的mysql主从。 Slave因为大事务延迟巨大。从库重启前的记录位点在binlog:552,pos:471157766 Relaylog:629,pos:496188584 从库重启后binlog倒退到221 Relaylog反而到了1653 故障判断 …

C++学习之QT中HTTP正则表达式

目录 1.知识点概述 2.BASE64介绍 3.QT中BASE64的使用 4.正则表达式中的位置限定字符 5.修饰数量的特殊字符 6.正则表达式中的字符匹配 7.正则表达式例子 8.正则表达式网址介绍 9.QNETWORKACCESSMANAGER类使用介绍 10.QNETWORKREQUEST类的使用 11.QNETWORKREPLY类的使…

clamav服务器杀毒(Linux服务器断网状态下如何进行clamav安装、查杀)

ClamAV服务器杀毒(服务器断网状态也可以使用该方法) 服务器因为挖矿病毒入侵导致断网,进行离线的clamav安装并查杀 安装包下载网址:https://www.clamav.net/downloads 安装.deb,如果服务器处于断网状态,可以…

Gitlab服务器数据迁移及版本升级

公司目前使用的GITLAB服务器,docker方式部署,GITLAB版本为13.11.0,由于版本太老存在安全漏洞,原服务器还部署了其他应用,不方便做升级操作,解决思路是将数据迁移新版本的gitlab服务器。 由于gitlab数据备份…