0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用PyMC进行时间序列分层建模

冬至子 来源:Charles Copley 作者:Charles Copley 2023-06-19 16:26 次阅读

在统计建模领域,理解总体趋势的同时解释群体差异的一个强大方法是分层(或多层)建模。这种方法允许参数随组而变化,并捕获组内和组间的变化。在时间序列数据中,这些特定于组的参数可以表示不同组随时间的不同模式。

今天,我们将深入探讨如何使用PyMC(用于概率编程Python库)构建分层时间序列模型。

让我们从为多个组生成一些人工时间序列数据开始,每个组都有自己的截距和斜率。

import numpy as np
 import matplotlib.pyplot as plt
 import pymc as pm
 
 # Simulating some data
 np.random.seed(0)
 n_groups = 3  # number of groups
 n_data_points = 100  # number of data points per group
 x = np.tile(np.linspace(0, 10, n_data_points), n_groups)
 group_indicator = np.repeat(np.arange(n_groups), n_data_points)
 slope_true = np.random.normal(0, 1, size=n_groups)
 intercept_true = np.random.normal(2, 1, size=n_groups)
 y = slope_true[group_indicator]*x + intercept_true[group_indicator] + np.random.normal(0, 1, size=n_groups*n_data_points)

我们生成了三个不同组的时间序列数据。每组都有自己的时间趋势,由唯一的截距和斜率定义。

colors = ['b', 'g', 'r']  # Define different colors for each group
 
 plt.figure(figsize=(10, 5))
 
 # Plot raw data for each group
 for i in range(n_groups):
     plt.plot(x[group_indicator == i], y[group_indicator == i], 'o', color=colors[i], label=f'Group {i+1}')
 
 plt.title('Raw Data with Groups')
 plt.xlabel('Time')
 plt.ylabel('Value')
 plt.legend()
 plt.show()

下一步是构建层次模型。我们的模型将具有组特定的截距(alpha)和斜率(beta)。截距和斜率是从具有超参数mu_alpha、sigma_alpha、mu_beta和sigma_beta的正态分布中绘制的。这些超参数分别表示截距和斜率的组水平均值和标准差。

with pm.Model() as hierarchical_model:
     # Hyperpriors
     mu_alpha = pm.Normal('mu_alpha', mu=0, sigma=10)
     sigma_alpha = pm.HalfNormal('sigma_alpha', sigma=10)
     mu_beta = pm.Normal('mu_beta', mu=0, sigma=10)
     sigma_beta = pm.HalfNormal('sigma_beta', sigma=10)
   
     # Priors
     alpha = pm.Normal('alpha', mu=mu_alpha, sigma=sigma_alpha, shape=n_groups)  # group-specific intercepts
     beta = pm.Normal('beta', mu=mu_beta, sigma=sigma_beta, shape=n_groups)  # group-specific slopes
     sigma = pm.HalfNormal('sigma', sigma=1)
 
     # Expected value
     mu = alpha[group_indicator] + beta[group_indicator] * x
 
     # Likelihood
     y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=y)
 
     # Sampling
     trace = pm.sample(2000, tune=1000)

现在我们已经定义了模型并对其进行了采样。让我们检查不同参数的模型估计:

# Checking the trace
 pm.plot_trace(trace,var_names=['alpha','beta'])
 plt.show()

最后一步是将原始数据和模型预测可视化:

# Posterior samples
 alpha_samples = trace.posterior['alpha'].values
 beta_samples = trace.posterior['beta'].values
 
 # New x values for predictions
 x_new = np.linspace(0, 10, 200)
 
 plt.figure(figsize=(10, 5))
 
 # Plot raw data and predictions for each group
 for i in range(n_groups):
     # Plot raw data
     
     plt.plot(x[group_indicator == i], y[group_indicator == i], 'o', color=colors[i], label=f'Group {i+1} observed')
     x_new = x[group_indicator == i]
     # Generate and plot predictions
     alpha = trace.posterior.sel(alpha_dim_0=i,beta_dim_0=i)['alpha'].values
     beta = trace.posterior.sel(alpha_dim_0=i,beta_dim_0=i)['beta'].values
     y_hat = alpha[..., None] + beta[..., None] * x_new[None,:]
     y_hat_mean = y_hat.mean(axis=(0, 1))
     y_hat_std = y_hat.std(axis=(0, 1))
     plt.plot(x_new, y_hat_mean, color=colors[i], label=f'Group {i+1} predicted')
     plt.fill_between(x_new, y_hat_mean - 2*y_hat_std, y_hat_mean + 2*y_hat_std, color=colors[i], alpha=0.3)
 
 plt.title('Raw Data with Posterior Predictions by Group')
 plt.xlabel('Time')
 plt.ylabel('Value')
 plt.legend()
 plt.show()

从图中可以看出,分层时间序列模型很好地捕获了每组中的单个趋势,而阴影区域给出了预测的不确定性。

层次模型为捕获时间序列数据中的组级变化提供了一个强大的框架。它们允许我们在组之间共享统计数据,提供部分信息池和对数据结构的细微理解。使用像PyMC这样的库,实现这些模型变得相当简单,为健壮且可解释的时间序列分析铺平了道路。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473
  • Alpha
    +关注

    关注

    0

    文章

    45

    浏览量

    25368
