tigramite教程(五)使用TIGRAMITE 进行自助聚合和链接置信度量化

使用TIGRAMITE 进行自助聚合和链接置信度量化

  • 自助聚合(Bagging)和置信度估计
  • 例子
    • 数据生成模型
    • 基本的PCMCI+
    • Bagged-PCMCI+
      • 使用优化后的`pc_alpha`进行自举聚合
      • 使用优化的pc_alpha进行CMIknn的自举聚合

TIGRAMITE是一个用于时间序列分析的Python模块。它基于PCMCI框架,允许从离散或连续值时间序列中重建因果图模型,并创建结果的高质量图表。

这篇《自然-地球与环境》评论论文总结了一般时间序列因果推断的概况

本教程解释了时间序列因果发现的自助聚合(Bagging),该方法在PCMCIbase.run_bootstrap_of函数中实现。自助聚合是一种通用的元算法,可与TIGRAMITE的大多数因果发现方法结合使用,例如run_pcmcirun_pcalg_non_timeseries_datarun_pcmciplusrun_lpcmci等,包括整个条件独立性检验范围。您可以参考以下预印本获取更多信息。

import numpy as npfrom matplotlib import pyplot as plt
%matplotlib inline     import tigramite
from tigramite import data_processing as pp
from tigramite.toymodels import structural_causal_processes as toys
from tigramite import plotting as tp
from tigramite.lpcmci import LPCMCI
from tigramite.pcmci import PCMCI
from tigramite.independence_tests.parcorr import ParCorr
from tigramite.independence_tests.cmiknn import CMIknn
from tigramite.pcmci_base import PCMCIbase

自助聚合(Bagging)和置信度估计

在基于自助法的自助聚合(bagging)中,训练集中的随机样本是有放回地选择的,这意味着在每个自助样本中,每个数据点可以被多次抽取。以这种方式生成多个数据样本以产生一组复制品(也称为重新采样)。机器学习模型然后分别在每个复制品上进行训练,最终为预测任务对输出进行平均或为分类任务进行聚合(例如通过多数投票)。在我们的情况下,训练集是输入时间序列,机器学习模型是因果发现方法,输出是因果图。

自助聚合在时间序列因果发现中的主要兴趣在于改善输出图的稳健性,并为图中的连接提供置信度估计。由于时间序列因果发现对时间依赖性敏感,保持重采样过程中的时间依赖性是至关重要的。然而,标准重采样不可避免地会破坏(至少部分地)时间滞后依赖。为解决这个问题,我们采用以下所示的重采样策略:

(图片展示了重采样过程)

最终,我们的自助聚合方法结合时间序列因果发现方法(这里是PCMCI+)可以总结如下:原始时间序列被重采样 B B B (自助法复制次数)次。在每个重采样中,PCMCI+被独立运行,产生一个输出图。然后通过相对多数投票对每对边的类型进行聚合,得到 B B B 个输出图。对于每个边缘的类型,通过大多数投票对所有这些图进行聚合,得到最终输出图,解决连接冲突的优先级顺序(无连接,×−×和◦−◦);如果→和←之间存在冲突的连接,则返回冲突连接×−×。

Bagged-PCMCI+的返回结果包括:

  1. 通过将PCMCI+应用于通过保留时间依赖性进行重采样获得的 B B B 个数据集得到的 B B B 个因果图集成,

  2. 将所有这些图通过多数投票(在每个单独边缘的级别)聚合到最终输出图中,

  3. 为最终聚合图提供连接频率,以提供连接的置信度量。

通过输出图中连接的宽度来表示此置信度量:时间滞后2时刻的 X 2 → X 3 X_2 \rightarrow X_3 X2X3 的置信度量(与箭头宽度成比例)大于时间滞后1时刻的 X 4 → X 1 X_4 \rightarrow X_1 X4X1 的置信度量。

在这里插入图片描述
与所选因果发现算法相比,被聚合的版本有一个进一步的参数:自助法复制次数 B B B 。在实践中,我们建议尽可能使用较大的 B B B 。该实施使用joblib进行并行化。在我们的数值实验中, B = 25 B=25 B=25已经获得了良好的结果,但我们建议使用 B ≥ 100 B\geq 100 B100

例子

这一部分演示和解释了Bagged-PCMCI+在合成数据上的应用。

数据生成模型

