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 np

from 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 x

links = {0: [((0, -1), 0.3, lin), ((2, 0), 0.5, lin), ((3, -1), -0.5, lin)],   # X1
         1: [((1, -1), 0.3, lin)],                                             # X2
         2: [((2, -1), 0.3, lin), ((1, -2), 0.4, lin)],                        # X3
         3: [((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.01

pcmci = 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)],   # X1
         1: [((1, -1), 0.3, lin)],                                             # X2
         2: [((2, -1), 0.3, lin), ((1, -2), 0.4, nonlin)],                        # X3
         3: [((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()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elastic Stack--04--ES中的检索方式、Query DSL

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.ES中的检索方式第一种方式GET bank/_search # 检索bank下的所有信息,包括 type 和 docsGET bank/_search?q*&sortaccount_number:asc 第二种方式…

Redis经典面试题-卷2

前言 继续上一篇《Redis经典面试题-卷1》,今天整理一下关于redis的第2卷面试题。废话不多说,直接看干货 热Key问题 如果单单从工作的角度的话,面试官一般会问下面两个内容: 什么是热Key问题?如何解决热key问题&…

Android 摄像头等比例缩放 摄像头画面比例

在拍摄照片的时候我们往往会在后期进行二次构图,在裁剪的时候有不同的相片长宽比供我们选择,不同的长宽比带给观众的感受也不一样。这里为大家介绍一下照片拍摄中常用到长宽比例。 3:2(6:4) 这张照片是用Canon 50D拍摄的&#xf…

收藏贴!6个谈薪小技巧,助你拿到满意薪资

Salesforce的就业市场一直在迅猛发展,对Salesforce专业人士的需求持续不断,对优秀人才的需求更大。 本篇文章总结了6个谈薪小技巧,可以帮助SF从业者、求职者拿到满意的薪资。 01 了解市场价格 首先,需要了解当前就业市场的情况…

【Linux】进程控制与进程调度

Linux进程介绍 进程的基本概念 Linux是多用户、多任务的操作系统。在这样的环境中,各种计算机资源的分配和管理都是以进程为单位进行的。 Linux操作系统包括三种不同类型的进程: 1)交互进程:一种由Shell启动的进程。交互进程既可…

十、软考-系统架构设计师笔记-软件架构演化和维护

1、软件架构演化 软件架构的演化和维护的目的是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改。软件架构的演化和维护过程是一个不断迭代的过程,通过演化和维护,软件架构逐步得到完善,以满足用户需求。软件架构的演化就是软件…

JavaScript---VConsole插件配置使用,一步到位简单实用!

1. 寻找到自己需要的VConsole插件js文件 个人喜欢BootCDN这个平台(直接在线引用或者下载本地引入均可~) vConsole (v3.15.1) - A lightweight, extendable front-end developer tool for mobile web page. | BootCDN - Bootstrap 中文网开源项目免费 C…

浏览器的工作原理

从输入一个url到页面加载完成,中间都发生了什么? 参考原文地址 首先在浏览器地址栏输入一个地址并回车之后, 1. DNS查找 浏览器会进行DNS查找,把域名https://example.com转化为真实的IP地址10.29.33.xx,根据IP地址找…

探索C++中的动态数组:实现自己的Vector容器

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

Android Studio下运行java main 方法

方法一 修改项目的.idea中的gradle.xml文件&#xff0c;在GradleProjectSettings标签下添加一行代码 <option name"delegatedBuild" value"false" />方法二 main方法上右键选择Run ‘xxx’ with Coverage

视觉图像处理和FPGA实现第三次作业--实现一个加法器模块

一、adder模块 module adder(ina, inb, outa); input [5:0] ina ; input [5:0] inb ; output [6:0] outa ;assign outa ina inb; endmodule二、add模块 module add(a,b,c,d,e); input [5:0] a ; input [5:0] b ; input [5:…

1.1计算机系统构成及硬件系统知识(上)

基础知识部分----chap01 主要议题&#xff1a; 数制转换&#xff1a;一般会涉及存取的计算&#xff1b;ip地址中变长子网掩码的计算题&#xff1b;&#xff08;难度较大&#xff09; 数的表示&#xff1a;二进制、十六进制&#xff1b; 计算机的组成&#xff1a;考察的较为深入…

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

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

nginx启动闪退

在nginx目录下cmd&#xff0c;nginx -t&#xff0c;找到原因是&#xff1a;“在端口80上运行NGINX时&#xff0c;因为端口80是HTTP默认端口&#xff0c;需要管理员权限才能访问” 所以修改端口号&#xff1a; 在nginx.conf文件中&#xff0c;修改listen&#xff1a;80为8080 …

【漏洞复现】网康科技 NS-ASG 应用安全网关 SQL注入漏洞(CVE-2024-2330)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

2024年 JavaScript 最新功能一览

前言 随着 Web 技术的日新月异&#xff0c;JavaScript 也在不断地吸收新的特性和技术&#xff0c;以满足日益复杂和多样化的开发需求。在 2024 年&#xff0c;JavaScript 迎来了一系列令人瞩目的新功能&#xff0c;这些功能不仅提升了开发者的效率&#xff0c;也极大地丰富了 …

无缝集成 MongoDB Relational Migrator,Tapdata 提供关系型到 MongoDB 实时迁移优化方案

在去年的 MongoDB 用户大会纽约站上&#xff0c;MongoDB 正式宣布全面推出新工具 MongoDB Relational Migrator&#xff08;MongoDB RM&#xff09;&#xff0c;用以简化应用程序迁移和转换——即从传统关系型数据模型到现代的文档数据模型&#xff0c;助力组织快速提升运营效率…

Seata源码流程图

1.第一阶段分支事务的注册 流程图地址&#xff1a;https://www.processon.com/view/link/6108de4be401fd6714ba761d 2.第一阶段开启全局事务 流程图地址&#xff1a;https://www.processon.com/view/link/6108de13e0b34d3e35b8e4ef 3.第二阶段全局事务的提交 流程图地址…

考研失败, 学点Java打小工——Day2

1 关键字 标识符 基本数据类型 感觉和C没啥区别  1.1 关键字    public、static、void…  1.2 标识符    ①不能用关键字    ②由字母、数字、下划线、$组成&#xff0c;但是不能以数字开头    ③给变量起名字的时候要起有意义的名字&#xff1a;“见名知意” 1.…

常青内容与病毒式内容——哪个更适合 SEO?

常青内容是经得起时间考验的内容&#xff0c;而病毒式内容则是利用特定时代潮流的内容。 如果你曾经考虑过为网站添加内容&#xff0c;你可能听说过常青内容和病毒式内容这两个词。这两个词涵盖了网站所需的基本内容类型。 那么&#xff0c;这两者之间有什么区别&#xff1f;…