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

广义加性模型

3. 广义加性模型 (Generalized Additive Model, GAM)

广义加性模型可以视为线性和非线性回归的折中,适合捕捉非线性但“接近线性”的趋势。它允许将回归结果视为线性和非线性成分的叠加。

在 GAM 中,可以将响应变量 y y y 表示为不同特征 x x x 的加性组合:
y = β 0 + f ( x ) + ϵ y = \beta_0 + f(x) + \epsilon y=β0+f(x)+ϵ
其中 f ( x ) f(x) f(x) 可以是一个平滑函数(例如 B样条函数),它在整体上保持趋势为“直线”,但允许局部轻微弯曲。

  • 优点:能捕捉微弱的非线性趋势,同时保持模型解释性。
  • 缺点:模型稍复杂,且构建和调参需要一些经验。

广义加性模型(Generalized Additive Model, GAM)是一种灵活的回归方法,用于捕捉数据的非线性关系。GAM 在每个特征上使用平滑函数,从而可以适应复杂的非线性数据。我们可以使用 pyGAM 库来实现 GAM 回归,并绘制数据散点、回归曲线以及置信区间。

以下是使用 GAM 的 Python 代码示例。请确保安装 pyGAM 库:

pip install pygam

代码示例

import numpy as np
import matplotlib.pyplot as plt
from pygam import LinearGAM, s
from sklearn.utils import resample# 生成带有非线性趋势的样本数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.sin(x) + 0.5 * x + np.random.normal(0, 0.3, x.shape)# 重新调整形状以适应 pyGAM 的输入格式
X = x[:, np.newaxis]# 使用 pyGAM 构建和拟合 GAM 模型
gam = LinearGAM(s(0))  # s(0) 表示对第一个特征使用平滑样条
gam.gridsearch(X, y)# 预测和计算置信区间
XX = np.linspace(0, 10, 100)
y_pred = gam.predict(XX)
confidence_interval = gam.prediction_intervals(XX, width=0.95)  # 95% 置信区间# 绘制散点图、回归曲线和置信区间
plt.figure(figsize=(10, 6))
plt.scatter(x, y, color='gray', label='Data Points')
plt.plot(XX, y_pred, color='blue', label='GAM Regression')
plt.fill_between(XX, confidence_interval[:, 0], confidence_interval[:, 1], color='lightblue', alpha=0.5, label='95% Confidence Interval')
plt.xlabel('x')
plt.ylabel('y')
plt.title('GAM Regression with 95% Confidence Interval')
plt.legend()
plt.show()

代码说明

  1. 数据生成:创建带有非线性趋势的数据集 y = sin ⁡ ( x ) + 0.5 × x + noise y = \sin(x) + 0.5 \times x + \text{noise} y=sin(x)+0.5×x+noise
  2. 构建 GAM 模型:使用 pyGAM 库的 LinearGAM 类构建 GAM 模型,并使用 s(0) 表示对第一个特征使用平滑样条函数。
  3. 模型拟合与网格搜索:使用 gridsearch 方法来自动选择最佳平滑度参数。
  4. 预测和置信区间计算:使用 prediction_intervals 方法计算 95% 置信区间。
  5. 绘图:绘制数据点、GAM 回归曲线和置信区间。

输出图形

在这里插入图片描述
在这里插入图片描述

运行此代码后将生成以下内容:

  • 灰色散点图:显示数据的原始分布。
  • 蓝色 GAM 回归曲线:GAM 模型的拟合曲线,反映数据的非线性趋势。
  • 淡蓝色的置信区间:展示 95% 置信区间,反映了模型对不同 x 值的置信范围。

http://www.mrgr.cn/news/64122.html

相关文章:

  • TCP 和 UDP 的区别:解析网络传输协议
  • 接口文档都需要关注哪些?
  • 电子应用设计方案75:智能家庭智能锁系统设计
  • #渗透测试#漏洞挖掘#红蓝攻防#常见未授权访问漏洞汇总
  • select2 下拉框回显问题 树形菜单 部门结构的
  • 谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持
  • 短剧开发新模式:从内容创新到市场突围的全攻略
  • 仅需百元/年,助你快速构建高效私有的Node.js图床
  • Yocto中MACHINE 和 DISTRO是输入,IMAGE 是他们组合的产物
  • 华为云安装docker
  • Docker — 跨平台和环境部署
  • Linux:防火墙和selinux对服务的影响
  • docker复现pytorch_cyclegan
  • 【C/C++】字符/字符串函数(0)——由ctype.h提供
  • Linux云计算 |【第五阶段】CLOUD-DAY8
  • 前端将网页转换为pdf并支持下载与上传
  • 我的作品·导航
  • Java复习29(PTA)
  • SpringBoot+FileBeat+ELK8.x版本收集日志
  • java基础知识面试题四多线程
  • 手写实现call,apply,和bind方法
  • 【MATLAB代码】三个CT模型的IMM例程,各CT旋转速率不同,适用于定位、导航、目标跟踪
  • 2024阿里云CTF Web writeup
  • 房贷利率定价调整机制变更的一点理解
  • Linux 进程终止 进程等待
  • 面试必会50题