想象你走进一个老式机械车间,老师傅面前摆着一台来历不明的机器。从外壳能观察到的,只有几根露出来的转轴在转动,以及机器内部传来的各种响声。要判断哪根轴带动了哪根轴、传动链条是怎样的,仅靠“它们有时候一起转”远远不够。老师傅的绝招是:仔细听每个零件发出的“咔哒声”。如果每个零件都有自己的独特响动——不是那种均匀、模糊的嗡嗡声,而是偶尔一声脆响、或者一下偏斜的“咚”——他就能从声音冒出来的先后、以及声音是否被其他零件“带偏”,反推出整台机器的传动装配图。 LiNGAM 就是这个故事中的“听诊法”。它全称是 Linear Non-Gaussian Acyclic Model,可以处理一组观测变量:假设变量之间是线性因果、且每个变量都有一个独立的“非高斯噪声”作为自己的签名。只要这些假设成立,LiNGAM 就能从纯观测数据里同时算出因果顺序和连接强度,输出一个唯一的有向无环图(DAG)。这相比只靠相关性或条件独立的传统方法,是一个关键突破——它把“谁影响谁”猜得更加笃定。

岗位关联

对 AI 从业者而言,LiNGAM 是从观测数据中提取因果方向的核心武器;掌握它,意味着你能在可解释分析、归因和决策场景中,把“相关”升华为“因果”。

目录
  1. 可视化演示
  2. 模型设定:一张机器的装配图
  3. 非高斯核心:齿轮的独特声音
  4. 可识别性:为什么装配图只有一张
  5. ICA方法:用盲源分离听声辨位
  6. DirectLiNGAM:逐步剥离法
  7. 因果顺序:流水线上的下三角
  8. 方法对比:约束法只知相关不知方向
  9. 应用与局限:在真实车间里
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态展示LiNGAM模型如何利用非高斯性识别因果方向:源变量混合产生高斯化观测,ICA解混恢复非高斯源,进而确定唯一因果顺序与有向边。

本节配有交互动效(进入视口后自动加载,约 3KB)。

LiNGAM因果发现 非高斯源变量 混合观测变量 ICA解混结果 因果有向边 X = B·X + e (e非高斯) 非高斯性使因果方向唯一可识别

模型设定:一张机器的装配图

老师傅修机器时,不会凭空猜测,而是先画出零件之间的传动关系。如果齿轮 x1 带动了齿轮 x2,他就写下“x2 的转动量 = 0.7 倍的 x1 转动量 + x2 自己的咔哒扰动”。这句话有两层意思:一是 x2 确实由 x1 影响,二是 x2 身上还有一股不属于 x1 的“原生活力”。LiNGAM 的模型设定正是如此——每个变量都等于它所有父节点的线性组合,再加上一个独立的噪声项。

用数学写出来,对第 i 个变量有:

其中 \(b_{ij}\neq 0\) 表示存在从 \(x_j\) 到 \(x_i\) 的因果边;所有 \(b_{ij}\) 拼在一起就是连接强度矩阵 \(B\)。同时要求这些变量之间有向无环,也就是不能出现“x1 带 x2、x2 带 x3、x3 又带回 x1”这种卡死的循环。这个 DAG 假设保证了因果方向能排出先后顺序。

回到车间视角:只要记录下每个轴转了多少、机器内部怎么响,老师傅就能用这张表反推传动关系。接下来最关键的问题,就是为什么“咔哒声”必须非高斯。

xi=∑j≠ibijxj+eix_i = \displaystyle\sum_{j\neq i} b_{ij} x_j + e_i
通俗说,\(b_{ij}\) 是传动杠杆的倍率,\(e_i\) 是每个齿轮自己发出的独特响动,\(B\) 就是整张装配图的“零件清单”。
  1. 求和符号对所有可能的影响者求和,\(b_{ij}=0\) 表示没有从 \(x_j\) 到 \(x_i\) 的直接传动关系。
    ∑j≠ibijxj\displaystyle\sum_{j\neq i} b_{ij} x_j
  2. 线性贡献\(b_{ij} x_j\) 表示上游 \(x_j\) 对下游 \(x_i\) 的贡献,值越大,传导越强。
    bijxjb_{ij} x_j
  3. 外生项\(e_i\) 是 \(x_i\) 自带的独立噪声,好比齿轮自己的“咔哒”,必须独立且非高斯。
    eie_i

