用Python实现时间序列模型实战——Day 24: 时间序列中的贝叶斯方法

一、学习内容
1. 贝叶斯时间序列分析的基本概念

贝叶斯方法基于贝叶斯统计,通过对数据的先验分布和似然函数进行推断,更新为后验分布。贝叶斯时间序列分析使用贝叶斯推断处理时间序列中的不确定性,适合处理复杂、不确定性高的时间序列问题。

贝叶斯时间序列模型能够自然地融合不同的信息源,并对不确定性进行定量描述。贝叶斯结构时间序列模型 (BSTS) 是一种常见的贝叶斯时间序列模型,它结合了状态空间模型和贝叶斯推断来进行建模和预测。

2. 基于贝叶斯推断的时间序列模型

贝叶斯时间序列模型的基本过程是通过先验分布、似然函数和后验分布来进行推断。常见的贝叶斯时间序列模型包括:

  • BSTS(贝叶斯结构时间序列):适合处理带有趋势、季节性、回归等特征的时间序列。
  • 贝叶斯动态线性模型(Bayesian Dynamic Linear Model, DLM):适用于随时间变化的线性动态系统。
3. 时间序列中的不确定性处理与预测

贝叶斯方法的一个优势是能够很好地处理不确定性,并通过后验分布的预测结果,给出预测的置信区间。在时间序列预测中,可以通过预测的后验分布来量化预测的不确定性。

二、实战案例

面是使用 PyTorchPyro 构建贝叶斯时间序列模型的代码。

import torch
import torch.nn as nn
import pyro
import pyro.distributions as dist
from pyro.infer import SVI, Trace_ELBO
from pyro.optim import Adam
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler# 1. 数据加载与预处理
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
data = pd.read_csv(url, header=0, parse_dates=['Month'], index_col='Month')# 数据标准化处理
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data[['Passengers']])# 生成滞后特征
def create_lagged_features(data, lag=1):X, y = [], []for i in range(len(data) - lag):X.append(data[i:i + lag])y.append(data[i + lag])return np.array(X), np.array(y)# 使用滞后步长为12个月的数据
lag = 12
X, y = create_lagged_features(scaled_data, lag=lag)# 划分训练集和测试集
train_size = int(len(X) * 0.8)
X_train, X_test = torch.tensor(X[:train_size], dtype=torch.float32), torch.tensor(X[train_size:], dtype=torch.float32)
y_train, y_test = torch.tensor(y[:train_size], dtype=torch.float32), torch.tensor(y[train_size:], dtype=torch.float32)# 2. PyTorch 模型
class BayesianLSTM(nn.Module):def __init__(self, input_size, hidden_size):super(BayesianLSTM, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, 1)def forward(self, x):lstm_out, _ = self.lstm(x)output = self.fc(lstm_out[:, -1, :])return output# 3. Pyro 模型定义
def model(x_data, y_data=None):# 定义先验分布hidden_size = 50input_size = x_data.shape[-1]# 权重的先验分布lstm_weight_prior = dist.Normal(torch.zeros(hidden_size, input_size), torch.ones(hidden_size, input_size))lstm_bias_prior = dist.Normal(torch.zeros(hidden_size), torch.ones(hidden_size))# 全连接层的权重与偏置的先验fc_weight_prior = dist.Normal(torch.zeros(1, hidden_size), torch.ones(1, hidden_size))fc_bias_prior = dist.Normal(torch.zeros(1), torch.ones(1))# 定义 Pyro 参数priors = {'lstm.weight_ih_l0': lstm_weight_prior,'lstm.bias_ih_l0': lstm_bias_prior,'fc.weight': fc_weight_prior,'fc.bias': fc_bias_prior}# 使用 Pyro 模型bayesian_lstm = pyro.module('bayesian_lstm', BayesianLSTM(input_size, hidden_size))# 预测prediction = bayesian_lstm(x_data)# 似然函数with pyro.plate('data', len(x_data)):likelihood = dist.Normal(prediction, torch.tensor(0.1))obs = likelihood.log_prob(y_data) if y_data is not None else likelihoodreturn obs# 4. 损失函数和优化器
def guide(x_data, y_data=None):# 引导函数用于推断模型参数pyro.module('bayesian_lstm', BayesianLSTM(input_size=X_train.shape[-1], hidden_size=50))# 使用 SVI 进行推断
optim = Adam({"lr": 0.01})
svi = SVI(model, guide, optim, loss=Trace_ELBO())# 5. 模型训练
num_iterations = 1000
losses = []
for epoch in range(num_iterations):loss = svi.step(X_train, y_train)losses.append(loss)if epoch % 100 == 0:print(f"Epoch {epoch}, Loss: {loss}")# 6. 模型预测
bayesian_lstm = BayesianLSTM(input_size=X_train.shape[-1], hidden_size=50)
bayesian_lstm.eval()
y_pred = bayesian_lstm(X_test).detach().numpy()# 还原到原始数据尺度
y_test_rescaled = scaler.inverse_transform(y_test)
y_pred_rescaled = scaler.inverse_transform(y_pred)# 7. 结果可视化
plt.figure(figsize=(12, 6))
plt.plot(data.index[-len(y_test):], y_test_rescaled, label='Actual Passengers')
plt.plot(data.index[-len(y_test):], y_pred_rescaled, label='Predicted Passengers', color='green')
plt.title('Bayesian Time Series Predictions with Pyro')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()
三、代码解释
3.1 数据预处理
  • 使用航空乘客数据集,并进行标准化处理。通过滞后步长为12的方式生成特征和目标值,并将数据集划分为训练集和测试集。
