非高斯局部水平模型

简介

对于非高斯状态空间模型,我们拥有与高斯状态空间模型相同的基本框架,但现在可能使用非高斯的测量密度。也就是说,我们关注的是以下形式的问题:

\[p\left(y_{t}\mid{z}_{t}\right)\]
\[\theta_{t} = f\left(\alpha_{t}\right)\]
\[\alpha_{t} = \alpha_{t-1} + \eta_{t}\]
\[\eta_{t} \sim N\left(0,\Sigma\right)\]

通常基于MCMC的方案是解决此问题的正确方法。目前PyFlux为了速度使用BBVI,但平均场近似意味着状态可能存在一些偏差(尽管预测结果通常还不错)。未来,PyFlux将使用更结构化的近似方法。

非高斯局部水平模型与高斯局部水平模型具有相同的形式,但采用非高斯测量密度。

示例

为了趣味性,同时也因为这是一个热门话题,我们将应用泊松局部水平模型来分析莱斯特城足球俱乐部重返英超联赛后的进球数统计数据。每个索引代表他们参加的一场比赛。虽然这是一个简短的数据集,但它展示了模型背后的原理。

import numpy as np
import pyflux as pf
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

leicester = pd.read_csv('http://www.pyflux.com/notebooks/leicester_goals_scored.csv')
leicester.columns= ["Time","Goals","Season2"]
plt.figure(figsize=(15,5))
plt.plot(leicester["Goals"])
plt.ylabel('Goals Scored')
plt.title('Leicester Goals Since Joining EPL');
plt.show()
http://www.pyflux.com/notebooks/NonGaussianStateSpace/output_11_0.png

我们可以按如下方式拟合泊松局部水平模型:

model = pf.NLLEV(data=leicester, target='Goals', family=pf.Poisson())

我们也可以使用更高级别的封装器,它允许我们指定分布族。如果选择正态分布,则将使用卡尔曼滤波器:

model = pf.LocalLevel(data=leicester, target='Goals', family=pf.Poisson())

接下来我们通过BBVI估计\(z^{BBVI}\)来估计潜在变量:

x = model.fit(iterations=5000)
x.summary()

10% done : ELBO is -107.599165657
20% done : ELBO is -127.571498111
30% done : ELBO is -136.25857363
40% done : ELBO is -137.626516299
50% done : ELBO is -137.539662707
60% done : ELBO is -137.321490055
70% done : ELBO is -137.518451697
80% done : ELBO is -137.311382466
90% done : ELBO is -136.3580387
100% done : ELBO is -137.346927749

Final model ELBO is -135.76799195

Poisson Local Level Model
======================================== =================================================
Dependent Variable: Goals                Method: BBVI
Start Date: 0                            Unnormalized Log Posterior: -56.8409
End Date: 74                             AIC: 115.681720125
Number of observations: 75               BIC: 117.999208239
==========================================================================================
Latent Variable           Median             Mean               95% Credibility Interval
========================= ================== ================== ==========================
Sigma^2 level             0.0406             0.0406             (0.0353 | 0.0467)
==========================================================================================

我们可以使用plot_z()绘制演化参数:

model.plot_z()
http://www.pyflux.com/notebooks/NonGaussianStateSpace/output_15_1.png

接下来我们将使用plot_fit()绘制样本内拟合结果:

model.plot_fit(figsize=(15,10))
http://www.pyflux.com/notebooks/NonGaussianStateSpace/output_17_0.png

初始阶段的剧烈变化反映了扩散初始化的影响;结合较高的初始不确定性,这导致在序列初期会有更强的更新。我们可以使用plot_predict进行前向预测:

我们可以通过plot_predict()方法进行预测,来了解模型的性能:

model.plot_predict(h=5,figsize=(15,5))
http://www.pyflux.com/notebooks/NonGaussianStateSpace/output_19_0.png

如果我们只需要预测结果本身,可以使用predict()方法。

类描述

class NLLEV(data, ar, integ, target, family)

非高斯局部水平模型 (NLLEV).

