Direct-LiNGAM算法理解

无论是ICA-LiNGAM还是Direct-LiNGAM,都是属于LiNGAM,那什么是LiNGAM呢?首先我们要搞懂这个问题。

问题一:什么是LiNGAM?

答:LiNGAM是Linear Non-Gaussian Acyclic Model的缩写,其是一种估计结构方程模型或线性贝叶斯网络的新方法。它假设(a)数据的生成过程是线性的;(b)不存在未观测到的混淆因子;(c)误差项(扰动项 disturbance variables or 噪声项)是方差非0的非高斯分布。

那为什么LiNGAM可以保证在数据服从其假设的条件下可以做到恢复除数据中的因果结构呢?那为了回答这个问题,我们就要看看再LiNGAM假设下,变量间的因果关系要如何定义了。假设x与y之间存在因果关系,并且x是y的原因,那么其因果关系就可以用结构方程定义如下:

y:=ax+u_{x},因为LiNGAM中假设了误差项u_{x}是非高斯的,所以判断两个变量之间的因果关系方向的时候,因为非高斯具有不对称性,所以利用回归计算两个方向所得的残差时,至少有一个是方向的变量是与残差独立的。举个两个变量的例子,假设真正的因果图如下:

 那么对于上面这个因果图和LiNGAM的假设,我们可以得知,U_1 \perp \!\!\! \perp U_2,X_1 \perp \!\!\! \perp U_2这些独立关系。

那么当然我们一开始无法确定X1与X2之间边的方向,那么LiNGAM是如何利用噪声项的非高斯确定这个方向的呢?

首先我们对于两个方向都做一次回归,也就是说用x1对x2做一次回归,然后再使用x2对x1做一次回归。假设回归方程如下所示:

x_2=ax_1+{\tilde{u_2}} \\ x_1=bx_2+{\tilde{u_{1}}}那么将ax1与bx2移到左边,那么我们可以得到\tilde{u_2},\tilde{u_1},那么我们只要判断x1与x2是否独立于这两个噪声项就可以确定边的方向,因为在真正的因果图中,x1是于u2独立的,而x2与u1是依赖的,所以由此就可以确定边的方向。

但是说到这里,好像并没有体现噪声项的非高斯性在这里有什么帮助,但其实我们能根据这个残差项与变量间的独立性来判断方向就是因为噪声项的非高斯性。因为有了非高斯性,所以即使我们的因果关系的函数是线性的,但是也不存在可以使用逆函数去表达,因为噪声项的非高斯性具有不对称性。

当然在LiNGAM中,其真正的方法不是我上面写的那样,我上面所写的只是为了说明非高斯的帮助,其真正的算法见:http://www.google.com/url?q=http%3A%2F%2Fwww.cs.helsinki.fi%2Fgroup%2Fneuroinf%2Flingam%2FJMLR06.pdf&sa=D&sntz=1&usg=AFQjCNEzI2JLQIYLqffmZ31t0YHOWBRJDw

 在粗略回答了什么是LiNGAM以及其中非高斯的作用是什么后,当然大家可能会想既然非高斯有用,那么非线性大概率也是有帮助的了。的确,非线性也可以为我们识别因果结构提供帮助,这个会在接下来的ANM中讲到。

说完问题一,那么问题二自然就是什么是Direct-LiNGAM咯!

问题二:什么是Direct-LiNGAM?它与LiNGAM有什么区别?

 Direct-LiNGAM与LiNGAM的区别就是在于估计下述公式中的B矩阵的方式不同,其本质都是一样的。

\textbf{x}=B\textbf{x}+\textbf{e},这个表达式其实就是上面公式的矩阵化表达而已,这个B矩阵其实就是一个系数矩阵。

那么在Direct-LiNGAM中,是如何估计这个矩阵B呢?在说明其估计的算法前,首先要给出一个定理与两个引理。

这个定理讲的就是如果一个变量进行了不同的线性组合的结果不是相互依赖的,那就证明该变量是高斯的。

 引理1讲的就是当输入的数据是严格符合LiNGAM的假设时,可以利用两个变量做回归相减后的残差与变量之间独立性检验去寻找一个图中的“可观察的外生变量”(即无父节点,只有子节点的变量)。

 引理2讲的就是当输入的数据是严格符合LiNGAM的假设时,利用引理1发现一个“外生变量”后,从图中剔除该外生变量后,LiNGAM的假设对于残差组成的矩阵依然成立。这里的残差r就相当于一开始的变量x。

在了解上面的定理和引理后,下面就可以介绍Direct-LiNGAM识别矩阵B的方法了。下图就是其算法过程

 

简单的来说就是,首先根据引理1,利用残差与变量的独立性找到图中存在的“外生变量”,然后通过讲残差向量与残差矩阵对变量集合x与数据矩阵X重新赋值来剔除这个外生变量对其余变量的影响。然后不断重复该步骤,直至剩下最后一个变量,这样我们就可以得到一个在某种程度上代表了因果关系放心的Causal Order列表。举个例子,如果现在得到的Causal Order列表是[x1,x3,x2],那么我们就可以认为可能存在这种路径:x1->x3,x1->x2,x3->x2。这就是Causal Order所隐含的意义。

那么再得到Causal Order列表后怎么去估计矩阵B呢?这就很简单了,我们在最开始的数据X上使用Causal Order列表中的前一批变量对后一个变量做回归,然后将回归系数做为矩阵B中元素的值。那么什么叫做用前一批变量对后一个变量做回归呢?还是上面的例子,我们的Causal Order列表为:[x1,x2,x3],那么B矩阵就为3×3的矩阵,那么首先用x1对x2做回归确定b_{21}的值,然后使用x1,x2对x3做回归,确定b_{31},b_{32} 的值,当然,由于数据中一般都会存在误差,所以在估计完B矩阵后,还有对B矩阵进行剪枝,就是将那些非常小的值置为0,可以认为相应的变量之间不存在因果关系。