3.2 贝叶斯模型定义
  • 使用 Pyro 库定义了一个贝叶斯 LSTM 模型。模型的权重和偏置采用正态分布作为先验,模型使用 LSTM 进行序列建模,并通过贝叶斯推断学习参数。
3.3 模型训练
  • 使用 SVI (Stochastic Variational Inference) 进行贝叶斯推断,使用 Trace_ELBO 作为损失函数来优化模型。
3.4 模型预测与可视化
  • 使用训练好的贝叶斯模型对测试集进行预测,并将预测结果与真实数据进行对比,通过图形可视化结果。
四、结果输出

五、结果分析
5.1 预测结果
  • 贝叶斯 LSTM 模型可以对时间序列数据进行预测,并对结果进行不确定性量化。
  • 由于我们使用了贝叶斯推断,预测结果能够根据数据的变化动态调整。
5.2 不确定性处理
  • 在未来预测中,通过使用贝叶斯推断,能够更好地量化预测的不确定性。
六、总结

本次案例中,我们使用 PyroPyTorch 构建了贝叶斯时间序列模型,通过贝叶斯推断进行了 LSTM 参数的学习与优化。通过此方法,我们能够为时间序列任务提供具有不确定性估计的预测结果。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【RabbitMQ】可靠性传输

概述 作为消息中间件来说,最重要的任务就是收发消息。因此我们在收发消息的过程中,就要考虑消息是否会丢失的问题。结果是必然的,假设我们没有采取任何措施,那么消息一定会丢失。对于一些不那么重要的业务来说,消息丢失…

中秋佳节,月圆人团圆

文章目录 历史和文化起源与演变文化内涵习俗与活动 军事中秋节的军事背景中秋节的军事象征现代军营中的中秋节 月圆之夜,共赏婵娟传统文化,薪火相传团圆时刻,温馨满溢展望未来,祈愿美好 在这个金秋送爽、丹桂飘香的季节里&#xf…

web基础—dvwa靶场(五)File Upload

File Upload(文件上传) 上传的文件对 web 应用程序来说是一个巨大的风险,许多攻击的第一步是上传攻击代码到被攻击的系统上,然后攻击者只需要找到方法来执行代码即可完成攻击。也就是是说,文件上传是攻击者需要完成的第一步。 不受限制的文件…

Java或者前端 实现中文排序(调API的Demo)

目录 前言1. 前端2. Java 前言 前端 Vue 中的中文排序通常使用 JavaScript 提供的 localeCompare 方法来比较中文字符串 Java 后端可以使用 Collator 类来实现中文排序 1. 前端 在 Vue 中&#xff0c;使用 localeCompare 来实现中文字符串的排序&#xff1a; <template&…

如何在webots中搭建一个履带机器人

前期准备 下载webotswebots基本知识 a. 官方文档:Webots documentation: Track b. B站教程:webots-超详细入门教程(2020)_哔哩哔哩_bilibili搭建流程 搭建履带机器人主要使用到了webots中的track节点,这个节点是专门用来定义履带的相关属性,模拟履带运动的 首先,创建一个…

软考高级:嵌入式-嵌入式实时操作系统调度算法 AI 解读

讲解 嵌入式实时操作系统中的调度算法主要用于管理任务的执行顺序&#xff0c;以确保任务能够在规定时间内完成。针对你提到的几种调度算法&#xff0c;我会逐一进行通俗解释。 生活化例子 假设你在家里举办一个家庭聚会&#xff0c;家里人轮流使用一个游戏机玩游戏。你作为…

实例讲解使用Matlab_Simulink整车模型进行车速控制策略仿真测试验证方法

