[Python数据拟合与可视化]:使用线性、多项式、指数和高斯模型拟合数据

引言

在数据分析和机器学习领域,选择合适的模型对数据进行拟合是至关重要的。本文将通过一个实际的Python编程案例,比较线性、多项式、指数和高斯模型在数据拟合方面的性能。通过生成模拟数据,我们将使用这些模型进行拟合,并评估它们的均方误差(MSE)和决定系数(R^2),最后通过可视化直观地展示拟合效果。

方法

首先,我们使用numpy库生成了120个月的数据,并对这些数据应用了一个包含线性和二次项的函数,同时添加了正态分布的噪声。接着,我们定义了四种不同的模型:线性模型、三阶多项式模型、指数模型和高斯模型。

  1. 线性模型三阶多项式模型使用sklearn的LinearRegression进行拟合。
  2. 指数模型高斯模型则通过scipy的curve_fit函数进行非线性最小二乘拟合。

实验结果

对于每种模型,我们计算了MSE和R^2值来评估拟合的好坏。MSE越低,R^2越接近1,表示模型拟合效果越好。实验结果显示,三阶多项式模型在本案例中表现最佳,其R^2值最高,MSE值最低。

可视化分析

我们使用matplotlib库对所有模型的拟合结果进行了可视化。每个模型的拟合曲线与原始数据一起展示在子图中,直观地比较了不同模型的拟合效果。此外,我们还展示了一个汇总图表,其中包括所有模型的拟合曲线,以及最佳拟合模型的详细信息。

结论

通过本次实验,我们可以看到不同模型在特定数据集上的拟合效果可以有显著差异。选择合适的模型对于数据分析和预测至关重要。此外,可视化是理解数据和模型性能的有力工具。