非高斯核心:齿轮的独特声音

如果所有齿轮都发出同一种均匀、对称、钟形的嗡嗡声,老师傅会非常头疼。因为多个这样的声音叠加后还是相同的嗡鸣,就像高斯噪声叠加后仍服从同一个分布,谁也没法分辨声源。相反,如果齿轮发出的“咔哒”是有边界的均匀抖动,或者是斜向一侧的指数式短促冲击,那么这些声音即使混在一起,也有各自鲜明的“签名”。

LiNGAM 要求每个外生项 \(e_i\) 连续、相互独立,并且是非高斯分布。这样,观测变量的联合概率密度就可以写成每个噪声密度的乘积,再除以一个由 \(B\) 决定的伸缩因子:

这个公式的本质是:先从观测 \(x\) 中解出每个“咔哒” \(e_i\),然后利用独立性把联合概率拆成多个单零件概率的乘积。如果噪声中有两个以上高斯源,旋转后的分布仍然像同一批声音,上面的分解就会出现多解;最多只能有一个高斯源,才能保证声音签名彼此可分。

于是,独特音色让每个齿轮在混合声中保持可分辨。下一步,我们要把这种直觉变成严格的“唯一性”。

p(x)=∏i=1ppei(ei)∣det⁡(I−B)∣p(x) = \displaystyle\frac{\prod_{i=1}^{p} p_{e_i}(e_i)}{\left|\det(I - B)\right|}
可以说,非高斯是“每个齿轮独一无二的音色”,而独立性是“每个齿轮各自发声,互不干扰”。有了这两点,声源分离才成为可能。
  1. 由观测反推噪声从 \(x = Bx + e\) 解出 \(e = (I-B)x\),每个噪声由观测变量和连接矩阵决定。
    ei=xi−∑j≠ibijxje_i = x_i - \sum_{j\neq i} b_{ij} x_j
  2. 独立乘积分子把 \(p\) 个噪声的密度相乘,因为 \(e_i\) 相互独立,联合密度可拆解。
    ∏i=1ppei(ei)\prod_{i=1}^{p} p_{e_i}(e_i)
  3. 伸缩因子分母的雅可比行列式把噪声空间的密度换算到观测空间。
    ∣det⁡(I−B)∣\left|\det(I - B)\right|

可识别性:为什么装配图只有一张

同一台机器,从外面看也许有几种内部装配都能产生相同的转动表现。如果只有高斯嗡嗡声,这些装配方案根本无法区分。但有了非高斯咔哒声,情况就不同了:只有真实的传动顺序,才能让每个齿轮的噪声源在分离后真正独立;其他顺序都会留下“残留的相互牵扯”。

LiNGAM 的核心可识别性定理说:在线性、DAG、外生项独立非高斯(最多一个高斯)的假设下,观测分布能唯一确定因果顺序和连接矩阵 \(B\)。把模型改写成:

这里 \(A\) 是“混合矩阵”,表示每个噪声源如何混合成观测变量。非高斯保证 \(A\) 可以被唯一识别;如果是高斯噪声,\(A\) 可以任意乘一个正交旋转矩阵 \(Q\),得到同样的观测分布,因果方向就说不清了。

唯一的 \(A\) 意味着能还原唯一的 \(B\)。那么,具体怎么把独立声源从混合观测中提出来?这就轮到 ICA 登场。

x=Ae,A=(I−B)−1x = A e, \quad A = (I-B)^{-1}
可以这样记:高斯噪声像同一个模具压出的零件,换一块相似的零件,机器听起来一样;非高斯噪声像手工打造的异形零件,只有原装的那块才能严丝合缝。
  1. 移项把 \(x = Bx + e\) 移项得到 \((I-B)x = e\)。
    (I−B)x=e(I-B)x = e
  2. 逆矩阵\(A = (I-B)^{-1}\),得到 \(x = Ae\),即观测是噪声源的线性混合。
    A=(I−B)−1A = (I-B)^{-1}
  3. 旋转模糊当 \(e\) 为高斯时,\(AQ e\) 与 \(A e\) 分布相同,\(A\) 不唯一;非高斯使这一等式只在 \(Q=I\) 时成立。
    AQe∼Ae仅当高斯A Q e \sim A e \quad \text{仅当高斯}