在进行VCU软件开发过程中&#xff0c;经常要设置一些扭矩控制相关的参数&#xff0c;一般可以通过经验先设置一版参数&#xff0c;然后通过与整车模型的联合仿真及实车标定优化相关参数&#xff0c;最终得到一版综合性能最优的参数作为最终程序定版参数。本文通过蠕行扭矩控制模…

C++八股文之STL篇

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 思维导图链接&#xff1a;STL 持续更新中…… &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64…

[Python]一、Python基础编程

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程 1. Python简介 Python优点: 学习成本低开源适应人群广泛应用领域广泛1.1 Python解释器 下载地址:Download Python | Python.org 1.2 Python开发IDE -- Pycharm 2. 基础语法…

数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2

功能实现 ‍ 规则转换为 SQL 片段‍ 规则解析 首先我们来构造一个典型的规则&#xff0c;包括两个条件组&#xff0c;每个组由两个条件组成&#xff0c;由且与或两种逻辑关系&#xff0c;如下图&#xff1a; 然后看看生成的规则&#xff0c;如下&#xff1a; {"filt…

合宙Air201模组LuatOS:PWRKEY控制,一键解决解决关机难问题

不知不觉间&#xff0c;我们已经发布拉期课程&#xff1a;hello world初体验&#xff0c;点灯、远程控制、定位和扩展功能&#xff0c;你学的怎么样&#xff1f;很多伙伴表示已经有点上瘾啦&#xff01;合宙Air201&#xff0c;如同我们一路升级打怪的得力法器&#xff0c;让开发…

计算机的错误计算(九十六)

摘要 探讨 的计算精度问题。 计算机的错误计算&#xff08;五十五&#xff09;与&#xff08;七十八&#xff09;分别列出了 IEEE 754-2019 中的一些函数与运算。下面再截图给出其另外3个运算。 例1. 已知 x-0.9999999999966 . 计算 不妨在Python下计算&#xff0c;则有&am…

10 - UDP实验

在本章节中&#xff0c;我们将采用 network 与 socket 这两个第三方库来构建UDP网络连接的功能。具体而言&#xff0c;network 库将被应用于WiFi连接的建立&#xff0c;而 socket 库则基于 lwIP 协议栈来实现网络协议的连接。在实验环节&#xff0c;我们将利用 ESP32 开发板与远…

【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

FL Studio 24.1.1.4285中文完整版新功能介绍及百度网盘下载

‌FL Studio 24‌版本引入了多项新功能和改进&#xff0c;旨在提升用户体验和工作效率&#xff0c;同时保持其强大的功能和灵活性。以下是一些主要的新功能&#xff1a; ‌CLAP插件支持‌&#xff1a;FL Studio 24支持Clever Audio Plug-in (CLAP)插件&#xff0c;这扩展了软件…

认知小文3《打破桎梏,编程与人生的基本法则》

内容摘要&#xff1a; 面对挑战&#xff0c;编程起步艰难但必经磨砺。每周深耕Python&#xff0c;实战项目巩固技能。财务需努力与实战结合&#xff0c;构建坚实基础。规划先行&#xff0c;先进知识助力专家之路。认知升级阅读与多元资源&#xff0c;拓宽视野。价值积累靠专业证…

25届校招IQCAT思维能力自适应测验智鼎测评指南:题库获取、刷题策略与真题解析!

IQCAT思维能力自适应测验考试内容介绍 IOCAT思维能力自适应测验基于二因素智力理论&#xff0c;通过考察作答者的一般认知能力&#xff0c;预测其学习新知识、新技能以及理解、解决问题时的工作表现。IQCAT使用自适应测验技术&#xff0c;根据作答者的作答情况&#xff0c;从题…

8.Lab Sevent —— Multithreading

首先切换到thread分支 git checkout thread make clean Uthread&#xff1a;switch between threads 为用户级线程系统设计上下文切换机制 xv6中已经放了两个文件&#xff1a; user/uthread.c和user/uthread_switch.S 以及一个规则&#xff1a;运行在Makefile中以构建uthre…

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法 Text-to-SQL 任务旨在将自然语言查询转换为结构化查询语言(SQL),从而使非专业用户能够便捷地访问和操作数据库。近期,阿里云的 OpenSearch 引擎凭借其一致性对齐技术,在当前极具影响力的 Text-to-SQL 任务…

【C++前后缀分解】1888. 使二进制字符串字符交替的最少反转次数|2005

本文涉及知识点 C前后缀分解 LeetCode1888. 使二进制字符串字符交替的最少反转次数 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符…