时序分析 49 -- 贝叶斯时序预测(一)

news2024/11/27 21:00:23

贝叶斯时序预测(一)

    时序预测在统计分析和机器学习领域一直都是一个比较重要的话题。在本系列前面的文章中我们介绍了诸如ARIMA系列方法,Holt-Winter指数平滑模型等多种常用方法,实际上这些看似不同的模型和方法之间都具有千丝万缕的联系,包括我们一直没有涉及的最复杂的模型LSTM(Long Short Term Memory)。在实际的时序数据分析工作中,你会发现在通常境况下简单模型都比复杂模型更为有效。本文开始讨论另一套时序预测体系:Bayes 时序预测方法。这套方法的背后原理可以很简单,但也可以很深,我们不如从一个例子开始,先积累一些直觉和经验,后续系列会展开理论部分的讨论。

    贝叶斯时序预测通常不会预测时序点,而是给出时序点的分布,但如果希望预测时序点,你可以简单取该分布的均值或者中位数。

贝叶斯定理回顾

在这里插入图片描述
    上图展示了贝叶斯定理的基本结构,这个定理可以认为是机器学习领域最重要的定理了,个人认为没有之一。

让我们来简单回顾一下这个定理的核心内容,

  • P ( A ) P(A) P(A) ,是事件 A A A的先验概率,可以理解为在没有任何具体的数据支持下,我们对事件 A A A发生的概率的直觉,也可称为prior belief(先验信念)。先验信念表示了我们对事件 A A A发生概率的主观理解。

  • P ( B ) P(B) P(B),是事件 B B B的概率,在贝叶斯定理中一般称为边缘概率(marginal)。

  • P ( A ∣ B ) P(A|B) P(AB),是当事件 B B B发生时事件 A A A发生的条件概率,在贝叶斯定理中称为后验概率(posterior)。

  • P ( B ∣ A ) P(B|A) P(BA),适当事件 A A A发生时事件 B B B发生的条件概率,在贝叶斯定理中称为似然性(likelihood)。

        我们可以这样理解贝叶斯公式:首先定义一个我们对某个事件的主观理解的先验分布,然后通过数据和事实我们得到似然性,条件于边缘概率后得到后延概率。 通俗来说,我们对一个事情有一个信念,当我们看到与这个事情有关的数据和事实后,我们会更新这个信念。举个例子来说,例如我们有一个硬币,我们相信随机抛这个硬币,落地时正面朝上的概率时1/2。但事实上这个硬币由于制造工艺的随机性导致其正面朝上的概率为2/3,当我们做抛硬币实验时,随着我们观察到正面朝上的概率大于1/2,我们对这件事情的信念会随着事实而变化。

        关于贝叶斯定理,日后我们还会做进一步讨论,尝试从其他维度更深一步理解这个重要定理。

贝叶斯时序预测

    贝叶斯时序预测模型的一种最常用的方法称为:DGLM(Dynamic Generalized Linear Model),既动态泛化线性模型,这里

  • 动态,模型系数会随时间变化而变化。

  • 泛化,过观察的分布可以是多种分布,例如正态分布、泊松分布、伯努利分布、二项式分布等。

  • 线性,预测值既系数与预测变量的乘积的线性组合。

    此模型的关键要素为:

λ t = F t θ t \lambda_t=F_t \theta_t λt=Ftθt

  • λ t \lambda_t λt是线性预测变量

  • θ r \theta_r θr是状态向量,DGLM的系数融入到状态向量中,实际建模中此向量由一些组件组成,例如趋势、回归性、季节、节假日和特殊事件等。

  • F t F_t Ft是回归向量

        这些变量都会有对应的折现因子,折现因子是在构建模型中由我们设定的,它表示我们给当先信息和历史信息所分配的权重。

Python 简单例子

读入数据和所需包

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dt
from pybats.analysis import analysis
from pybats.point_forecast import median

df = pd.read_csv('airpassengers.csv')

# Changing the datatype
df["Month"] = pd.to_datetime(df['Month'], format='%Y-%m')

# Setting the Date as index
df = df.set_index('Month')

Y = df['#Passengers'].values

pybats为贝叶斯时许预测提供了很多参数,我们先来简单看一下

k = 1 # 向前预测一步
forecast_start = 0 # 预测从时间零点开始
forecast_end = len(df)-1 # 预测在数据最后结束