ICA方法:用盲源分离听声辨位

老师傅在机器外壳上放了几只麦克风,每只麦克风录到的是多个齿轮声音的混合。要从混合录音里把每个齿轮的咔哒声分别拎出来,需要一种“盲源分离”技术。ICA(独立成分分析)做的就是这件事:给定观测到的混合信号,在源信号非高斯且独立的假设下,估计出混合矩阵和独立成分。

在 LiNGAM 中,观测 \(x = A e\),所以可以直接对 \(x\) 跑 ICA,估计 \(\hat A\) 与独立成分 \(\hat e\)。令 \(W = \hat A^{-1}\),则可以恢复连接矩阵:

这里 \(P\) 是置换矩阵,\(L\) 是严格下三角矩阵。为什么需要 \(P\)?因为 ICA 的输出有“先按哪个变量排序”的模糊性,而 DAG 要求因果顺序对应一个拓扑排序,恰好可以用下三角结构来消除这种排列模糊。

不过,借助 ICA 只是其中一条路线。另一位老师傅更喜欢更直接的听诊法,这就是 DirectLiNGAM。

W=A^−1,B^=I−W,B^=PTLPW = \hat A^{-1}, \quad \hat B = I - W, \quad \hat B = P^T L P
用车间话说,ICA 把混在一起的声音按音色分开;之后按“传动必须从上游到下游”这条规则,给独立声源排队,顺序清楚了,连接强度也就水落石出。
  1. 求混合逆\(W\) 把观测变量变回独立噪声源。
    W=A^−1W = \hat A^{-1}
  2. 还原连接矩阵由 \(x = W^{-1}e\) 和 \(x = Bx + e\) 可推得 \(\hat B = I - W\)。
    B^=I−W\hat B = I - W
  3. 下三角化合适的变量置换 \(P\) 能让 \(\hat B\) 变成严格下三角 \(L\),这就是因果顺序。
    B^=PTLP\hat B = P^T L P

DirectLiNGAM:逐步剥离法

老师傅戴上听诊器,不去做完整的盲源分离,而是先找到最上游的那个齿轮。最上游的齿轮有个特点:它的咔哒声不会被其他齿轮影响,因此当它去解释任何一个其他零件时,解释完剩下的残差和它自己是独立的。反过来,如果一个齿轮下游还有别的零件,那么用下游零件去回归它,残差会带着它的痕迹。

DirectLiNGAM 的迭代思路就是反复找最外生变量:对所有剩余变量计算“我回归你、你回归我”的残差独立性,把独立性最强的那位拎出来作为当前最上游变量;然后用回归剥离它对其他变量的影响,再对剩下的子机器重复。每一步的回归斜率是:

这个公式计算的是:把 \(x_i\) 中能被 \(x_j\) 解释的线性部分去掉,剩下 \(r_i^{(j)}\)。如果 \(x_j\) 是最外生的原因,那么 \(r_i^{(j)}\) 与 \(x_j\) 独立;如果 \(x_j\) 其实是结果,残差中会残留依赖。

剥完所有层之后,因果顺序已经确定。接下来要理解,这个顺序如何体现在最终的 DAG 和矩阵结构里。

ri(j)=xi−Cov(xi,xj)Var(xj)xjr_{i}^{(j)} = x_i - \frac{\mathrm{Cov}(x_i, x_j)}{\mathrm{Var}(x_j)} x_j
这个算法像剥洋葱:每次只剥最外一层,剥完了,里面还是一个稍小一点的机器,继续听、继续剥,最后得到完整的传动顺序。
  1. 回归斜率最小二乘斜率衡量 \(x_j\) 对 \(x_i\) 的平均线性影响。
    Cov(xi,xj)Var(xj)\frac{\mathrm{Cov}(x_i, x_j)}{\mathrm{Var}(x_j)}
  2. 构造残差从 \(x_i\) 中减去 \(x_j\) 的线性影响,残差代表 \(x_i\) 中“不属于 \(x_j\)”的部分。
    xi−βijxjx_i - \beta_{ij} x_j
  3. 独立性判断如果 \(x_j\) 是外生原因,则残差与 \(x_j\) 独立,记作 \(\perp\!\!\!\perp\)。
    ri(j)⊥ ⁣ ⁣ ⁣⊥xjr_i^{(j)} \perp\!\!\!\perp x_j

