python:绘制GAM非线性回归散点图和拟合曲线
作者:CSDN @ _养乐多_
本文将介绍使用python语言绘制广义线性模型(Generalized Additive Model,GAM)非线性回归散点图和拟合曲线。并记录了计算RMSE、ubRMSE、R2、Bias的代码。

文章目录
- 一、GAM非线性回归详解
- 二、代码
- 三、计算RMSE、ubRMSE、R2、Bias
一、GAM非线性回归详解
GAM(Generalized Additive Model)是一种用于非线性回归和分类的灵活的统计模型。它是广义线性模型(GLM)的扩展,可以对各种类型的非线性关系进行建模。
在 GAM 中,目标变量被假设为由一组平滑函数的线性组合和一个可能的链接函数组成。这些平滑函数可以捕捉到自变量与因变量之间的非线性关系。通过将每个自变量与一个或多个平滑函数相关联,GAM 可以灵活地建模各种非线性关系。
GAM 的一般形式可以表示为:
y = f 1 ( x 1 ) + f 2 ( x 2 ) + . . . + f p ( x p ) + ε y = f1(x1) + f2(x2) + ... + fp(xp) + ε y=f1(x1)+f2(x2)+...+fp(xp)+ε
其中,y 是目标变量,x1, x2, …, xp 是自变量,f1, f2, …, fp 是平滑函数,ε 是误差项。
在 GAM 中,常用的平滑函数有样条函数(spline function)、自然样条函数(natural spline function)、局部样条函数(local spline function)等。这些平滑函数可以对数据进行光滑处理,从而更好地捕捉变量之间的非线性关系。
GAM 的建模过程通常涉及以下步骤:
-
准备数据:包括获取自变量和目标变量的数据,并进行必要的数据预处理。
-
选择平滑函数:根据自变量的特点和非线性关系的假设,选择适当的平滑函数。常用的选择包括样条函数、自然样条函数等。
-
拟合 GAM 模型:将自变量和平滑函数结合,拟合 GAM 模型。拟合过程可以使用最小二乘估计、广义最小二乘估计等方法进行。
-
模型评估:评估拟合的 GAM 模型的性能,包括检查模型的拟合优度、残差分析等。
-
预测和推断:使用训练好的 GAM 模型进行预测,并进行推断分析。
GAM 具有许多优点,包括:
-
灵活性:GAM 可以灵活地建模各种非线性关系,适用于各种复杂的数据模式。
-
可解释性:由于每个自变量与一个平滑函数相关联,GAM 的结果可以很好地解释自变量与目标变量之间的关系。
-
鲁棒性:GAM 对异常值和噪声具有一定的鲁棒性。
-
自动特征选择:GAM 可以通过平滑函数的选择来自动选择与目标变量相关的自变量。
然而,GAM 也存在一些限制和注意事项:
-
平滑函数的选择:选择适当的平滑函数是关键步骤之一,需要根据数据的特点和研究问题进行合理选择。
-
多重比较问题:在使用多个平滑函数进行建模时,需要进行多重比较校正,以避免估计的平滑函数数量过多导致的误差增加。
-
计算复杂度:与线性模型相比,GAM 的计算复杂度较高,特别是在处理大规模数据集时。
总体而言,GAM 是一种强大的非线性建模工具,可以帮助我们更好地理解数据中的非线性关系。通过合理选择平滑函数并进行适当的模型评估,可以在实际问题中应用 GAM 进行预测和推断分析。
二、代码
import numpy as np
import matplotlib.pyplot as plt
from pygam import LinearGAM, s, f# 生成模拟数据
np.random.seed(42)
n = 100
X = np.linspace(0, 10, n)
y = np.sin(X) + np.random.normal(0, 0.1, n)# 拟合 GAM 模型
gam = LinearGAM(s(0)).fit(X, y)# 绘制相关性图
fig, axs = plt.subplots(1, 1, figsize=(8, 6))
XX = gam.generate_X_grid(term=0, n=100)
pdep, confi = gam.partial_dependence(term=0, X=XX, width=0.95)
axs.plot(XX[:, 0], pdep, color='blue', label='Partial Dependence')
axs.fill_between(XX[:, 0], confi[:, 0], confi[:, 1], color='blue', alpha=0.3)
axs.scatter(X, y, color='black', alpha=0.5, label='Data')
axs.set_xlabel('X', fontsize=12)
axs.set_ylabel('y', fontsize=12)
axs.set_title('Correlation Plot - GAM', fontsize=14)
axs.legend()plt.tight_layout()
plt.show()
三、计算RMSE、ubRMSE、R2、Bias
import numpy as np
import matplotlib.pyplot as plt
from pygam import LinearGAM, s, f
from sklearn.metrics import mean_squared_error, r2_score
from scipy.stats import linregress# 生成模拟数据
np.random.seed(42)
n = 100
X = np.linspace(0, 10, n)
y = np.sin(X) + np.random.normal(0, 0.1, n)# 拟合 GAM 模型
gam = LinearGAM(s(0)).fit(X, y)# 绘制相关性图
fig, axs = plt.subplots(1, 1, figsize=(8, 6))
XX = gam.generate_X_grid(term=0, n=100).flatten()
print(len(XX))y_true, y_pred = y, XX
# 计算 RMSE
rmse = np.sqrt(mean_squared_error(y_true, y_pred))# 计算 R2
r2 = r2_score(y_true, y_pred)# 计算 Bias
bias = np.mean(y_pred - y_true)# 计算 ubRMSE
slope, intercept, _, _, _ = linregress(y_pred, y_true)
ubrmse = np.sqrt(np.mean((y_true - (intercept + slope * y_pred))**2))pdep, confi = gam.partial_dependence(term=0, X=XX, width=0.95)
axs.plot(XX[:], pdep, color='blue', label='Partial Dependence')
axs.fill_between(XX[:], confi[:, 0], confi[:, 1], color='blue', alpha=0.3)
axs.scatter(X, y, color='black', alpha=0.5, label='Data')
axs.set_xlabel('X', fontsize=12)
axs.set_ylabel('y', fontsize=12)
axs.set_title('Correlation Plot - GAM', fontsize=14)
axs.legend()# 将指标写入图形
textstr = f'RMSE = {rmse:.4f}\nR2 = {r2:.4f}\nBias = {bias:.4f}\nubRMSE = {ubrmse:.4f}'
props = dict(boxstyle='round', facecolor='white', alpha=0.5)
# 'top', 'bottom', 'center', 'baseline', 'center_baseline'
axs.text(0.05, 0.95, textstr, transform=axs.transAxes, fontsize=12,verticalalignment='center_baseline', bbox=props)plt.tight_layout()
plt.show()
声明:
本人作为一名作者,非常重视自己的作品和知识产权。在此声明,本人的所有原创文章均受版权法保护,未经本人授权,任何人不得擅自公开发布。
本人的文章已经在一些知名平台进行了付费发布,希望各位读者能够尊重知识产权,不要进行侵权行为。任何未经本人授权而将付费文章免费或者付费(包含商用)发布在互联网上的行为,都将视为侵犯本人的版权,本人保留追究法律责任的权利。
谢谢各位读者对本人文章的关注和支持!
相关文章:
python:绘制GAM非线性回归散点图和拟合曲线
作者:CSDN _养乐多_ 本文将介绍使用python语言绘制广义线性模型(Generalized Additive Model,GAM)非线性回归散点图和拟合曲线。并记录了计算RMSE、ubRMSE、R2、Bias的代码。 文章目录 一、GAM非线性回归详解二、代码三、计算RM…...
每日算法(第十四期)
儿童节了也要好好学习鸭。 先来回顾一下上期的问题及答案: 「反转链表」(Reverse Linked List)。 题目描述: 反转一个单链表。 以下是对应的JavaScript实现: function reverseList(head) {let prev null;let curr he…...
uboot的使用
目录 串口调试 1.uboot模式 自启动模式: 交互模式 2.uboot帮助命令 3.uboot环境变量 4.uboot常用环境变量 5.uboot网络传输命令 6.uboot存储器访问命令 7.uboot自启动环境变量 串口调试 1.串口连接开发板,通过 "设备管理器" 获取对…...
学习HCIP的day.09
目录 一、BGP:边界网关路由协议 二、BGP特点: 三、BGP数据包 四、BGP的工作过程 五、名词注解 六、BGP的路由黑洞 七、BGP的防环机制—水平分割 八、BGP的基本配置 一、BGP:边界网关路由协议 是一种动态路由协议,且是…...
Electron-Builder Windows系统代码签名
前言 项目打包签名是两年前做的了,使用Electron-Bulder,打包工具版本迭代较少,倒是electron版本更新飞快,目前官方推荐使用Electron Forge进行打包,后续再对两者进行对比,重新整理现在的实现方案。 签名简…...
数据分析概述
数据分析概述 数据的性质数据的概念数据与信息的区别和联系 数据的类型按照度量尺度分按时间状况分 什么是数据分析数据分析的重要性数据分析的内容数据分析作用 数据分析的基本流程典型的数据分析的流程 数据分析方法对比分析法分组分析法定量数据分布分析——具体事例 结构分…...
网络编程初识
如果这篇有没接触过的知识点,请转到网络编程先导知识_小梁今天敲代码了吗的博客-CSDN博客 目录 IPv4和IPv6的概念: 子网掩码 默认网关 ping命令 端口 OSI网络分层模型 TCP/IP四层模型 字节序转换函数 IP地址转换 上一篇介绍了网络编程的先导知…...
软考A计划-试题模拟含答案解析-卷十二
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...
I.MX RT1170加密启动详解(1):Encrypted Boot image组成
使用RT1170芯片构建的所有平台一般都是高端场合,我们需要考虑软件的安全需求。该芯片集成了一系列安全功能。这些特性中的大多数提供针对特定类型攻击的保护,并且可以根据所需的保护程度配置为不同的级别。这些特性可以协同工作,也可以独立工…...
Linux---用户切换命令(su命令、sudo命令、exit命令)
1. su命令 root用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的。 普通用户的权限,一般在其HOME目录内是不受限的。 一旦出了HOME目录,大多数地方,普通用户仅有只读和执行权限,无修改权限。 su 是…...
手机图片怎么提取文字?高效渠道一览
随着智能手机的普及,我们现在可以随时随地使用手机拍照记录生活中的点滴。然而,有时候我们拍照之后可能需要提取图片中的文字,比如拍下的菜谱、公告、名片等等。这时,我们就需要使用手机图片提取文字的功能。 - 采用OCR技术拍照识…...
Elasticsearch 聚合数据结果不精确问题解决方案
Elasticsearch 聚合数据结果不精确 背景 近期我们项目中出现使用ES聚合某个索引的数据取TOP 10的数据和相同条件下查询所有数据然后按数据量排序取的TOP 10的数据不一致的问题。 下面我们简单分析一下这个问题,列出一些常见的解决方案。 问题 Elasticsearch分片…...
Qt经典面试题:Qt开启线程的几种方式
方法一:从QThread类派生 ①创建一个类从QThread类派生 ②在子线程类中重写 run 函数, 将处理操作写入该函数中 ③在主线程中创建子线程对象, 启动子线程,调用start()函数 这种方法涉及到创建一个从QThread类派生的子类,并在该子类中重写run()函数。处理操…...
使用chartgtp写Android代码
<LinearLayout android:layout_width"match_parent" android:layout_height"match_parent" android:orientation"horizontal"> <TextView android:id"id/姓名" …...
【C++】4.jsoncpp库:jsoncpp库安装与使用入门
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍jsoncpp的使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&am…...
HTML、CSS、 JavaScript介绍(二)
CSS 指层叠样式表 (Cascading Style Sheets),CSS定义如何显示 HTML 元素。HTML 标签原本被设计为用于定义文档内容,样式表定义如何显示 HTML 元素,就像 HTML 中的字体标签和颜色属性所起的作用那样。样式通常保存在外部的 .css 文件中。我们只…...
高效益的淘客APP要怎么开发,需要哪些功能
现在各大淘客app都有移动端的app,但是一直不知道如何推广出去。客app想要赚钱,要思考怎么推广淘客app,推广适用于非常执行力的人。淘客app推广首要第一条,产品要好,app要好,返利要高,用户才会使…...
Java基础--->IO流(2)【常见IO模型】
文章目录 计算机角度IO操作系统IO常见的IO模型Java 中 3 种常见 IO 模型BIO(BlockingI/O)【同步阻塞IO】NIO(Non-blocking/New I/O)【非阻塞IO】IO多路复用AIO(Asynchronous I/O)【异步IO】 计算机角度IO 根…...
JavaScript let 和 const
在JavaScript中,let和const是用于声明变量的关键字。 let关键字用于声明一个块级作用域的变量。块级作用域是指在一个代码块(通常是在花括号 {} 内部)中声明的变量只在该代码块内部有效。例如: javascript function example() {…...
云原生下多集群的监控系统背景、架构设计与实现
随着云原生技术的普及,越来越多的企业开始采用多集群部署方案来提高系统的可用性和灵活性。在这种情况下,如何有效地监控多个集群的运行状态,成为了云原生架构下的一个重要问题。 多集群监控系统需要考虑以下几个方面的问题: 监…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