收藏 人收藏

    评论

    相关推荐

    使用PyMC3包实现贝叶斯线性回归

    1、如何使用PyMC3包实现贝叶斯线性回归  PyMC3(现在简称为PyMC)是一个贝叶斯建模包,它使数据科学家能够轻松地进行贝叶斯推断。 
    发表于 10-08 15:59

    基于序列重要点的时间序列分割

    时间序列包含的数据量大、维数高、数据更新快,很难直接在原始时间序列上进行数据挖掘。该文提出一种基于序列重要点(SIP)的
    发表于 04-09 09:05 26次下载

    基于符号化表示的时间序列频繁子序列挖掘

    提出一种新的基于符号化表示的时间序列频繁子序列的挖掘算法。利用基于PAA的分段线性表示法进行降维,通过在高斯分布下设置断点,实现时间
    发表于 04-22 09:46 24次下载

    基于u-shapelets的时间序列聚类算法

    质量评估方法对基于u-shapelets的时间序列聚类结果的影响;然后,选用最佳的子序列质量评估方法对u-shapelet候选集进行质量评估;其次,引入多元top-k查询技术对u-sh
    发表于 11-29 15:26 4次下载

    基于导数序列时间序列同构关系

    时间序列序列匹配作为时间序列检索、聚类、分类、异常监测等挖掘任务的基础被广泛研究。但传统的时间
    发表于 12-12 15:52 0次下载
    基于导数<b class='flag-5'>序列</b>的<b class='flag-5'>时间</b><b class='flag-5'>序列</b>同构关系

    一种分层递阶机制的实时多层建模方法

    在采用模型驱动的开发(MDD)方法对复杂实时系统进行建模设计时,单层的建模方法难以完成对控制系统的清晰和完整描述。针对上述问题提出了一种分层递阶机制的实时多层
    发表于 01-16 16:24 0次下载
    一种<b class='flag-5'>分层</b>递阶机制的实时多层<b class='flag-5'>建模</b>方法

    基于系数矩阵弧微分的时间序列相似度量

    中的最小二乘思想,通过构建系数矩阵获取时间序列形态属性向量基,实现序列曲线的连续化。在此基础上,应用连续函数的弧微分与曲率半径的关系进行时间序列
    发表于 03-29 09:45 0次下载

    如何基于Keras和Tensorflow用LSTM进行时间序列预测

    为了做到这一点,我们需要先对CSV文件中的数据进行转换,把处理后的数据加载到pandas的数据框架中。之后,它会输出numpy数组,馈送进LSTM。Keras的LSTM一般输入(N, W, F)三维numpy数组,其中N表示训练数据中的序列数,W表示
    的头像 发表于 09-06 08:53 2w次阅读
    如何基于Keras和Tensorflow用LSTM<b class='flag-5'>进行时间</b><b class='flag-5'>序列</b>预测

    如何使用频繁模式发现进行时间序列异常检测详细方法概述

    针对传统异常片 段检测方法在处理增量式时间序列时效率低的问题,提出一种基于频繁模式发现的时间序列异常检测(TSAD)方法。首先,将历史输入的时间
    发表于 11-28 11:09 5次下载
    如何使用频繁模式发现<b class='flag-5'>进行时间</b><b class='flag-5'>序列</b>异常检测详细方法概述

    如何用Python进行时间序列分解和预测?

    预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃。时间序列预测的需求不仅存在于各类业务场景当中,而且通常需要对未来几年甚至几分钟之后的时间序列
    的头像 发表于 02-14 11:34 2197次阅读
    如何用Python<b class='flag-5'>进行时间</b><b class='flag-5'>序列</b>分解和预测?

    基于时间卷积网络的通用日志序列异常检测框架

    基于循环神经网络的日志序列异常检测模型对短序列有较好的检测能力,但对长序列的检测准确性较差。为此,提出一种基于时间卷积网络的通用日志序列异常
    发表于 03-30 10:29 8次下载
    基于<b class='flag-5'>时间</b>卷积网络的通用日志<b class='flag-5'>序列</b>异常检测框架

    时间序列分析的定义

    01 时间序列分析的定义 1.1 概念 首先,时间序列定义为在一定时间间隔内按时间顺序测量的某个
    的头像 发表于 03-16 16:17 4317次阅读

    如何使用SBC ToolBox云平台进行时间序列分析?

    使用SBC ToolBox云平台时间序列分析模块探索基因集在不同时间点的表达趋势,使用c-means算法对基因集进行聚类分群,寻找出表达趋势一致的基因集。
    的头像 发表于 09-20 16:52 690次阅读
    如何使用SBC ToolBox云平台<b class='flag-5'>进行时间</b><b class='flag-5'>序列</b>分析?

    离线分析中,CANape 或 vSignalyzer 对不同信号进行时间同步

    在离线分析的过程中,可能会对两个不同的信号进行时间上同步,本文以举例的形式介绍,如何使用 CANape 或者 vSignalyzer 对不同的信号进行时间同步。
    的头像 发表于 10-13 12:28 1236次阅读
    离线分析中,CANape 或 vSignalyzer 对不同信号<b class='flag-5'>进行时间</b>同步

    使用轮廓分数提升时间序列聚类的表现

    我们将使用轮廓分数和一些距离指标来执行时间序列聚类实验,并且进行可视化
    的头像 发表于 10-17 10:35 239次阅读
    使用轮廓分数提升<b class='flag-5'>时间</b><b class='flag-5'>序列</b>聚类的表现