在Direct-LiNGAM中,我们还可以利用先验知识来减少我们算法的运行时间,在论文中,它是这样说的:

使用的引理如下所示:

 在使用了先验知识后,Direct-LiNGAM算法的步骤在第二步就发生了改变了,其变化如下:

 在这里U_c代表的是图中可能的“外生变量集”(即无父节点的变量),在添加了先验知识后,寻找“外生变量”就只需要从U_c中寻找即可,相比原先的步骤可以减少一定的搜索时间。

所以添加先验知识的目的就是为了减少算法所需时间,以及更准确的寻找“外生变量”。

以上就是Direct-LiNGAM算法的核心内容分享,如果想要详细了解,见:DirectLiNGAM: A direct method for learning a linear non-Gaussian structural equation model.

 那么对于Direct-LiNGAM而言,有没有什么缺点呢?答案是当然有的,第一点就是其计算效率慢,比ICA-LiNGAM要慢。第二点就是其假设比较严格,因为现实世界中,数据产生的机制大多数是非线性的且不符合其假设。

以上就是所有有关Direct-LiNGAM的内容,谢谢大家抽时间阅读,如果哪些写的不对、不好可以指出来,万分感谢!

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 梁氏因果分析是一种基于贝叶斯网络的因果推断方法,它可以用于分析多个变量之间的因果关系,包括直接因果、间接因果和共同因果等。在Python中,我们可以使用因果发现工具包(Causal Discovery Toolbox)来实现梁氏因果分析。 Causal Discovery Toolbox是一个基于Python的因果发现工具包,它提供了多种因果发现算法,包括梁氏因果分析、PC算法、FCI算法等。使用该工具包可以快速、准确地分析数据集中的因果关系。 以下是使用Causal Discovery Toolbox实现梁氏因果分析的示例代码: ```python import numpy as np import pandas as pd from cdt import LiNGAM # 生成数据 np.random.seed(1234) n_samples = 500 X = np.random.normal(size=(n_samples, 3)) X[:, 2] = X[:, 0] + X[:, 1] # 生成一个共同因果变量 # 梁氏因果分析 model = LiNGAM() result = model.fit(X) # 打印因果图 print(result.get_directed_acyclic_graph()) ``` 在上述代码中,我们首先生成了一个包含3个变量的数据集,其中第3个变量是第1个和第2个变量的和。然后,我们使用LiNGAM模型对数据进行因果分析,并打印出得到的因果图。 需要注意的是,梁氏因果分析假设数据中不存在未观测到的共变量和非线性关系,因此在实际应用中需要谨慎使用。 ### 回答2: 梁氏因果分析是一种基于贝叶斯网络的概率图模型分析方法,用于分析因果关系与因果推断。而在Python编程语言中,可以使用多个开源库来实现梁氏因果分析。 首先,可以使用`pgmpy`库来构建贝叶斯网络,并进行因果关系的建模和分析。`pgmpy`提供了丰富的类和方法,使得建立贝叶斯网络变得简单和直观。使用`pgmpy`,可以定义各个节点(变量),并通过添加边来表示节点之间的依赖关系。接下来,使用贝叶斯定理来计算因果推断。 其次,`CausalImpact`是一个用于处理因果影响分析的Python库。它提供了先进的统计方法和模型,用于估计和量化介入(如政策变化)对时间序列数据的影响。使用`CausalImpact`,可以对实验(介入)组和对照组之间的因果效果进行分析,并生成相关图表和统计数据。 此外,还可以使用`doWhy`库来实现梁氏因果分析。`doWhy`是一个因果推断库,可用于估计因果效应,并提供了基于贝叶斯网络的因果分析工具。`doWhy`具有简单易用的API,可用于定义因果关系模型、进行因果推断和处理虚假关联等问题。 总结而言,使用Python编程语言可以使用`pgmpy`、`CausalImpact`和`doWhy`等开源库来实施梁氏因果分析。这些库提供了简单易用的接口和丰富的功能,可以帮助研究人员和数据分析师对因果关系进行建模、推断和分析。 ### 回答3: 梁氏因果分析是基于因果推断的统计方法,旨在通过观察和分析数据,确定事件之间的因果关系。Python是一种常用的编程语言,梁氏因果分析也可以使用Python来实现。 在梁氏因果分析中,首先需要收集或观测相关的数据,并对数据进行预处理,例如数据清洗、去除异常值等。接下来,可以使用Python中的统计分析库,如pandas和numpy,对数据进行处理和分析。可以通过计算变量的相关系数、进行线性回归分析等方法,来了解变量之间的关系。 在进行梁氏因果分析时,需要注意相关变量之间的因果关系,并排除其他可能的干扰因素。Python中的因果推断库如causalnex提供了实现梁氏因果分析的算法和方法。可以使用这些库来构建因果模型,并根据观察到的数据进行因果推断,分析不同因素对目标变量的影响。 梁氏因果分析的过程中,还需要进行因果关系的验证和评估。可以使用Python中的机器学习库,如scikit-learn和tensorflow,构建分类模型或回归模型,进一步评估因果模型的准确性和稳定性。 总而言之,梁氏因果分析是一种用于确定事件之间因果关系的统计方法。可以使用Python进行数据处理、因果模型的构建和评估。通过分析数据并运用相应的统计和机器学习算法,可以有效地进行梁氏因果分析,进而了解变量之间的因果关系
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值