欢迎来到“小镇侦探社”。最近镇上的“果缘果汁店”销量突然爆表,老板娘既发了优惠券,又有美食博主去探店打卡。作为侦探,你手里只有一张张交易与互动数据表,没有监控录像——怎么判断,到底是哪只手“推”出了这场爆火?答案就藏在因果图里一个叫 v-结构 的微小交叉口中。你可以把它想象成两辆互不相识的车,却在同一个十字路口汇合:优惠券活动和探店视频本来是两条独立动线,可一旦同时对准“销量”这个路口,奇妙的事情就发生了——当你不看路口时,两辆车毫无默契;可当你盯着路口看,它们的步调忽然变得可以互相猜中。抓住这股“对撞后显露的默契”,你就抓住了因果方向的铁证。本文会用这个果汁店故事,讲清 v-结构是什么、条件独立性检验怎么用、PC 算法如何一步步画出因果图,以及统计噪声如何影响判断。
学懂 v-结构,你就握住了因果发现的核心钥匙:让 AI 不只是回答“是什么”,更能说出“为什么”,为可解释 AI、智能决策和科学发现提供根本支撑。
目录
可视化演示
动态演示因果发现中的v-结构识别方法的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
因果发现中的v-结构识别方法:v结构的 v-结构的定义与因果方向确定的 条件独立性检验识别v-结构的原 核心机制可视化 因果发现中的v-结构识别方法整体架构与关键组件
1. 认识 v-结构:两个推手与一个爆款
侦探接到果汁店案子后,先列嫌疑清单。销量 C 暴涨,最显眼的两条线索是优惠券活动 A 和探店视频 B。老板娘一口咬定:“我们的优惠券发得多,销量当然高。”探店博主也声称:“我的视频一发布,店里就排长队。”两个人说的方向都隐隐指向同一个路口 C。在因果图里,这种“两个原因同时推动一个结果”的形态,画出来就是一个实实在在的 V 字形,因此它被称为 v-结构。
技术上的写法是 A→C←B:箭头表示因果方向,“A 影响 C、B 也影响 C”。注意,这还不够——要成为真正的 v-结构,A 和 B 之间绝不能有直接因果边。也就是说,两个“推手”不能私下有联系。C 这个被两条箭头同时瞄准的节点,被称为“对撞器”,因为两股因果流像两辆卡车一样在这里轰然相撞。如果把节点之间的因果方向暂时隐藏,只看谁和谁相连,你会得到一张“无向骨架图”;从骨架图里找“一个节点连着两个互不相连的邻居”的三元组,就是寻找 v-结构的起点。
回到果汁店:优惠券和探店视频平时各干各的,老板娘只在月底汇总报表时才看到它们一起影响销量。对撞器 C 就像侦探笔记本上的一个星号标记——先圈出所有这样的交叉口,因果方向的突破就藏在其中。
- A 指向 C变量 A 作为原因直接推动 C,箭头方向从 A 出发指向 C,代表“A 的变化能引起 C 的变化”,就像优惠券投放量上升会拉动销量。
- B 指向 C变量 B 也独立地指向 C,说明 C 同时受两个来源驱动,探店视频是第二股推力。
- 汇聚结构C 拥有两个箭头进入且 A、B 不相邻,两条因果流在此汇合,C 因此成为对撞器。箭头指向的一侧,就是信息流动的“终点站”。
2. 条件独立性检验:拆穿“巧合”的工具
有了疑点,侦探还要有测谎仪。要判断优惠券活动 A 与探店视频 B 是不是真的独立,不能靠感觉,要用概率说话。所谓“A 与 B 相互独立”,通俗讲就是:知道 A 的动静,完全无法帮你猜 B 的动静。好比两户人家各开各的空调,一家开几度跟另一家毫无关系。但现实中变量常常互相牵扯,所以更要紧的是“条件独立性”:当第三个变量 Z 的取值被固定住之后,再问 A 和 B 还独立吗?
如果存在某个固定值让原本相关的 A、B 变得独立,说明它们的关联很可能只是 Z 在“捣鬼”;反之,如果固定 Z 后 A、B 反而从独立变成相关,那就是出现了“对撞”的信号。这种从“没条件”到“有条件”的翻转,是侦探判断方向的关键动作。公式化的定义如下:
实际算证据时,最常用的是卡方检验。把样本按照变量取值分格,统计每个格子里的观测频数 O,再按独立假设算出期望频数 E,两者差得越多,说明“独立”的可信度越低:
侦探把报表交给数据助手,助手噼里啪啦算出一个卡方值,再对照显著性水平 \(\alpha=0.05\) 的临界值下结论:数值若超过临界值,就认为“独立”这条假设站不住脚。刚才还扑朔迷离的巧合,现在变成了一串可比较的数字——证据终于有标准了。
- 求和符号\(\sum_{i=1}^{k}\) 表示把一张交叉表中的 k 个格子逐一纳入计算,每个格子都贡献一份偏离分。
- 观测频数 O是数据里真实数出来的“人数”,比如“发了优惠券且探店视频恰好也火”的那几天数量。
- 期望频数 E是假设 A 与 B 完全无关时理论上应有的数量,计算方式是把两个边缘总数相乘再除以总样本量,相当于“如果互不相识,本该各过各的”。
- 平方归一\((O_i - E_i)^2 / E_i\) 把每个格子的偏差放大后又按规模归一,避免大样本格子天然占便宜,最后累加成总的证据强度。
3. v-结构定向原理:为什么只有它认识方向
拿到无向骨架图后,侦探面临最大难题:每条线都只代表“有联系”,可箭头朝哪边?链式结构 A→C→B 中,你可以说 A 推动了 C,C 再推动 B;但如果只看相关性,你说 B 推动了 C 再推动 A,似乎也说得通。分叉结构 A←C→B 同理,把箭头反着画,相关性依旧能骗过眼睛。这两种结构都患上了“方向近视”,只有 v-结构是个例外——因为它身上带有一枚独一无二的指纹。
这枚指纹就是条件独立性在“给定对撞器 C”前后的反常变化。在没有限制条件时,A 与 B 相互独立;可一旦把条件固定在 C 的某个取值上,A 与 B 反而变得相关。为什么?逻辑很朴素:如果已经知道销量 C 很高,而优惠券 A 并没有投放,那么侦探几乎可以断定“探店视频 B 一定发力了”;反过来也一样。于是 A 的取值暴露了 B 的动向。这种“越看路口越有默契”的怪事,只有在汇聚型结构里才会发生,因此判定规则顺理成章:
对比三种结构,真相一目了然:链式 A→C→B 在给定 C 后,A 与 B 条件独立,因为中间站把上下游隔开了;分叉 A←C→B 在给定 C 后也条件独立,因为共同原因已经被“控制住”;唯独 v-结构在给定 C 后反而条件相关。这个独一无二的“反转”让侦探可以从杂乱的联系中,稳稳拔出箭头的方向——就像在岔路口看见两道胎印都指向同一个深坑,凶手即便想绕路也藏不住。
- 前件独立\(A \perp\!\!\!\perp B\) 表示在没有任何附加条件时,A 和 B 互不相识,优惠券活动和探店视频的日常节奏没有私下勾连。
- 条件反转\(A \not\!\perp\!\!\!\perp B \mid C\) 表示给定 C 后,A 和 B 的条件独立性被打破,二者开始“同频共振”。
- 两者同时成立用“且”连接两个条件,缺一不可。如果 A 和 B 本来就有关系,那么 C 可能只是中间驿站,不再是真正的对撞器。
- 等价定向\(\Longleftrightarrow\) 说明该证据组合足以锁定箭头方向,是因果图中少数能“百分之百拍板”的方向判据。
4. PC 算法之旅:从关系网到因果图
方向判断有了依据,接下来要从整张人脉网里系统地找出所有 v-结构。这就要请出因果发现界的“标准侦探手册”——PC 算法。它的名字来自两位作者 Peter Spirtes 和 Clark Glymour 首字母的组合,工作流程分三步:先画关系网,再找交叉口,最后填箭头方向。侦探不必东一榔头西一棒子,照着手册走就能交出一张因果图。
第一步是“骨架学习”:从一张所有变量两两相连的完全图出发,逐一检查“把某个变量集固定后,A 与 B 是否独立”;若发现独立,就删掉 A 与 B 之间的边。这一步需要维护一个“分离集” Sepset(A, B),记录“到底固定了哪些变量后才让 A、B 放手”。第二步是“v-结构确认”:在瘦身后的骨架中扫描所有 A—C—B 三元组,并检查 C 是否不在 Sepset(A, B) 里;若不在,就说明 C 不是让 A、B 分离的原因,而是让它们“相见”的对撞器,于是把边定向为 A→C←B。
定向之后,骨架里还剩不少边缺少箭头方向。第三阶段用“方向传播规则”继续补全,其中最核心的一条叫 Meek 规则:如果已有 A→C,且 C 与 B 相连、A 与 B 不相邻,那么这条边必须写成 C→B,否则一旦写成 B→C 就会在图中制造出一个虚假的新 v-结构,破坏全局一致性。
走完这三步,侦探手里的无向关系网就变成了一张“部分定向”的因果图。它不一定每条边都有箭头,但只要出现了 v-结构,那里的方向就是板上钉钉、无法伪装。PC 算法的优雅之处也正在这里:先用独立性检验砍掉多余关系,再靠对撞器完成质变级的定向突破。
- 前提一\(A \to C\) 表示已经确定的因果边,A 是原因,C 是结果,这是推理的起点。
- 前提二\(C - B\) 表示骨架中 C 与 B 之间还连着一条未定向的边,路况已知、方向待定。
- 前提三\(A \not\sim B\) 表示 A 与 B 不相邻,若在这时把边定为 B→C,就会让 A 和 B 形成“不相邻却共同指向 C”的假 v-结构。
- 定向结论三个条件齐备后只能推出 C→B,箭头从已知结果指向未知邻居,方向被唯一锁定。
5. 统计检验的不确定性:别被“假证据”带偏
数据不会自己说话,它只说概率。侦探的线人报告“优惠券和探店视频有关联”,可这份报告可能只是因为样本太少、碰巧撞车。条件独立性检验同样会看走眼:样本量不足时,明明不独立的变量可能被误判为独立;变量间信号太弱时,本应发现的依赖关系又被噪声吞没。因果发现领域把这称为检验误差,它像雾天里的目击证词,不能不信,也不能全信。
显著性水平 \(\alpha\) 是侦探给自己划的安全线。通常取 \(\alpha=0.05\),意思是“我愿意承担 5% 的误判风险”。但真正的陷阱在“多重检验”:PC 算法要在成千上万个变量对之间反复做独立性检验,每一次都有 5% 的造假可能,检验次数多了,假阳性会像地鼠一样成群冒出来。解决思路是收紧安全线,最朴素的方法就是 Bonferroni 校正:把原来的 \(\alpha\) 除以总检验次数 m,用更苛刻的标准换取整体可信度。
除了对阈值做减法,现代工具还会对整张因果图做“置信度体检”:把原始数据反复有放回地重抽样(Bootstrap),每次重抽都跑一遍 PC 算法,统计同一条边、同一个箭头在多轮结果里出现的比例。比例越高,说明方向越稳;比例在 0.5 附近游走,则说明这条“证据链”可能只是雨夜里的误会。侦探记录完这些不确定性,接下来就能更谨慎地把结论写进报告。
- 总体风险 \(\alpha\)整体允许的假阳性概率,取 0.05 表示总共 100 次里有 5 次可以误判。
- 检验次数 m整个算法中实际执行的条件独立性检验次数,PC 算法中 m 会随变量个数快速增长。
- 校正后阈值 \(\alpha_{\text{adj}}\)把总风险平均分给每一次检验,每个单独的检验必须用更小的阈值来把关。
6. 工程落地要点:从论文到生产
笔记本上的理论再漂亮,落到真实数据里还得先过“卷宗整理关”。侦探社接到的原始数据往往脏乱差:某些变量大量缺失、某些记录明显是异常值、还有的字段类型不统一。如果把脏数据直接喂给卡方检验,得到的独立性结论就像用模糊照片辨认嫌犯,越看越离谱。因此第一步永远是数据预处理:处理缺失值(删除或插补)、剔除异常点、统一口径,让每个变量都能可靠地参与计算。
第二个关键步骤是离散化。卡方检验通常处理类别型变量,而真实的销量、点击量、优惠券面额都是连续数值。常见的做法是把连续值按分位数分成几档,比如“低/中/高”三档,或者按业务意义手动分箱。分得太多会稀释样本,分得太少又会丢失信息,需要反复实验拿捏。接在后面的还有特征选择:变量不是越多越好,把无关紧要的“居民无关转发量”塞进分析,只会增加多重检验负担,拉低真信号的分辨率,所以要先筛掉明显与研究目标无关的字段。
最后也是最容易被忽略的一步:结果验证。因果图得出的箭头方向不能只在训练数据上自嗨,要拿领域知识对照——问一句“这个方向在业务上说得通吗?”如果算法说“优惠券投放导致探店视频发布”,而实际时间线上探店视频明明更早,那就要回头检查数据或检验设置。更稳妥的做法是保留一部分时间段的数据做样本外验证,再用 Bootstrap 评估每条边的置信度,让结论经受“复跑”的考验。毕竟侦探的责任不是找到一个解释,而是找到那个经得起质询的解释。
7. 应用与前沿:侦探社的远大前程
v-结构识别越过了学术象牙塔,正悄悄走进各行各业的办公室。在可解释 AI 领域,模型只告诉用户“客户会逾期”远远不够;风控分析师更想知道,究竟是“多头借贷”还是“收入波动”把风险推向了新高。用因果发现找出这两个原因共同指向“逾期”的 v-结构,模型给出的解释就不再是冷冰冰的相关性,而是带方向的归因链条。在医学领域,研究人员用同样的方法寻找哪些药物因素共同导致了不良反应,帮医生避开危险的“组合陷阱”。社会科学里,政策研究者则用它分辨“宣传投入”与“自发现象”究竟谁在真正推动公共事件。
前沿方向同样热闹。当前 v-结构识别主要依赖“没有重要变量被遗漏”的假设,但现实中总存在看不见的混杂因素,它会悄悄给 A 和 B 注入虚假的默契。马尔可夫等价类也提醒我们:链式和分叉结构有时无法用数据区分,PC 算法输出的箭头并非全都唯一。研究者正尝试引入大语言模型生成更合理的因果假设作为先验,让算法在变量极多、噪声极大的场景下依然能站稳脚跟。可以预见,随着 v-结构识别与其他因果工具不断融合,侦探们将能在大数据迷雾中画出越来越清晰的影响地图。
AI 应用场景
智能风控归因分析
阶段:因果推理与可解释建模
解决的问题:传统风控模型用逻辑回归或树模型给出“哪些特征对逾期有贡献”,但贡献度不等于因果方向。运营团队常纠结:到底是“营销短信发太多”拉高了逾期,还是“用户收入波动”在作怪?两者都直接影响逾期风险,形成典型的 v-结构。AI 通过条件独立性检验,先确认营销触达与收入波动原本独立,再在给定逾期状态的样本中发现二者条件相关,从而确认这个汇聚结构,归因报告因此有了方向感。
具体案例:某消费金融公司每月发三百万条提额短信,同时用户的兼职收入随季节波动。因果发现模型发现“短信触达”和“收入波动”共同指向“逾期”,且收入波动的指向强度是短信的三倍。据此,公司把营销策略从“广撒网”改为“错峰触动”,逾期率下降 1.2 个百分点。
药物不良反应信号挖掘
阶段:安全信号检测与验证
解决的问题:新药上市后,不良反应往往是多因素共同作用的结果。研究者想知道“遗传代谢差异”与“合并用药”是否共同导致肝损伤。直接用相关性分析,会发现两者看似无关,因为它们是独立因素;但一旦限定在“出现肝损伤”的病例里,两者的隐藏联动就暴露出来。这正是 v-结构在对撞点上的招牌现象。
具体案例:某药企复盘真实世界数据,用因果发现识别出“CYP2C19 慢代谢基因型”与“同时服用质子泵抑制剂”构成指向肝损伤的 v-结构,随后在独立队列中验证了该结论,更新了药品说明书的禁忌提示。
内容平台运营归因
阶段:用户增长与效果分析
解决的问题:短视频平台想知道一场爆款活动究竟是“运营强推”还是“用户自然传播”拉动的。两者都指向“播放量”这个对撞点,且运营排期与用户自发转发习惯彼此独立。识别出 v-结构后,平台可以量化两类推手的贡献比例,并判断谁更值得追加预算。
具体案例:某内容平台对 30 天活动数据做 v-结构识别,发现运营强推与自然传播共同推高播放量,其中自然传播的解释力在晚间时段占七成,于是平台把推送时间调整到晚间,活动 ROI 提升 40%。
Python 演示
import mathimport random def chi2_stat(table): """计算 2x2 频数表的卡方统计量,table 为 list of list。""" row0, row1 = table total = row0[0] + row0[1] + row1[0] + row1[1] stat = 0.0 for i in range(2): for j in range(2): observed = table[i][j] row_total = row0[0] + row0[1] if i == 0 else row1[0] + row1[1] col_total = row0[j] + row1[j] expected = row_total * col_total / total if expected > 0: stat += (observed - expected) ** 2 / expected return stat def ci_test(rows_x, rows_y, rows_z=None): """无条件或给定 Z 的条件独立性检验,返回卡方统计量和自由度。""" if rows_z is None: table = [[0, 0], [0, 0]] for x, y in zip(rows_x, rows_y): table[x][y] += 1 return chi2_stat(table), 1 stat = 0.0 df = 0 for level in (0, 1): sub_x = [x for x, z in zip(rows_x, rows_z) if z == level] sub_y = [y for y, z in zip(rows_y, rows_z) if z == level] if len(sub_x) < 2: continue table = [[0, 0], [0, 0]] for x, y in zip(sub_x, sub_y): table[x][y] += 1 stat += chi2_stat(table) df += 1 return stat, df def is_independent(stat, df, alpha=0.05): """教学用临界值近似:统计量小于临界值则判定独立。""" crit = {1: 3.84, 2: 5.99, 3: 7.81, 4: 9.49} return stat < crit.get(df, 7.81) def generate_v_data(n=400, seed=42): """生成 A、B 独立但共同影响 C 的模拟数据。""" rng = random.Random(seed) a, b, c = [], [], [] for _ in range(n): ai = 1 if rng.random() < 0.5 else 0 bi = 1 if rng.random() < 0.5 else 0 p = 0.1 + 0.4 * ai + 0.4 * bi ci = 1 if rng.random() < p else 0 a.append(ai) b.append(bi) c.append(ci) return a, b, c def detect_v_structure(): a, b, c = generate_v_data() stat0, df0 = ci_test(a, b) stat1, df1 = ci_test(a, b, c) indep = is_independent(stat0, df0) dep_given_c = not is_independent(stat1, df1) print("无条件检验 A 与 B:卡方 = {:.3f}, 独立判定 = {}".format(stat0, indep)) print("给定 C 后 A 与 B:卡方 = {:.3f}, df = {}, 相关判定 = {}".format(stat1, df1, dep_given_c)) if indep and dep_given_c: print("结果:发现 v-结构 A -> C <- B 的典型证据") else: print("结果:未发现典型 v-结构") if __name__ == "__main__": detect_v_structure()
for x, y in zip(rows_x, rows_y): table[x][y] += 1把两列二值变量交叉计数,得到“0/1 × 0/1”的 2x2 列联表,这是卡方检验的原料。expected = row_total * col_total / total在“两变量无关”的假设下计算每个格子应有的频数,相当于给独立世界拍一张快照。stat += (observed - expected) ** 2 / expected把每个格子的观测与期望偏差平方并归一,偏差越大,独立假设越可疑。for level in (0, 1):条件检验要对 Z 的两个取值层分别建表并累计统计量,模拟“固定对撞器后重新审视 A、B 关系”的过程。p = 0.1 + 0.4 * ai + 0.4 * bi让 C 的概率同时受 A 和 B 抬升,构造出真实的 v-结构数据生成机制。indep = is_independent(stat0, df0)无条件时 A、B 应判为独立,这是 v-结构的第一条证据。dep_given_c = not is_independent(stat1, df1)给定 C 后不再独立,这是 v-结构的第二条、也是决定性的证据。main` 入口统一调用 `detect_v_structure()保证脚本可直接运行,把两步检验结果打印成一份“侦探报告”。
常见误区
误区我看到 A→C 和 B→C,两个箭头都指向 C,那这肯定就是 v-结构了!只要数箭头数量就行。
正解v-结构还有一个隐藏前提:A 和 B 之间不能有因果边。如果 A 和 B 直接相连,那么 C 就不算干净的对撞器。打个比方:两辆车确实都经过市中心,但司机俩本来就是朋友、经常约好一起出门,这就不能证明“市中心让两人相遇”。在算法里,必须把骨架图中 A、B 之间是否存在边纳入检查,先确认不相邻,再谈 v-结构。
为何常见:人在看局部图形时,第一眼只注意箭头指向,很容易忽略两个父节点之间那条不起眼的连线;教科书上的标准 v-结构图又总是画得干干净净,更强化了这种错觉。
误区只要跑一遍卡方检验,p 值小于 0.05 就说明一定相关,大于 0.05 就说明一定独立,算法说啥就是啥。
正解统计检验只是“带误差的证据”,样本量小、信号弱、多重比较次数多都会让结论失真。更稳妥的做法是把检验结果当作“嫌疑指数”而不是“定案印章”:用 Bootstrap 反复抽样看同一个结论是否稳定,用 Bonferroni 校正压缩假阳性。就像侦探听线人报告,虽然认真记录,但还要多方验证。
为何常见:很多小白把 p 值当成了事情发生的准确概率,又以为显著性水平是绝对真值,忽略了样本设计、检验次数与噪声对结论的影响。
误区PC 算法输出一张因果图,里面所有边都该有箭头;如果有边没有方向,那就是算法没写完或是代码 bug。
正解PC 算法输出的往往是“部分有向无环图”:只有被 v-结构或方向传播规则锁定的边才必然有向,剩下的边在马尔可夫等价类中方向无法由数据区分。比如 A→C→B 和 A←C←B,这两张图蕴含的条件独立关系完全相同,数据无法替你选边。此时保持“无向”才是诚实,强行猜方向反而是过度解读。
为何常见:人们天然希望算法给出一个“完整答案”,而论文里展示的最终图也常常是有向的,这才让人误以为每条边都经过了同样的证据强度确认。
误区A←C→B 和 A→C←B 都涉及三条边和一个中心点,那它们给定 C 之后的表现应该差不多,都会让 A、B 产生关联吧?
正解方向恰恰相反。在分叉结构中,C 是共同原因,给定 C 就等于把原因固定住,A、B 之间的“虚假关联”被解释完毕,表现为条件独立;而在 v-结构中,C 是共同结果,给定 C 等同于“强制聚焦于这个路口”,反而让 A、B 产生条件相关。把两个方向搞混,因果图就会全盘崩坏。
为何常见:这两种结构在形状上太像,都是三条边一个中心,初学者只能靠记忆背“条件相关还是条件独立”,缺少“原因固定→独立性恢复、结果固定→相关性出现”的直觉。
面试题
Q1. 在因果图中,v-结构指的是下列哪一种形态?
- A.两个原因同时指向一个结果← 正确答案
- B.一个原因顺次影响两个结果
- C.一个原因同时影响两种结果
- D.三个变量之间互不影响
答案:A。v-结构的标准形态是两个原因 A、B 分别指向同一个结果 C,即 A→C←B。选项 B 是链式结构,选项 C 是分叉结构,选项 D 则完全不相关,因此只有 A 正确。
Q2. 在 v-结构 A→C←B 中,不作任何条件限定时,A 与 B 通常表现为?
- A.彼此完全独立← 正确答案
- B.彼此完全相关
- C.一定正相关
- D.一定负相关
答案:A。v-结构的核心特征是 A 与 B 在无条件下相互独立,就像两个互不相识的人各自活动。只有当我们把目光聚焦到对撞点 C 上,A 与 B 才会表现出相关性。因此选 A。
Q3. 当我们把条件限定到对撞点 C 上后,v-结构中 A 与 B 会发生什么?
- A.保持条件独立
- B.出现条件相关← 正确答案
- C.两者完全相同
- D.无法再被观测
答案:B。对撞器的招牌效应就是“越关注 C,A 与 B 越有默契”。已知销量 C 高、且 A 没投放,就能推断 B 一定发力了,因此给定 C 时 A、B 条件相关。答案是 B。
Q4. 在分叉结构 A←C→B 中,给定 C 后,A 与 B 的关系是?
- A.条件独立← 正确答案
- B.条件相关
- C.互为因果
- D.方向反转
答案:A。分叉结构中 C 是 A、B 的共同原因,控制住 C 就等于解释了 A 与 B 的全部关联来源,因此给定 C 后两者条件独立。与 v-结构的“条件相关”恰好相反,选 A。
Q5. 识别一个 v-结构至少需要哪些证据?
- A.骨架中存在三元组 A–C–B← 正确答案
- B.A、B 之间没有直接边← 正确答案
- C.C 不在 A、B 的分离集中← 正确答案
- D.A、B、C 都是连续型变量
答案:ABC。v-结构需要骨架中存在 A—C—B 三元组,且 A 与 B 不相邻;分离集中若包含 C,则 C 只是让 A、B 独立的普通节点,无法构成对撞器。变量是否连续与 v-结构识别无必然关系,D 错误。
Q6. PC 算法中,v-结构识别的输入是什么?
- A.原始观测数据表
- B.无向骨架与分离集← 正确答案
- C.完全定向的因果图
- D.变量之间的协方差
答案:B。PC 算法先做骨架学习,输出无向骨架并记录每对变量的分离集;v-结构确认阶段正是以“骨架 + 分离集”为输入来判定对撞器。原始数据表在前一阶段已经用过,完全定向的图则是最终输出,因此选 B。
Q7. 关于分离集 Sepset(A, B),下列哪种理解正确?
- A.使 A、B 条件独立的变量集合← 正确答案
- B.它一定包含 C 且使 A、B 独立
- C.它与 p 值、样本量完全无关
- D.它最多只能包含一个变量
答案:A。分离集记录的是“固定哪些变量后,A 与 B 变成独立”的集合,是骨架删边的重要凭证。若 C 在分离集中,说明控制 C 就能分离 A、B,不能构成 v-结构;分离集大小也不限一个,且与统计检验参数密切相关,故 B、C、D 均错。
Q8. 关于条件独立性检验的不确定性,哪些说法正确?
- A.样本量越小,统计功效越低← 正确答案
- B.显著性水平越高,越易拒绝独立假设← 正确答案
- C.多重检验会增大假阳性概率← 正确答案
- D.检验误差仅影响无向图骨架
答案:ABC。样本少会导致检验分辨不出真实依赖,功效降低;显著性水平越宽松就越容易把独立错判为相关;多次检验会让假阳性累积。D 错误,因为检验误差既会污染骨架删边,也会把 v-结构识别引向错误方向。
Q9. 卡方统计量中 O 和 E 分别代表什么?
- A.观测频数与期望频数← 正确答案
- B.样本均值与样本方差
- C.自变量与因变量
- D.原始数据与缺失数据
答案:A。卡方统计量 \(\sum (O-E)^2/E\) 中,O 是每个格子真实数出的观测频数,E 是在“独立假设”下推算出应出现的期望频数。二者偏差越大,统计量越大,独立性越不可信,因此选 A。
Q10. 下列有关 v-结构与因果发现的表述,正确的是?
- A.马尔可夫等价类中部分边方向不确定← 正确答案
- B.对撞器结构可以打破马尔可夫等价类← 正确答案
- C.多重检验校正能够降低假阳性率← 正确答案
- D.PC 算法输出的每条边方向必然唯一
答案:ABC。链式与分叉结构可能相互等价,使得部分边方向无法由数据唯一确定;v-结构由于独特的条件依赖特征,能打破这种等价类,为方向提供决定性证据。多重检验校正如 Bonferroni 可压缩假阳性。D 错误,PC 算法输出的方向并不必然全部唯一。