0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用PyMC進(jìn)行時(shí)間序列分層建模

冬至子 ? 來(lái)源:Charles Copley ? 作者:Charles Copley ? 2023-06-19 16:26 ? 次閱讀

在統(tǒng)計(jì)建模領(lǐng)域,理解總體趨勢(shì)的同時(shí)解釋群體差異的一個(gè)強(qiáng)大方法是分層(或多層)建模。這種方法允許參數(shù)隨組而變化,并捕獲組內(nèi)和組間的變化。在時(shí)間序列數(shù)據(jù)中,這些特定于組的參數(shù)可以表示不同組隨時(shí)間的不同模式。

今天,我們將深入探討如何使用PyMC(用于概率編程Python庫(kù))構(gòu)建分層時(shí)間序列模型。

讓我們從為多個(gè)組生成一些人工時(shí)間序列數(shù)據(jù)開始,每個(gè)組都有自己的截距和斜率。

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)

我們生成了三個(gè)不同組的時(shí)間序列數(shù)據(jù)。每組都有自己的時(shí)間趨勢(shì),由唯一的截距和斜率定義。

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()

下一步是構(gòu)建層次模型。我們的模型將具有組特定的截距(alpha)和斜率(beta)。截距和斜率是從具有超參數(shù)mu_alpha、sigma_alpha、mu_beta和sigma_beta的正態(tài)分布中繪制的。這些超參數(shù)分別表示截距和斜率的組水平均值和標(biāo)準(zhǔn)差。

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)

現(xiàn)在我們已經(jīng)定義了模型并對(duì)其進(jìn)行了采樣。讓我們檢查不同參數(shù)的模型估計(jì):

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

最后一步是將原始數(shù)據(jù)和模型預(yù)測(cè)可視化:

# 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()

從圖中可以看出,分層時(shí)間序列模型很好地捕獲了每組中的單個(gè)趨勢(shì),而陰影區(qū)域給出了預(yù)測(cè)的不確定性。