因果顺序:流水线上的下三角

一旦确定谁在上游、谁在下游,整张装配图就成了一条不循环的流水线。数学上,DAG 一定存在拓扑排序:把变量重新编号后,所有因果箭头只从编号小的指向编号大的,连接矩阵 \(B\) 就变成严格下三角矩阵。

设因果顺序为 \(k_1, k_2, \dots, k_p\),则重新排序后的矩阵满足:

这个条件非常漂亮:它同时表达了“有因果边,则原因一定排在结果之前”和“对角线为零,所以没有变量是自己影响自己”。没有环,机器才不会卡住。

现在我们已经有了完整的“装配图”。它和传统方法最大的区别,到底是什么?

Lij≠0⇒ki<kj,Lii=0L_{ij} \neq 0 \Rightarrow k_i < k_j, \quad L_{ii} = 0
相当于给所有齿轮编了工序号:只有 1 号能带动 2 号,2 号能带动 3 号,但 3 号不能回头带动 1 号。
  1. 因果层次每个变量有一个拓扑序编号 \(k_i\),表示它处在传动链的第几级。
    ki<kjk_i < k_j
  2. 置换下三角\(L = P^T B P\),变量置换后,非零连接只出现在下三角区域。
    L=PTBPL = P^T B P
  3. 无自环对角线上 \(L_{ii}=0\),说明没有任何变量直接成为自己的父节点。
    Lii=0L_{ii} = 0

方法对比:约束法只知相关不知方向

过去,很多因果发现方法是“约束法”:只看条件独立性,判断哪些变量之间有边。这就像只看两个齿轮的振动是否相关,能感觉到它们连在一起,却看不出谁带动谁。对于一条链 \(x_1 \to x_2\) 和反向 \(x_2 \to x_1\),它们在条件独立性上完全等价,约束法只能把它们归入同一个马尔可夫等价类:

PC 等算法最后只能输出一个 CPDAG(部分有向图),其中某些边保持双向/无向。LiNGAM 则不同:它利用非高斯噪声的独立性分解,直接从观测分布中唯一挑选出真实 DAG。在满足假设时,它能确定每一条边的方向。

然而,这套听诊法并非万能。在真实车间的嘈杂环境中,它也有严格的适用边界。