mod, samples = analysis(
    Y,
    family="poisson", # 使用泊松分布
    forecast_start=forecast_start,
    forecast_end=forecast_end,
    k=k,
    nsamps=100, # 每个月取一百个样本
    prior_length=6, # 取6个点来定义先验分布
    rho=.9, # 随机效用扩展
    deltrend=0.5, # 趋势折现因子
    delregn=0.9 # 回归折现因子
)

forecast = median(samples) # 预测

参数解释:

  • family=”possion“: 我们可尝试使用泊松分布对正整数建模;使用normal对连续实数;使用bernoulli对0-1;使用binomial对bernoulli的加总和。
  • nsamps=100:定义样本的数量,通过此样本可得到信任区间(credibale interval)和点估计(point estimate)
  • prior_length=6:构造先验分布的点的数量,这个数值越大说明使用时序开始数据来建模先验分布的观测值越多
  • rho=.9:随机效用扩展,这个参数增加了预测的波动
# Plotting
fig, ax = plt.subplots(1,1, figsize=(8, 6))   
ax = plot_data_forecast(fig, ax, Y, forecast, samples,
                        dates=df.index)
ax = ax_style(ax, ylabel='Sales', xlabel='Time',
              legend=['Forecast', 'Passengers', 'Credible Interval'])

在这里插入图片描述
注意,上图中开始的水平线表明了建立先验分布所使用的月数,所以这里没有开始预测。 可以使用analysis函数来评估预测效果和对数据的拟合程度。

就这份数据而言,看上去拟合得不错,但我们需要知道

  • 这个例子实际上不是预测,只能算是”事后诸葛亮“

  • 这个数据集实际上非常好,有比较强的趋势和季节成分
    PyBATS还有很多其他功能我们没有在这里演示,例如:

  • 增加节假日和特殊事件

  • 深一步使用DGLM

  • 使用隐含因子(latent factors),例如增加机票的平均价格来优化乘客人数的预测过程。

这只是个非常简单且不太完整的例子,如开头所言,这个例子只能给我们一些感性认识,后续笔者会分享更多关于这个主题的深层次的讨论和实践。

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

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

相关文章

SpringBoot中处理日期的两种方式(消息转换器)

在Spring Boot中,我们通常会使用Jackson来序列化和反序列化Java对象到JSON。在进行日期序列化时,我们需要指定日期格式,否则Jackson会使用默认格式,这可能不是我们想要的。要指定日期格式,有两种方式: 如果没有处理按照默认的结果如下图: 所以我们需要通过一些手段来对日期进行…

总结一下Redis的缓存雪崩、缓存击穿、缓存穿透

缓存是提高系统性能的一种常见手段,其中Redis是一种常用的高性能缓存数据库。但是在使用缓存时,可能会遇到一些问题,比如缓存击穿、缓存穿透、缓存雪崩等问题,本文将介绍这些问题的概念、原因以及解决方案。 缓存击穿 缓存击穿指…

Jenkins——用户管理、授权策略配置以及Jenkins安全配置管理

这里写目录标题一、Jenkins用户管理1、进入系统管理界面2、创建用户3、编辑用户信息4、编辑用户信息5、删除用户信息二、Jenkins授权策略配置1、授权策略插件2、安装插件:Role-based Authorization Strategy3、管理角色a、全局角色 Global rolesb、项目角色 Item rolesc、节点角…

CVPR | 达摩院开源自监督学习框架CoKe, 单机8卡可训练

团队模型、论文、博文、直播合集,点击此处浏览 一、论文 论文链接: Unsupervised Visual Representation Learning by Online Constrained K-Means 代码链接:https://github.com/idstcv/CoKe 二、背景 虽然基于instance的自监督学习方法在ImageNet上…

注册claude AI账号 slack工作区账号

Claude 是建立在 slack工作区的一个AI人工助手,更像是将chatgpt集成到了会议模式,一个账号实际上拥有了你的会议室和你的AI助手,你可以让你的朋友和同事进入你的房间体验。 Claude是不是openai的产物?目前还不知道,不…

RS232/RS485/RS422 接线说明

RS232/RS485/RS422 接线 文章目录RS232/RS485/RS422 接线RS232RS485422RS232 设备A 和 设备B 没有硬件流控 设备A设备BTXDRXDRXDTXDGNDGND 设备A 和 设备B 使用RTS/CTS 做硬件流控 一般使用RTS/CTS都会由232芯片自动控制, 比如XR21V1414, 需要设备gpio mode 为00…

Docker安装+利用docker安装MySQL(保姆级教程)