層次模型為捕獲時(shí)間序列數(shù)據(jù)中的組級(jí)變化提供了一個(gè)強(qiáng)大的框架。它們?cè)试S我們?cè)诮M之間共享統(tǒng)計(jì)數(shù)據(jù),提供部分信息池和對(duì)數(shù)據(jù)結(jié)構(gòu)的細(xì)微理解。使用像PyMC這樣的庫(kù),實(shí)現(xiàn)這些模型變得相當(dāng)簡(jiǎn)單,為健壯且可解釋的時(shí)間序列分析鋪平了道路。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84081
  • Alpha
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    25479
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】全書概覽與時(shí)間序列概述

    的,書籍封面如下。下面對(duì)全書概覽并對(duì)第一章時(shí)間序列概述進(jìn)行細(xì)度。 一. 全書概覽 全書分為8章,每章的簡(jiǎn)介如下: ●第1章“時(shí)間序列概述
    發(fā)表于 08-07 23:03

    【《時(shí)間序列與機(jī)器學(xué)習(xí)》閱讀體驗(yàn)】+ 了解時(shí)間序列

    收到《時(shí)間序列與機(jī)器學(xué)習(xí)》一書,彩色印刷,公式代碼清晰,非常精美。感謝作者,感謝電子發(fā)燒友提供了一個(gè)讓我學(xué)習(xí)時(shí)間序列及應(yīng)用的機(jī)會(huì)! 前言第一段描述了編寫背景: 由此可知,這是一本關(guān)于
    發(fā)表于 08-11 17:55

    使用PyMC3包實(shí)現(xiàn)貝葉斯線性回歸

    1、如何使用PyMC3包實(shí)現(xiàn)貝葉斯線性回歸  PyMC3(現(xiàn)在簡(jiǎn)稱為PyMC)是一個(gè)貝葉斯建模包,它使數(shù)據(jù)科學(xué)家能夠輕松地進(jìn)行貝葉斯推斷?!?/div>
    發(fā)表于 10-08 15:59

    基于序列重要點(diǎn)的時(shí)間序列分割

    時(shí)間序列包含的數(shù)據(jù)量大、維數(shù)高、數(shù)據(jù)更新快,很難直接在原始時(shí)間序列上進(jìn)行數(shù)據(jù)挖掘。該文提出一種基于序列重要點(diǎn)(SIP)的
    發(fā)表于 04-09 09:05 ?26次下載

    基于SAX的時(shí)間序列分類

    分類問(wèn)題是數(shù)據(jù)挖掘中的基本問(wèn)題之一,時(shí)間序列的特征表示及相似性度量是時(shí)間序列數(shù)據(jù)挖掘中分類、聚類及模式發(fā)現(xiàn)等任務(wù)的基礎(chǔ)。SAX方法是一種典型的時(shí)間
    發(fā)表于 11-30 14:49 ?2次下載

    基于導(dǎo)數(shù)序列時(shí)間序列同構(gòu)關(guān)系

    時(shí)間序列序列匹配作為時(shí)間序列檢索、聚類、分類、異常監(jiān)測(cè)等挖掘任務(wù)的基礎(chǔ)被廣泛研究。但傳統(tǒng)的時(shí)間
    發(fā)表于 12-12 15:52 ?0次下載
    基于導(dǎo)數(shù)<b class='flag-5'>序列</b>的<b class='flag-5'>時(shí)間</b><b class='flag-5'>序列</b>同構(gòu)關(guān)系

    小波回聲狀態(tài)網(wǎng)絡(luò)的時(shí)間序列預(yù)測(cè)

    為了更好的對(duì)具有多尺度特性的時(shí)間序列進(jìn)行預(yù)測(cè),運(yùn)用小波分析方法與回聲狀態(tài)網(wǎng)絡(luò)模型相結(jié)合來(lái)創(chuàng)建小波回聲狀態(tài)網(wǎng)絡(luò)預(yù)測(cè)模型。利用小波方法對(duì)原始時(shí)間序列
    發(fā)表于 01-13 11:40 ?0次下載
    小波回聲狀態(tài)網(wǎng)絡(luò)的<b class='flag-5'>時(shí)間</b><b class='flag-5'>序列</b>預(yù)測(cè)

    基于系數(shù)矩陣弧微分的時(shí)間序列相似度量

    的最小二乘思想,通過(guò)構(gòu)建系數(shù)矩陣獲取時(shí)間序列形態(tài)屬性向量基,實(shí)現(xiàn)序列曲線的連續(xù)化。在此基礎(chǔ)上,應(yīng)用連續(xù)函數(shù)的弧微分與曲率半徑的關(guān)系進(jìn)行時(shí)間序列
    發(fā)表于 03-29 09:45 ?0次下載

    如何基于Keras和Tensorflow用LSTM進(jìn)行時(shí)間序列預(yù)測(cè)

    為了做到這一點(diǎn),我們需要先對(duì)CSV文件中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,把處理后的數(shù)據(jù)加載到pandas的數(shù)據(jù)框架中。之后,它會(huì)輸出numpy數(shù)組,饋送進(jìn)LSTM。Keras的LSTM一般輸入(N, W, F)三維numpy數(shù)組,其中N表示訓(xùn)練數(shù)據(jù)中的序列數(shù),W表示
    的頭像 發(fā)表于 09-06 08:53 ?2w次閱讀
    如何基于Keras和Tensorflow用LSTM<b class='flag-5'>進(jìn)行時(shí)間</b><b class='flag-5'>序列</b>預(yù)測(cè)

    如何使用頻繁模式發(fā)現(xiàn)進(jìn)行時(shí)間序列異常檢測(cè)詳細(xì)方法概述

    針對(duì)傳統(tǒng)異常片 段檢測(cè)方法在處理增量式時(shí)間序列時(shí)效率低的問(wèn)題,提出一種基于頻繁模式發(fā)現(xiàn)的時(shí)間序列異常檢測(cè)(TSAD)方法。首先,將歷史輸入的時(shí)間
    發(fā)表于 11-28 11:09 ?5次下載
    如何使用頻繁模式發(fā)現(xiàn)<b class='flag-5'>進(jìn)行時(shí)間</b><b class='flag-5'>序列</b>異常檢測(cè)詳細(xì)方法概述

    如何用Python進(jìn)行時(shí)間序列分解和預(yù)測(cè)?

    預(yù)測(cè)是一件復(fù)雜的事情,在這方面做得好的企業(yè)會(huì)在同行業(yè)中出類拔萃。時(shí)間序列預(yù)測(cè)的需求不僅存在于各類業(yè)務(wù)場(chǎng)景當(dāng)中,而且通常需要對(duì)未來(lái)幾年甚至幾分鐘之后的時(shí)間序列
    的頭像 發(fā)表于 02-14 11:34 ?2405次閱讀
    如何用Python<b class='flag-5'>進(jìn)行時(shí)間</b><b class='flag-5'>序列</b>分解和預(yù)測(cè)?

    基于時(shí)間卷積網(wǎng)絡(luò)的通用日志序列異常檢測(cè)框架

    基于循環(huán)神經(jīng)網(wǎng)絡(luò)的日志序列異常檢測(cè)模型對(duì)短序列有較好的檢測(cè)能力,但對(duì)長(zhǎng)序列的檢測(cè)準(zhǔn)確性較差。為此,提出一種基于時(shí)間卷積網(wǎng)絡(luò)的通用日志序列異常
    發(fā)表于 03-30 10:29 ?8次下載
    基于<b class='flag-5'>時(shí)間</b>卷積網(wǎng)絡(luò)的通用日志<b class='flag-5'>序列</b>異常檢測(cè)框架

    時(shí)間序列分析的定義

    01 時(shí)間序列分析的定義 1.1 概念 首先,時(shí)間序列定義為在一定時(shí)間間隔內(nèi)按時(shí)間順序測(cè)量的某個(gè)
    的頭像 發(fā)表于 03-16 16:17 ?5339次閱讀

    如何使用SBC ToolBox云平臺(tái)進(jìn)行時(shí)間序列分析?

    使用SBC ToolBox云平臺(tái)時(shí)間序列分析模塊探索基因集在不同時(shí)間點(diǎn)的表達(dá)趨勢(shì),使用c-means算法對(duì)基因集進(jìn)行聚類分群,尋找出表達(dá)趨勢(shì)一致的基因集。
    的頭像 發(fā)表于 09-20 16:52 ?997次閱讀
    如何使用SBC ToolBox云平臺(tái)<b class='flag-5'>進(jìn)行時(shí)間</b><b class='flag-5'>序列</b>分析?

    使用輪廓分?jǐn)?shù)提升時(shí)間序列聚類的表現(xiàn)

    我們將使用輪廓分?jǐn)?shù)和一些距離指標(biāo)來(lái)執(zhí)行時(shí)間序列聚類實(shí)驗(yàn),并且進(jìn)行可視化
    的頭像 發(fā)表于 10-17 10:35 ?407次閱讀
    使用輪廓分?jǐn)?shù)提升<b class='flag-5'>時(shí)間</b><b class='flag-5'>序列</b>聚類的表現(xiàn)