# Set seed for reproducibility
seed = 1111
# Choose the time series length
T = 100# Specify the model (note that here, unlike in the typed equations, variables
# are indexed starting from 0)
def lin(x): return xlinks = {0: [((0, -1), 0.3, lin), ((2, 0), 0.5, lin), ((3, -1), -0.5, lin)],   # X11: [((1, -1), 0.3, lin)],                                             # X22: [((2, -1), 0.3, lin), ((1, -2), 0.4, lin)],                        # X33: [((3, -1), 0.3, lin)]                                              # X4                            }var_names = [r'$X^{%d}$' % j for j in range(1, len(links)+1)]# Show ground truth causal graph
tp.plot_graph(graph = PCMCI.get_graph_from_dict(links),var_names=var_names,)

在这里插入图片描述
现在往里面灌数据

# Generate data according to the full structural causal process
data, nonstationarity_indicator = toys.structural_causal_process(links=links, T=T, seed=seed)
assert not nonstationarity_indicator# Number of variables
N = data.shape[1]# Initialize dataframe object, specify variable names
dataframe = pp.DataFrame(data, var_names=var_names)

基本的PCMCI+

先展示以下基本的PCMCI+算法

tau_max = 2
pc_alpha = 0.01pcmci = PCMCI(dataframe=dataframe,cond_ind_test=ParCorr(),verbosity=0,)
results_pcmciplus = pcmci.run_pcmciplus(tau_max=tau_max, pc_alpha=pc_alpha)
tp.plot_graph(graph = results_pcmciplus['graph'],val_matrix= results_pcmciplus['val_matrix'],var_names=dataframe.var_names,); plt.show()

在这里插入图片描述
在这里,PCMCI+漏了连接 X 2 → X 3 X^2\to X^3 X2X3 ,并且无法确定连接 X 3 → X 1 X^3\to X^1 X3X1 的方向。

Bagged-PCMCI+

从我们的数值实验中,我们发现Bagged-PCMCI+改善了邻接精度和方向识别率。然而,不能直接将Bagged-PCMCI+与相同的pc_alpha下的PCMCI+结果进行比较(请参见论文中的精度-召回曲线)。在这里,我们选择了一个更高的pc_alpha用于Bagged-PCMCI+。在下文中,我们将说明如何使用模型选择来选择pc_alpha。

Bagged-PCMCI+的另一个参数是自助法的块长度(默认为1)。可以选择性地用它来更好地处理自相关性,但其效果尚未评估。

pc_alpha_bootstrap = 0.1
boot_samples = 200# The block-length of the bootstrap can optionally be used to better deal with autocorrelation, 
# but its effect was not yet evaluated.
boot_blocklength = 1## Create PCMCI object to call run_bootstrap_of
pcmci = PCMCI(dataframe=dataframe,cond_ind_test=ParCorr(),verbosity=0,)# Call bootstrap for the chosen method (here 'run_pcmciplus') and pass method arguments  
results = pcmci.run_bootstrap_of(method='run_pcmciplus', method_args={'tau_max':tau_max, 'pc_alpha':pc_alpha_bootstrap}, boot_samples=boot_samples,boot_blocklength=boot_blocklength,seed=123)# Output graph, link frequencies (confidence measure), and mean test statistic values (val_mat)
boot_linkfreq = results['summary_results']['link_frequency']
boot_graph = results['summary_results']['most_frequent_links']
val_mat = results['summary_results']['val_matrix_mean']# Plot
tp.plot_graph(graph = boot_graph,val_matrix= val_mat,link_width = boot_linkfreq,var_names=dataframe.var_names,); plt.show()

在这里插入图片描述
在这个例子中,我们可以看到Bagged-PCMCI+获得了正确的图(在 B B B个重新采样中进行链接多数投票),并且还通过箭头的宽度提供了对链接的置信度的有用估计。

使用优化后的pc_alpha进行自举聚合

对于一系列算法和条件独立性测试,还可以将pc_alpha设置为指定的列表或为None(然后将使用列表[0.001, 0.005, 0.01, 0.025, 0.05])。pc_alpha将根据在cond_ind_test.get_model_selection_criterion()中计算的得分在指定列表中的值上进行优化。这对于所有条件独立性测试都是不可能的。

这种方法也可以与自举聚合相结合。pc_alpha会在每次 B B B个自举重新采样中进行内部和个别优化。

pc_alpha_bootstrap = [0.001, 0.01, 0.05, 0.1, 0.2] # This can be adapted 
boot_samples = 200# The block-length of the bootstrap can optionally be used to better deal with autocorrelation, 
# but its effect was not yet evaluated.
boot_blocklength = 1## Create PCMCI object to call run_bootstrap_of
pcmci = PCMCI(dataframe=dataframe,cond_ind_test=ParCorr(),verbosity=0,)# Call bootstrap for the chosen method (here 'run_pcmciplus') and pass method arguments  
results = pcmci.run_bootstrap_of(method='run_pcmciplus', method_args={'tau_max':tau_max, 'pc_alpha':pc_alpha_bootstrap}, boot_samples=boot_samples,boot_blocklength=boot_blocklength,seed=123)# Output graph, link frequencies (confidence measure), and mean test statistic values (val_mat)
boot_linkfreq = results['summary_results']['link_frequency']
boot_graph = results['summary_results']['most_frequent_links']
val_mat = results['summary_results']['val_matrix_mean']# Plot
tp.plot_graph(graph = boot_graph,val_matrix= val_mat,link_width = boot_linkfreq,var_names=dataframe.var_names,); plt.show()

在这里插入图片描述

使用优化的pc_alpha进行CMIknn的自举聚合

最后,我们展示了通过优化pc_alpha和非线性条件独立性测试CMIknn来实现Bagged-PCMCI+方法。请参阅相应的教程。使用标准初始化CMIknn(significance='shuffle_test')将导致每个测试执行计算密集型的置换检验方案以获得零分布。另一种具有较少统计严谨性的替代方法是仅基于条件互信息上的固定阈值做出测试决策,使用CMIknn(significance='fixed_thres'),请参阅教程中的解释。这在这里进行了说明。

我们按以下方式创建非线性数据:

# Choose the time series length
T = 500# Specify the model (note that here, unlike in the typed equations, variables
# are indexed starting from 0)
def lin(x): return x
def nonlin(x): return .2 * (x + 5. * x**2 * np.exp(-x**2 / 20.))links = {0: [((0, -1), 0.3, lin), ((2, 0), 0.5, lin), ((3, -1), -0.7, nonlin)],   # X11: [((1, -1), 0.3, lin)],                                             # X22: [((2, -1), 0.3, lin), ((1, -2), 0.4, nonlin)],                        # X33: [((3, -1), 0.3, lin)]                                              # X4                            }# Generate data according to the full structural causal process
data, nonstationarity_indicator = toys.structural_causal_process(links=links, T=500, seed=seed)
# Initialize dataframe object, specify variable names
dataframe = pp.DataFrame(data, var_names=var_names)
# Use a range of fixed thresholds, these are used as pc_alpha (with a slight abuse of the parameter name)
# This can be adapted, higher thresholds lead to stricter link decisions and, hence, sparser graphs
fixed_thresholds = [0.01, 0.025, 0.05, 0.1]
boot_samples = 100# The block-length of the bootstrap can optionally be used to better deal with autocorrelation, 
# but its effect was not yet evaluated.
boot_blocklength = 1## Create PCMCI object to call run_bootstrap_of
pcmci = PCMCI(dataframe=dataframe,cond_ind_test=CMIknn(significance='fixed_thres', model_selection_folds=5),verbosity=0,)# Call bootstrap for the chosen method (here 'run_pcmciplus') and pass method arguments  
results = pcmci.run_bootstrap_of(method='run_pcmciplus', method_args={'tau_max':tau_max, 'pc_alpha':fixed_thresholds}, boot_samples=boot_samples,boot_blocklength=boot_blocklength,seed=123)# Output graph, link frequencies (confidence measure), and mean test statistic values (val_mat)
boot_linkfreq = results['summary_results']['link_frequency']
boot_graph = results['summary_results']['most_frequent_links']
val_mat = results['summary_results']['val_matrix_mean']
# Plot
tp.plot_graph(graph = boot_graph,val_matrix= val_mat,link_width = boot_linkfreq,var_names=dataframe.var_names,vmin_edges=0.,vmax_edges = 0.2,edge_ticks=0.05,cmap_edges='OrRd',vmin_nodes=0,vmax_nodes=.2,node_ticks=.1,cmap_nodes='OrRd',); plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/741780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】学习Spring框架那点小事儿

Spring作者:Rod Johnson Rod Johnson 是一位软件开发人员和作家,他在软件开发领域有着广泛的影响力。他出生于澳大利亚,拥有计算机科学和音乐双学位(能写出有优雅的代码一定有艺术细胞)。 Rod Johnson 在 2002 年出版…

【Python】python实现Apriori算法和FP-growth算法(附源代码)

使用一种你熟悉的程序设计语言,实现(1)Apriori算法和(2)FP-growth算法。 目录 1、Apriori算法2、F-Growth算法3、两种算法比较 1、Apriori算法 def item(dataset): # 求第一次扫描数据库后的 候选集,&am…

深圳服务器托管-优质的BGP机房

服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统资源。服务器的上行路由与下行路由都能选择最优的路径,所以能真正实现高速的单IP高速访问。 BGP协议本身具有冗…

OpenCV实战--利用级联分类器检测眼睛、行人、车牌等等

1、前言 opencv 提供级联分类器除了识别人脸外,还可以检测其他的物体 级联分类器的介绍:OpenCV实战--人脸跟踪(级联分类器) 检测人脸,戴上眼镜的演示: 这里只演示几个,更多的级联分类器文件可以百度自行查看 2、眼睛跟踪 haarcascade_eye.xml 检测眼睛的级联分类器文…

C#、C++、Java、Python 选择哪个好?

作者:网博汇智 链接:https://www.zhihu.com/question/298323023/answer/2789627224 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 一个好的程序员不能把自己绑定在一种语言上,不…

解决Nginx 404反向代理问题的方法

问题背景 当你在使用Nginx进行反向代理时,有时候会遇到404错误,这是因为Nginx无法找到对应的资源。这个问题通常出现在配置反向代理的过程中,导致用户无法正常访问所需的资源,给网站的稳定性和用户体验带来负面影响。 解决方法 …

复杂网络——半局部中心法

一、概述 由于最近写论文需要使用复杂网络知识中的半局部中心法,但是截止目前来说,网上几乎搜索不到有关的MATLAB程序代码,只有一篇用Python编写的程序,我的电脑中没有python,所以我花费一些时间,利用matla…

海豚调度系列之:任务类型——SPARK节点

海豚调度系列之:任务类型——SPARK节点 一、SPARK节点二、创建任务三、任务参数四、任务样例1.spark submit2.spark sql 五、注意事项: 一、SPARK节点 Spark 任务类型用于执行 Spark 应用。对于 Spark 节点,worker 支持两个不同类型的 spark…

53、WEB攻防——通用漏洞CRLF注入URL重定向资源处理拒绝服务

文章目录 CRLF注入原理&检测&利用URL重定向web拒绝服务 CRLF注入原理&检测&利用 URL重定向 就是url中存在urlhttps://xxx,重定向的页面没有限制。主要用来做钓鱼。 web拒绝服务 例如,图片的长宽参数由前端传入,恶意的数据…

分布式调用与高并发处理(二)| Dubbo

文章目录 Dubbo概念_什么是分布式系统单机架构集群架构分布式架构单机、集群和分布式的区别 Dubbo概念_什么是RPCRPC两个作用:常见 RPC 技术和框架: Dubbo概念_简介Dubbo能做什么Dubbo支持的协议 Dubbo概念_核心组件注册中心Registry服务提供者Provider服…

别再写传统简历了!AI简历5个超实用的功能,助你求职一臂之力(强烈建议收藏)

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历更具吸引力。这其实是一个普遍现象:许多求职者仍停留在传统简历…

瑞萨:推迟加薪并裁员 | 百能云芯

随着全球半导体市场进入缓慢复苏阶段,日本汽车和工业芯片巨头瑞萨电子近期宣布了一系列重要的经营决策。据外媒报道,瑞萨电子已决定推迟今年4月至10月的定期加薪,并在自2023年11月以来进行了有限规模的裁员,以应对市场的变化和压力…

LC3014 输入单词需要的最少按键次数Ⅰ与方法内容的易读性

题目 刷题做到力扣 3014,题目要求设计电话键盘上的按键映射,返回按出 word 单词的最小按键次数,1 ≤ word.length ≤ 26,且仅由小写英文字母组成,所有字母互不相同 我的题解 简单题,略加思索拿下&#x…

代码随想录算法训练营第36天—动态规划04 | ● 背包问题 ● 01背包 (二维数组解法和滚动数组解法) ● *416. 分割等和子集

背包问题 常见的背包问题类型(大厂面试重点掌握01背包和完全背包即可)题目描述:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品能用*次,求解怎么装物品使得装入…

识别恶意IP地址的有效方法

在互联网的环境中,恶意IP地址可能会对网络安全造成严重威胁,例如发起网络攻击、传播恶意软件等。因此,识别恶意IP地址是保护网络安全的重要一环。IP数据云将探讨一些有效的方法来识别恶意IP地址。 IP地址查询:https://www.ipdata…

S5PV210_视频编解码项目_裸机开发:实现按键的外部中断处理

加粗样式本文所作内容: 基于S5PV210芯片实现按键的外部中断处理程序,搭建中断处理流程框架 S5PV210对于中断处理的操作流程 1 外部中断得到触发: 1)外部中断在初始化阶段得到使能 2)外界达到了外部中断的触发条件 …

汉诺塔问题代码写法的详细解析

汉诺塔游戏规则: 规则: 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着…

30天学会QT(进阶)--------------第二天(创建项目)

1、如何规范的创建一个项目 由于本人也是从其他的项目上学来的,所以也不算是业界规范,每个公司或者个人都有自己的方式去创建项目,项目的创建是本着简洁,明了,方便而言的,所以对于我来说,不繁琐…

案例--某站视频爬取

众所周知,某站的视频是: 由视频和音频分开的。 所以我们进行获取,需要分别获得它的音频和视频数据,然后进行音视频合并。 这么多年了,某站还是老样子,只要加个防盗链就能绕过。(防止403&#xf…

fs模块 文件写入 之 追加写入

文件的同步、异步追加写入: 一、异步追加 (1)语法:fs.appendFile(path,data,[options],callback(data,err)) (2)操作 1》引入fs模块 const fsrequire(fs); 2》调用appendFile fs.appendFile(./我可以…