参数 类型 描述
data pd.DataFrame or np.ndarray 包含单变量时间序列
integ int 数据差分次数 (默认: 0)
target string or int 指定使用DataFrame/array中的哪一列。
family pf.Family instance The distribution for the time series, e.g pf.Normal()

属性

latent_variables

一个包含模型潜在变量信息的pf.LatentVariables()对象,包括先验设置、任何拟合值、初始值和其他潜在变量信息。当模型被拟合时,这里就是潜在变量被更新/存储的地方。有关此对象内属性的信息以及访问潜在变量信息的方法,请参阅潜在变量文档。

方法

adjust_prior(index, prior)

调整模型潜在变量的先验分布。潜在变量及其索引可以通过打印附加到模型实例的latent_variables属性来查看。

参数 类型 描述
index int 要更改的潜变量索引
prior pf.Family instance Prior distribution, e.g. pf.Normal()

返回: void - 修改模型的 latent_variables 属性

fit(method, **kwargs)

估计模型的潜在变量。用户选择一个推断选项,该方法会返回一个结果对象,同时更新模型的latent_variables属性。

参数 类型 描述
method str 推断选项:例如 'M-H' 或 'MLE'

请参阅文档中的贝叶斯推断和经典推断部分,了解完整的推断选项列表。可以输入与所选特定推断模式相关的可选参数。

返回: 包含估计潜在变量信息的pf.Results实例

plot_fit(**kwargs)

绘制模型对数据的拟合情况。可选参数包括figsize,即绘图图形的尺寸。

返回 : void - 显示一个matplotlib绘图

plot_predict(h, past_values, intervals, **kwargs)

绘制模型的预测结果,并附带置信区间。

参数 类型 描述
h int 预测向前多少步
past_values int 要绘制的历史数据点数量
intervals boolean 是否绘制区间

可选参数包括figsize - 图表绘制的尺寸。请注意 如果您使用最大似然估计或变分推断,显示的区间将不会 反映潜在变量的不确定性。只有Metropolis-Hastings方法能提供完全贝叶斯 预测区间。由于平均场推断的局限性(无法考虑后验相关性), 变分推断的贝叶斯区间不予显示。

返回 : void - 显示一个matplotlib绘图

plot_predict_is(h, fit_once, fit_method, **kwargs)

绘制模型在样本内的滚动预测。这意味着用户假装数据的最后一部分是样本外的,并在每个时间段后进行预测并评估其表现。用户可以选择是在开始时一次性拟合参数,还是在每个时间步都进行拟合。

参数 类型 描述
h int 使用多少个先前的时间步
fit_once boolean 是否只拟合一次,还是每个时间步都拟合
fit_method str 选择哪种推断方法,例如'MLE'

可选参数包括figsize - 要绘制的图形尺寸。h是一个整数,表示要模拟性能的前几步。

返回 : void - 显示一个matplotlib绘图

plot_z(indices, figsize)

返回潜在变量及其相关不确定性的绘图。

参数 类型 描述
indices int or list 要绘制的潜变量索引
figsize tuple matplotlib图形的大小

返回 : void - 显示一个matplotlib绘图

predict(h)

返回模型预测结果的DataFrame。

参数 类型 描述
h int 预测向前多少步

请注意,如果您使用最大似然估计或变分推断,显示的区间将不会反映潜在变量的不确定性。只有Metropolis-Hastings方法能提供完全贝叶斯预测区间。由于平均场推断的局限性(未考虑后验相关性),变分推断的贝叶斯区间未予显示。

返回 : pd.DataFrame - 模型预测结果

predict_is(h, fit_once, fit_method)

返回模型样本内滚动预测的DataFrame。

参数 类型 描述
h int 使用多少个先前的时间步
fit_once boolean 是否只拟合一次,还是每个时间步都拟合
fit_method str 选择哪种推断方法,例如'MLE'

返回 : pd.DataFrame - 模型预测结果

参考文献

Harvey, A. C. (1989). 《预测、结构时间序列模型与卡尔曼滤波》。 剑桥大学出版社,剑桥。

Ranganath, R., Gerrish, S., 和 Blei, D. M. (2014). 黑盒变分推断。 发表于《人工智能与统计学》。