代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from scipy.optimize import curve_fit# 生成随机模拟数据
np.random.seed(42)
months = np.arange(1, 121)
y = 3 * months + 1.4 * months**2 + np.random.normal(loc=0, scale=2*months**1.55, size=120)  # 使用线性关系并添加噪声# 定义模型
models = {"Linear线性": LinearRegression(),# "Quadratic二阶多项式": LinearRegression(),"Cubic三阶多项式": LinearRegression()
}
degrees = [1,  3]# 重新拟合模型
predictions = {}
mse_scores = {}
r2_scores = {}
fit_expressions = {}# 遍历每种模型
for degree, model_name in zip(degrees, models.keys()):poly = PolynomialFeatures(degree=degree)X_poly = poly.fit_transform(months.reshape(-1, 1))# 拟合模型models[model_name].fit(X_poly, y)# 进行预测y_pred = models[model_name].predict(X_poly)predictions[model_name] = y_predmse_scores[model_name] = mean_squared_error(y, y_pred)r2_scores[model_name] = r2_score(y, y_pred)# 提取拟合表达式coefficients = models[model_name].coef_intercept = models[model_name].intercept_fit_expression = f"y = {intercept:.2f}"for i, coef in enumerate(coefficients[::-1]):fit_expression += f" + {coef:.2f} * x{'^' + str(i+1) if i > 0 else ''}"fit_expressions[model_name] = fit_expression# 重新拟合指数模型
def exponential_func(x, a, b):return a * np.exp(b * x)params_exp, _ = curve_fit(exponential_func, months, y, p0=(1, 0.01))
y_exp_pred = exponential_func(months, *params_exp)
predictions["Exponential指数"] = y_exp_pred
mse_scores["Exponential指数"] = mean_squared_error(y, y_exp_pred)
r2_scores["Exponential指数"] = r2_score(y, y_exp_pred)
fit_expressions["Exponential指数"] = f"y = {params_exp[0]:.2f} * exp({params_exp[1]:.2f} * x)"# 重新拟合高斯模型
def gaussian_func(x, a, mu, sigma):return a * np.exp(-((x - mu)**2) / (2 * sigma**2))try:params_gauss, _ = curve_fit(gaussian_func, months, y, p0=(max(y), np.mean(months), 10), maxfev=10000, bounds=(0, [np.inf, np.inf, np.inf]))y_gauss_pred = gaussian_func(months, *params_gauss)predictions["Gaussian高斯"] = y_gauss_predmse_scores["Gaussian高斯"] = mean_squared_error(y, y_gauss_pred)r2_scores["Gaussian高斯"] = r2_score(y, y_gauss_pred)fit_expressions["Gaussian高斯"] = f"y = {params_gauss[0]:.2f} * exp(-((x - {params_gauss[1]:.2f})^2) / (2 * {params_gauss[2]:.2f}^2))"
except RuntimeError as e:print("Gaussian fitting failed:", e)# 可视化结果,设置字体为微软雅黑
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams.update({'font.size': 24})  # 设置全局字体大小# 创建一个图表和子图布局
fig, axs = plt.subplots(2, 2, figsize=(30, 16))# 用于存储所有模型名称的列表
all_model_names = list(predictions.keys())# 遍历每个子图和模型
for ax, model_name in zip(axs.flatten(), all_model_names):ax.plot(months, y, color='blue', label='观测值', marker='o', linestyle='-')ax.plot(months, predictions[model_name], label=f'{model_name} Fit', linewidth=2)ax.set_title(f'{model_name}拟合', fontsize=42)ax.set_xlabel('月份', fontsize=26)ax.set_ylabel('观测值', fontsize=26)ax.legend()ax.grid()# 在子图上添加文本框以显示模型的信息ax.text(0.05, .7, f"{model_name} (MSE:{mse_scores[model_name]:.2f}, R^2: {r2_scores[model_name]:.2f})\n{fit_expressions[model_name]}", transform=ax.transAxes, verticalalignment='top', horizontalalignment='left', color='black')
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.2, hspace=0.4)plt.tight_layout()
plt.savefig('拟合对比-分开.jpg')
plt.show()# 获取最佳拟合
best_model_name = max(r2_scores, key=r2_scores.get)  # 获取R^2分数最高的模型名称# 创建一个新图来显示所有模型的拟合结果
plt.figure(figsize=(15, 10))
plt.plot(months, y, color='blue', label='观测值', marker='o', linestyle='-')
for model_name in all_model_names:plt.plot(months, predictions[model_name], label=f'{model_name} Fit', linewidth=2)plt.title('不同拟合方式对比', fontsize=42)
plt.xlabel('月份', fontsize=26)
plt.ylabel('观测值', fontsize=26)
plt.legend()
plt.grid()# 在图表上添加文本框以显示最佳拟合模型的信息
plt.text(0.21, 0.14, f"最佳拟合模型(R^2最高):\n{best_model_name} (MSE:{mse_scores[best_model_name]:.2f}, R^2: {r2_scores[best_model_name]:.2f})\n{fit_expressions[best_model_name]}", transform=plt.gca().transAxes, verticalalignment='top', horizontalalignment='left', color='black')# 通过print输出其他模型的信息
text_str = "五种拟合对比:\n"
for idx, model_name in enumerate(all_model_names):text_str += f"{idx+1}.{model_name} (MSE:{mse_scores[model_name]:.2f}, R^2: {r2_scores[model_name]:.2f}):\n {fit_expressions[model_name]}\n"
print(text_str)plt.savefig('拟合对比.jpg')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/428981.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安捷伦Agilent/keysight 53220A参数资料 通用频率计 计数器

Agilent 53220A,Keysight 53220A,通用频率计数器/计时器,350 MHz,12 位,100 ps 53220A 350 MHz 通用频率计数器/计时器是一款双通道频率计数器,能够执行所需的全部频率和时间间隔测量。它可以添加可选的射…

Linux--守护进程与会话

进程组 概念 进程组就是一个或多个进程的集合。 一个进程组可以包含多个进程。 下面我们通过一句简单的命令行来展示: 为什么会有进程组? 批量操作:进程组允许将多个进程组织在一起,形成一个逻辑上的整体。当需要对多个进程…

【计算机网络】详解UDP套接字网络字节序IP地址端口号

一、网络字节序 我们已经知道, 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出; 接收主机把从网络上接到…

2023北华大学程序设计新生赛部分题解

时光如流水般逝去,我已在校园中奋战大二!(≧▽≦) 今天,静静回顾去年的新生赛,心中涌起无尽感慨,仿佛那段青春岁月如烟花般绚烂。✧。(≧▽≦)。✧ 青春就像一场燃烧的盛宴,激情澎湃&…

DOS(Disk Operating System,磁盘操作系统)常用指令

目录 背景: 早期探索: DOS之父: 发展历程: 常用指令: 进入命令: 操作1.进入和回退: 操作2.增、删: 操作3.其它: 总结: 背景: 早期探索: DOS(Disk Operating System,磁盘操作系统)在…

数据结构——二叉搜索树