E(G)={G′:G′∼G}\mathcal{E}(G) = \{ G' : G' \sim G \}
约束法像用听诊器判断“两个零件有联系”,LiNGAM 像根据声源独立性和音色判断“谁是发声的源头、谁只是被带着响”。
  1. 等价关系\(G' \sim G\) 表示两个图拥有相同的条件独立约束,即马尔可夫等价。
    G′∼GG' \sim G
  2. 等价类约束法只能识别整个集合 \(\mathcal{E}(G)\),无法在集合内区分方向。
    E(G)\mathcal{E}(G)
  3. 非高斯打破等价因为 \(p(x) = \prod p_i(e_i) / |\det(I-B)|\) 只在真实 \(G\) 下可分解,LiNGAM 能选出唯一成员。
    p(x)=∏i=1ppei(ei)∣det⁡(I−B)∣p(x) = \displaystyle\frac{\prod_{i=1}^{p} p_{e_i}(e_i)}{\left|\det(I - B)\right|}

应用与局限:在真实车间里

LiNGAM 已经在量化金融、营销归因、基因调控等领域得到应用。比如分析几支基金的日收益谁先驱动谁,或者用户从曝光到点击再到购买的传导路径。它最大的吸引力是:不需要做昂贵的随机实验,只用观测数据就能给出完整的 DAG。

但必须清醒地看到局限:LiNGAM 假设关系是线性的、因果图是无环的、没有隐藏变量、外生项独立且非高斯。如果实际机制是非线性或存在反馈,模型就会给出误导性的“最像因果”答案。样本量也很重要,独立性检验需要足够样本才能稳定。常用统计量近似为:

这个式子提醒我们:残差独立性是用样本估计的,样本越大,微弱依赖越容易被检测出来,因果判断也越可靠。

Tn=n ρ^dcor(ei,ej)→dN(0,σ2)T_n = \sqrt{n} \, \hat{\rho}_{\text{dcor}}(e_i, e_j) \xrightarrow{d} \mathcal{N}(0, \sigma^2)
老师傅的听诊法再厉害,也怕车间太吵、齿轮变形、或者暗格里的隐藏零件。理解假设,才知道什么时候能信任这张装配图。
  1. 依赖度量\(\hat{\rho}_{\text{dcor}}\) 是距离相关,衡量残差与原因之间残留的依赖。
    ρ^dcor\hat{\rho}_{\text{dcor}}
  2. 大样本放大乘以 \(\sqrt{n}\) 之后,微小的依赖也会随样本量增大而变得明显。
    n ρ^\sqrt{n}\, \hat{\rho}
  3. 渐近正态在“独立”原假设下,统计量收敛到正态分布,用来决定是否拒绝独立。
    →dN(0,σ2)\xrightarrow{d} \mathcal{N}(0, \sigma^2)

AI 应用场景

金融资产因果归因

阶段:因果发现 / 特征工程

解决的问题:传统相关性分析只知道某些资产同涨同跌,却无法判断谁先驱动谁。金融收益率常表现出尖峰厚尾的“非高斯”特征,恰好满足 LiNGAM 的假设。用 LiNGAM 可以从日收益率中提取领先—滞后的因果链,指导选股与风险传导分析。

具体案例:一家量化团队收集五只行业指数的日收益率,运行 DirectLiNGAM 后得到“上游行业 → 下游行业”的顺序。后续遇到宏观冲击时,他们优先观察上游行业的异动,作为中下游行业的领先信号,用于调整行业轮动仓位。

营销渠道归因

阶段:归因分析 / 增长分析

解决的问题:用户从看到广告到达成购买,经历了曝光、点击、深度浏览等多个渠道。传统归因常按时间先后或均匀权重分配功劳,但无法判断渠道之间真实的驱动关系。LiNGAM 可以利用用户行为中突然的兴趣冲击(非高斯残差)来确定渠道间的因果顺序。

具体案例:某电商增长团队分析“信息流曝光—搜索点击—商品购买”的日志数据,LiNGAM 发现信息流曝光是上游原因,点击只是中间结果。团队随后将预算向信息流倾斜,并优化曝光内容的即时吸引力,最终转化率提升 18%。

基因调控网络重建

阶段:生物信息学 / 因果推断

解决的问题:基因表达数据中变量多、干扰大,实验干预昂贵。基因表达常常呈现非高斯分布,而 LiNGAM 适合小规模变量的线性调控推断,可以从野生型样本中重建调控方向。

具体案例:一个计算生物学团队对 200 个样本的 12 个关键基因表达量运行 LiNGAM,重建了“转录因子 → 靶基因”的调控顺序。其中若干条新预测的边随后被 ChIP-seq 数据验证,证明该方法能有效缩小实验验证范围。

Python 演示

python86 行
import numpy as np  def dvar(u):    n = len(u)    a = np.abs(u[:, None] - u[None, :])    A = a - a.mean(0) - a.mean(1)[:, None] + a.mean()    return np.sqrt(np.maximum((A * A).sum() / n**2, 0.0))  def dcor(u, v):    n = len(u)    a = np.abs(u[:, None] - u[None, :])    b = np.abs(v[:, None] - v[None, :])    A = a - a.mean(0) - a.mean(1)[:, None] + a.mean()    B = b - b.mean(0) - b.mean(1)[:, None] + b.mean()    dcov = np.sqrt(np.maximum((A * B).sum() / n**2, 0.0))    denom = np.sqrt(dvar(u) * dvar(v))    return 0.0 if denom == 0 else dcov / denom  def direct_lingam(X):    X = np.asarray(X, float)    p = X.shape[1]    order = []    active = np.arange(p)    cur = X.copy()     while len(active) > 1:        scores = []        for j in range(len(active)):            dep = 0.0            for k in range(len(active)):                if k == j:                    continue                xj = cur[:, j]                xk = cur[:, k]                beta = xj.dot(xk) / xj.dot(xj)                resid = xk - beta * xj                dep = max(dep, dcor(xj, resid))            scores.append(dep)         idx = int(np.argmin(scores))        order.append(active[idx])         xj = cur[:, idx]        cols = np.delete(np.arange(len(active)), idx)        next_cur = cur[:, cols].copy()        for t in range(next_cur.shape[1]):            beta = xj.dot(next_cur[:, t]) / xj.dot(xj)            next_cur[:, t] -= beta * xj         cur = next_cur        active = active[cols]     order.append(active[0])     order_map = {v: i for i, v in enumerate(order)}    B = np.zeros((p, p))    for j in range(p):        for i in range(j + 1, p):            cause = order[j]            effect = order[i]            xc = X[:, cause]            xe = X[:, effect]            B[effect, cause] = xc.dot(xe) / xc.dot(xc)     return np.array(order), B  def generate_data(n=800):    rng = np.random.default_rng(0)    e1 = rng.uniform(-1, 1, n)    e2 = rng.exponential(1, n)    e3 = rng.uniform(-1, 1, n)    x1 = e1    x2 = 0.8 * x1 + e2    x3 = 0.4 * x1 + 0.6 * x2 + e3    return np.column_stack([x1, x2, x3])  if __name__ == "__main__":    X = generate_data()    order, B = direct_lingam(X)    print("因果顺序:", order)    print("连接矩阵 B:\n", B)
目的:用模拟非高斯数据验证 DirectLiNGAM 的核心逻辑——通过残差独立性选出最外生变量,逐步恢复因果顺序和连接矩阵。
  1. dep = max(dep, dcor(xj, resid))计算当前变量与所有回归残差的最大依赖度;依赖越小,越可能是外生变量。
  2. idx = int(np.argmin(scores))选出依赖度最小的变量作为本轮最外生变量,并追加到因果顺序末尾。
  3. next_cur[:, t] -= beta * xj用回归剥离该变量对剩余变量的线性影响,缩小“机器”规模。
  4. B[effect, cause] = xc.dot(xe) / xc.dot(xc)确定因果顺序后,对每个下游变量回归所有上游变量,得到连接强度矩阵 B 的非对角元。

常见误区

误区我以为只要数据不是正态分布,LiNGAM 就能用,所以随便找一个偏态变量就可以放心分析。

正解LiNGAM 要求外生项相互独立且非高斯,并且最多只有一个高斯源。如果两个噪声都是高斯,ICA 会出现旋转模糊,因果顺序无法唯一识别。非高斯是“独立源的独特签名”,而不仅仅是“曲线不对称”。

为何常见:因为许多教程反复强调“非高斯”而忽略独立性和数目限制,新手很容易把非高斯简化为“非正态”。

误区变量之间有互相影响、甚至形成回路时,LiNGAM 不是也能画双向箭头吗?只要用有向图表示不就行了?

正解LiNGAM 严格遵守有向无环图假设,不允许反馈环。出现环时,\((I-B)\) 不可逆,\(x=(I-B)^{-1}e\) 的推导崩塌,模型不再适用。反馈场景应该改用时间序列因果模型或动态结构方程。

为何常见:双向箭头和环路在真实系统里很常见,但 LiNGAM 的代数结构从根上依赖 DAG,初学者容易忽略这个前提。

误区我用 FastICA 得到独立成分后,直接把混合矩阵求逆,就得到了连接矩阵 B,可以直接输出因果图。

正解ICA 结果存在天然的排列和缩放模糊:交换行、乘以常数,观测分布不变。必须用 DAG 的下三角约束和归一化来确定因果顺序,再计算 B。否则会把噪声源顺序搞错,甚至把汇合结构误判成因果边。

为何常见:看到 \(x=Ae\) 就以为 \(A\) 和 \(B\) 直接对应,忽略了 ICA 只是第一步。

误区只要数据量足够大,LiNGAM 总能恢复真实因果图,错误率会随着样本量增大趋近于零。

正解大样本只能让估计更稳定,却无法弥补模型假设错误。如果真实机制是非线性、有隐藏混杂变量,或者噪声并非非高斯,样本越大反而越自信地给出一个错误因果图。使用前应先做线性检验、正态性检验和隐藏变量筛查。

为何常见:统计一致性容易被误解为“无需假设”,把算法当作万能黑箱。

面试题

Q1. LiNGAM 中的 L 代表什么?

单选题 · easy

  • A.线性关系(变量间线性建模)← 正确答案
  • B.大样本量(需要海量观测)
  • C.低秩假设(连接矩阵低秩)
  • D.滞后效应(允许时间延迟)

答案:A。LiNGAM 的 L 代表 Linear,即变量间用线性结构方程建模;B 与 D 是常见混淆项,C 也不属于 LiNGAM 模型的核心假设。

Q2. 外生项 \(e_i\) 最关键假设是?

单选题 · easy

  • A.服从正态分布且相互独立
  • B.服从非高斯且相互独立← 正确答案
  • C.服从高斯分布且相互相关
  • D.服从任意分布且完全相关

答案:B。LiNGAM 要求外生项来自非高斯分布并且相互独立。独立与非高斯共同保证 ICA 分离唯一;若服从高斯,会出现旋转模糊。

Q3. 全部外生项为高斯时为何失效?

单选题 · mid

  • A.因果图一定会出现环
  • B.混合矩阵存在旋转模糊← 正确答案
  • C.样本协方差矩阵会奇异
  • D.独立性检验程序会报错

答案:B。高斯变量经过正交旋转后依然保持独立同分布,因此观测分布无法唯一确定混合矩阵 \(A\),也就无法唯一还原因果方向和连接矩阵。

Q4. ICA 在 LiNGAM 中主要作用是?

单选题 · mid

  • A.对高维变量进行降维
  • B.从混合观测中分离噪声源← 正确答案
  • C.计算变量间的相关系数
  • D.将有环图转化为无环图

答案:B。在 \(x=Ae\) 中,ICA 负责估计混合矩阵 \(A\) 并恢复独立非高斯噪声源。后续还需要用 DAG 约束处理排列模糊,但分离噪声源是它的核心作用。

Q5. DirectLiNGAM 如何找最外生变量?

单选题 · mid

  • A.选择方差最大的那个变量
  • B.选择残差最独立的那个变量← 正确答案
  • C.选择相关性最强的那个变量
  • D.选择偏度最小的那个变量

答案:B。最外生变量跟其他所有变量的回归残差都独立。DirectLiNGAM 把“残差独立性”作为筛选标准,逐轮选出最外生变量。

Q6. 满足假设时,LiNGAM 可输出?

多选题 · mid

  • A.唯一因果顺序← 正确答案
  • B.连接强度矩阵 B← 正确答案
  • C.所有隐藏变量
  • D.完整有向无环图← 正确答案

答案:ABD。LiNGAM 一次可得到因果排序、连接矩阵和唯一 DAG;但它不会把未观测的隐藏变量变出来,仍然假设没有潜变量干扰。

Q7. 以下哪些是 LiNGAM 的局限?

多选题 · hard

  • A.只能拟合线性关系← 正确答案
  • B.不允许存在反馈回路← 正确答案
  • C.容许任意多个高斯源
  • D.假设无隐藏混杂变量← 正确答案

答案:ABD。LiNGAM 是线性、无环、无隐藏变量的模型;最多只能有一个高斯外生项,C 说“任意多个高斯源”是错误的。

Q8. 与约束法相比,LiNGAM 特有优势是?

单选题 · hard

  • A.不需要任何统计假设
  • B.能确定每条边方向← 正确答案
  • C.能处理非线性机制
  • D.完全不需要观测数据

答案:B。约束法只能识别马尔可夫等价类,部分边方向未定。LiNGAM 利用非高斯噪声的独立性分解,在假设满足时能确定每条边方向。

Q9. 若 \(x_1=e_1\)、\(x_2=0.5x_1+e_2\),LiNGAM 会输出什么顺序?

单选题 · easy

  • A.x2 指向 x1 的反向顺序
  • B.x1 指向 x2 的正确顺序← 正确答案
  • C.x1 与 x2 完全相互独立
  • D.x1 与 x2 互为因果

答案:B。真实生成过程是 \(x_1\to x_2\),且误差非高斯。LiNGAM 能利用残差独立性识别出 x1 是最外生变量,因此输出 x1 在前。

Q10. 为什么非高斯能唯一识别 DAG 方向?

多选题 · extreme

  • A.正确方向残差与原因独立← 正确答案
  • B.高斯旋转后仍保持独立
  • C.非高斯破坏旋转模糊性← 正确答案
  • D.独立噪声可拆解联合密度← 正确答案

答案:ACD。正确方向上残差独立、非高斯打破旋转模糊、独立噪声使联合密度能分解为乘积,三者共同支持唯一识别。B 描述的是高斯失效原因,因此不选。