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

news/2024/11/29 5:35:01/

贝叶斯时序预测(一)

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

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

贝叶斯定理回顾

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

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

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

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

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

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

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

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

贝叶斯时序预测

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

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

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

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

    此模型的关键要素为:

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

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

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

  • FtF_tFt是回归向量

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

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 mediandf = 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.ppmy.cn/news/41721.html

相关文章

软件测试之测试分类

文章目录按测试对象分界面测试可靠性测试容错性测试文档测试兼容性测试易用性测试安装卸载测试安全测试性能测试内存泄露测试弱网测试按代码的查看情况黑盒测试白盒测试灰盒测试按开发阶段单元测试集成测试系统测试回归测试冒烟测试验收测试测试的大致分类: 下面就…

【展会邀请】百华与您相约第104届中国劳动保护用品交易会!

重磅消息!一场行业极具规模的劳保展 第104届中国劳动保护用品交易会 暨2023中国国际职业安全及健康产业博览会 将于2023.4.13-15在上海新国际博览中心E1-E7馆隆重举办! 山东百华鞋业有限公司受邀参展,正在火热筹备中。 百华展位号 2023…

pytest测试报告Allure - 动态生成标题生成功能、添加用例失败截图

一、动态生成标题 默认 allure 报告上的测试用例标题不设置就是用例名称,其可读性不高;当结合 pytest.mark.parametrize 参数化完成数据驱动时,如标题写死,其可读性也不高。 那如果希望标题可以动态的生成,采取的方案…

libuv系列--queue详解

一、目的 在以前的博文《RT-Thread系列--双链表分析》我们介绍了如何实现双链表,其实这种双链表结构在linux内核中用得比较多,但是考虑到版权问题,libuv通过宏实现了同样功能的双链表结构。本篇的目的就是帮助大家理解其实现原理,…

Asp net core写法

变量和字符串赋值 $"{变量}字符串" 列如 $"{a}你好" 全球唯一标识符 Guid.NewGuid() 线程 Task Map Dictionary<string,object> using 定义对象的使用范围&#xff0c;即使释放对象 using(Student student new Student() ) { } 异步编程&#x…

springboot项目配置动态注入与docker设置环境变量

1.springboot怎么配置信息动态注入&#xff1f;2.docker怎么在镜像启动的时候注入env环境变量&#xff1f;带着这些问题我开始探索实验并把结果以及常用的命令记录下。 springboot动态注入配置信息。 这是一个很简单的问题&#xff0c;但是我不擅长记命令&#xff0c;只是知道…

Qt Quick - ProgressBar

ProgressBar使用总结一、概述二、使用三、定制化一、概述 ProgressBar 就是进度条。该值应该随着进度定期更新。范围由from和to定义&#xff0c;这个定义的就是区间值&#xff0c;它们都可以包含任何值。 ProgressBar {value: 0.5}ProgressBar还支持一种特殊的不确定模式&#…

6.【动手学深度学习v2】 矩阵计算

6. 矩阵计算【动手学深度学习v2】 李沐 B站&#xff1a;https://space.bilibili.com/1567748478/channel/seriesdetail?sid358497 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 课件&#xff1a;https://courses.d2l.ai/zh-v2/a…