目录 二叉搜索树 概念性质 性能分析 实现代码 前置准备 插入 查找 删除(重点) ​编辑 key和key/value的使用场景 key/value二叉搜索树代码实现 二叉搜索树 概念性质 二叉搜索树(Binary Search Tree,简称BST&#xff0…

主流卷积神经网络CNN总结

ResNet(2015)残差神经网络 残差结构 ResNet50具体卷积结构图 ResNeXt(2016)加入了分组卷积的思想,将原ResNet网络中的block替换成由group分组的block,两者得到的feature map一致,只是参数量更少…

2024年华为杯-研赛F题论文问题一二讲解+代码分享

X射线脉冲星光子到达时间建模 摘要 脉冲星是一类高速自转的中子星,其自转形成规律性脉冲信号,类似于“宇宙中的灯塔”,因此被认为是极为精确的时钟。X射线脉冲星导航利用脉冲星信号为航天器提供时间和空间参考。通过比较脉冲信号到达航天器…

Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象

Vue3.0组合式API系列文章: 《Vue3.0组合式API:setup()函数》 《Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象》 《Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器》 《Vue3.0组合式API&…

内网渗透之中间人欺骗攻击-ARP攻击

ARP攻击 ARP协议简介 ARP全称为Address Resolution Protocol,即地址解析协议,它是一个根据IP地址获取物理地址的TCP/IP协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定…

动态线程池(五)

动态线程池 Filter过滤器 AlarmBaseFilter NoticeBaseFilter NotifyRedisTateLimiterFilter RedisRateLimiter redis限流器 NotifierHandler DtpNotifier动态线程池通知者 Notifier通知者 关于发送Email消息的额外说明

【Java集合】深入了解ArrayList实现原理

概述 1.数据存储是基于动态数组实现的,默认初始容量为10。 2.添加数据时,首先需要检查元素个数是否超过数组容量,如果超过了则需要对数组进行扩容(1.5倍);插入数据时,需要将从插入点 k 开始到数…

4.接口测试基础(Jmter工具/场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同)

一、场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同 1.什么是测试片段? 1)就相当于只是项目的一部分用例,不能单独运行,必须要和控制器(include,模块)一…

河鱼浏览器——您的电商多店管理专家,轻松应对拼多多20+店铺登录挑战

在电商领域驰骋,每一个店铺都是您商业版图的一部分,但同时管理多个拼多多店铺,尤其是超过20个,是否让您感到力不从心?河鱼浏览器,专为电商精英打造的高效管理工具,为您化解这一难题。 **多开无…

JVM 一个对象是否已经死亡?

目录 前言 引用计数法 可达性分析法 引用 finalize() 方法区回收 前言 虚拟机中垃圾回收器是掌握对象生死的判官, 只要是垃圾回收器认为需要被回收的, 那么这个对象基本可以宣告"死亡". 但是也不是所有的对象, 都需要被回收, 因此, 我们在学习垃圾回收的时候…

Qt开发技巧(四)“tr“使用,时间类使用,Qt容器取值,类对象的删除,QPainter画家类,QString的转换,用好 QVariant类型

继续讲一些Qt技巧操作 1.非必要不用"tr" 如果程序运行场景确定是某一固定语言,就不需要用tr,"tr"之主要针对多语种翻译的,因为tr的本意是包含英文,然后翻译到其他语言比如中文,不要滥用tr,如果没有…

万字长文——ConvNeXt(2022CVPR),卷积网络的顶峰之作,在Transformer盛行的当下,卷积网络还能再战!

ConvNext:A ConvNet for the 2020s ConvNext:2020 年代的卷积神经网络 论文地址: https://arxiv.org/pdf/2201.03545 自从Transformer成功应用在视觉领域并且取得显著成绩后,很多人开始抛弃卷积网络架构,转而使用Transformer。然而有的大佬不认为卷积过时了,于是有了这篇…

OpenGL渲染管线(Rendering Pipeline)介绍

渲染管线 计算机图形学中,计算机图形管线(渲染管线 或简称 图形管线、流水线)是一个概念模型,它描述了t图像系统将 3D场景渲染到2D屏幕所需执行的一系列步骤。渲染管线大的可以分为三个阶段。 (一)应用阶段…

Web接入Sonic平台之安装

问题及解决方案 1.安装python的airtest-bdd依赖时报错,显示无法编译psutil note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for psutil Failed to build psutil ERROR: ERROR: Failed to b…

Android SystemUI组件(07)锁屏KeyguardViewMediator分析

该系列文章总纲链接:专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明: 说明:本章节持续迭代之前章节的思维导图,主要关注左侧上方锁屏分析部分即可。 为了更好理解本文的内容,优先说明下SystemUI中与Ke…