前言:本文基于docker安装MySQL,如果还没安装docker的童鞋,点击这里(超大声)安装卸载老版本docker(超详细) 一、在docker仓库搜你想要的镜像版本 docker镜像仓库 打开官网,在搜索框…

Docker 镜像制作 服务编排 私有仓库

DockerNginx部署Redis部署Dockerfile镜像制作容器转为镜像dockerfileDocker服务编排Docker ComposeDocker Compose安装使用docker compose编排nginxspringboot项目Docker私有仓库私有仓库搭建将镜像上传至私有仓库Nginx部署 案例:需求 在Docker容器中部署Nginx&…

【ARMv8 异常模型入门及渐进2 - 系统寄存器访问方法:op1,CRn,CRm,op2】

文章目录1.1 ARMv8 系统寄存器访问概要1.1.1 系统寄存器访问级别1.1.2 ARMv8 系统寄存器编码1.1 ARMv8 系统寄存器访问概要 ARMv8中,取消了协处理器,之前协处理器实现的功能,全部由系统寄存器来是实现。对于系统寄存器的访问,使用…

javaweb在校大学生贷款管理系统ns08a9

1系统主要实现:学生注册、填写详细资料、申请贷款、学校审核、银行审核、贷后管理等功能, (1) 学生注册:学生通过注册用户,提交自己的详细个人资料,考虑现实应用中的安全性,资料提交后不可修改;…

Springboot + MySQL+ JPA Ⅲ delete方法详解

一、deleteById(Id id) 和 delete(T entity) 为什么要把这两个方法放在一起呢?我们先看源码再说 deleteById源码(通过id进行删除) Transactional Override public void deleteById(ID id) {Assert.notNull(id, ID_MUST_NOT_BE_NULL);delet…

@爱打游戏的你,当游戏测试是什么感觉?

爱打游戏的你,当游戏测试是一种什么感觉? 去年《宝可梦朱紫》大火的那段时间,想必各位爱好游戏的友友们都刷到过这样的图吧:(量子纠缠)(天怎么黑了)(弹簧巨怪&#xff09…

手敲Mybatis(九)-结果集处理器

1.前言-背景介绍 上节我们处理了参数处理器,本节我们处理结果集处理器,之前我们写了一个DefaultResultSetHandler,我们把返回结果获取对象,填充值什么的写到了一起,流程没有进行解耦,并且只接收了Object的…

不通过鲁大师进行硬件检测

文章目录简介dxdiag系统信息设备管理器任务管理器PowerShelldxdiag系统信息设备管理器任务管理器PowerShellTODO:CPU-ZTODO:Everest参考文献简介 不少二手电脑重装系统后发现是假配置(特别是XP系统),可以使用系统自带…

基于Vue2实现滚动过程中数据懒加载

以下为实现滚动懒加载的过程: 1、在data对象中定义了items数组,用于存放已加载的item,loading状态,当前页数page,每页数量pageSize,以及距离底部的阈值threshold。 2、在mounted钩子函数中,首次…

Adaptive AUTOSAR——State Management(VRTE 3.0 R21-11)

状态管理是自适应平台服务中的一个功能集群。 在自适应平台中,状态决定了一组活动的自适应应用程序。 特定于项目的应用程序,即状态管理器,决定何时请求状态更改,从而更改当前活动的应用程序集。状态管理器是特定于项目的&#…

【Golang】三分钟让你快速了解Go语言为什么我们需要Go语言?

博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: Go语言核心编程近期目标:写好专栏的每一篇文章 目录一、Go语…

Pytorch基础 - 3. torch.utils.tensorboard

目录 1. 简介 2. 基本步骤 3. 示例1 - 可视化单条曲线 4. 示例2 - 可视化多条曲线 5. 示例3 - 可视化网络结构 1. 简介 Tensorboard是Tensorflow的可视化工具,常用来可视化网络的损失函数,网络结构,图像等。后来将Tensorboard集成到了P…

wps如何修改已经存在的目录标题内容?

如需了解更多办公应用的相关知识,可进入到赛效官网查看应用资讯或者应用问答栏目。 在WPS文档中,为方便大家查看文档中的内容,可以给文档内容添加目录,很多人由于对文档功能不太熟悉,所以当目录生成以后,想…

高效又稳定的ChatGPT大模型训练技巧总结,让训练事半功倍!

文|python前言近期,ChatGPT成为了全网热议的话题。ChatGPT是一种基于大规模语言模型技术(LLM, large language model)实现的人机对话工具。现在主流的大规模语言模型都采用Transformer网络,通过极大规模的数…