九、贝叶斯结构时间序列模型(BSTS)

1. 原理

BSTS 模型是基于贝叶斯框架的时间序列建模方法,它允许对时间序列数据中的趋势、季节性和假期效应进行建模。BSTS 模型结合了结构时间序列模型和贝叶斯推断方法,以提供灵活的建模能力。

2. 核心公式

十大时间序列模型最强总结(九)贝叶斯结构时间序列模型(BSTS)_人工智能

推导

  1. 趋势: 使用随机游走模型或加法趋势模型。
  2. 季节性: 建模季节性波动。
  3. 假期效应: 通过特定的假期效应模型引入。

3. 优缺点

1)优点

  • 能够处理多种时间序列成分,适用于复杂的时间序列数据。
  • 具有灵活的贝叶斯推断能力,能提供不确定性评估。

2)缺点

  • 计算复杂度高,训练时间较长。
  • 对超参数的调整较为敏感。

4. 适用场景

BSTS 模型适用于具有复杂结构的时间序列数据,如业务销售数据、经济指标预测等。

5. 核心案例代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import numpyro
from bsts import BSTS
import jax
import jax.numpy as jnp

# 确认可用设备数量
print(f"Number of available devices: {jax.local_device_count()}")

# 设置主机设备数量(根据实际情况调整)
numpyro.set_host_device_count(1)  # 设置为实际可用的设备数量

# 生成示例数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=365)
data = np.linspace(10, 50, 365) + 10 * np.sin(np.linspace(0, 2 * np.pi, 365)) + np.random.randn(365) * 5
df = pd.DataFrame({'Date': dates, 'Value': data})

# 确保数据格式正确
values = np.asarray(df['Value'], dtype=np.float32)

# 初始化 BSTS 模型
model = BSTS(values)

# 拟合模型
model.fit(values)

# 预测未来30天
forecast = model.predict(steps=30)

# 生成未来日期
forecast_index = pd.date_range(dates[-1] + pd.DateOffset(days=1), periods=30)
forecast_values = forecast['mean']  # 根据实际返回值的结构调整

# 可视化
plt.figure(figsize=(12, 6))
plt.plot(df['Date'], df['Value'], label='Observed', color='blue')
plt.plot(forecast_index, forecast_values, label='Forecast', color='red', linestyle='--')
plt.title('BSTS Model Forecast')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()

图中展示了时间序列数据(蓝色)及其预测结果(红色虚线)。BSTS 模型能够捕捉时间序列的复杂成分并进行预测。