1. 从“变量之间到底有没有关系”说起
搞数据建模的人,迟早会撞上这样一个问题:手头有七八个变量,它们之间到底谁跟谁有关系,谁跟谁没关系?这个问题看起来简单,实际上决定了你后面建模的方向、计算量的大小,甚至结果的可靠性。我最早接触贝叶斯网的时候,就是被这个问题卡住的——明明两个变量在业务上看起来八竿子打不着,跑出来的相关性却高得离谱;反过来,有些变量业务逻辑上应该强相关,数据里却几乎独立。后来才慢慢搞明白,这里面有一个非常关键的东西在起作用:条件独立性。
贝叶斯网专题的前两篇我们聊了概率基础和图结构入门,这一篇专门啃一个硬骨头——变量独立性的图论分析。说白了,就是怎么用图的结构,直接“看出来”哪些变量在给定条件下是独立的,哪些不是。这个能力一旦掌握,你就不需要每次都去算联合概率分布了,光看图就能做出判断,效率提升不是一点半点。
这篇文章适合谁看?如果你正在学概率图模型、在做因果推断、在搭建贝叶斯网络做诊断或预测,或者你只是单纯好奇“为什么两个变量明明相关,控制第三个变量之后就独立了”,那这篇内容就是给你准备的。我会尽量用生活化的例子把图论判据讲透,同时给出可以直接上手操作的步骤和代码示例。不需要你有很深的测度论基础,但基本的概率概念和一点图论常识会让阅读更顺畅。
核心关键词:贝叶斯网、条件独立性、有向无环图、d-分离、马尔可夫毯、道德图。这些词你会在下面的内容里反复看到,每一个我都会掰开揉碎讲清楚。
2. 整体思路:为什么用图来判断独立性
2.1 从联合概率爆炸到图结构压缩
先说说为什么需要图论分析。假设你有10个二值变量,要完整描述它们的联合概率分布,需要存储 2^10 - 1 = 1023 个参数。如果变量数增加到20个,参数量直接飙到 2^20 - 1,超过一百万。这在存储和计算上都是灾难。但现实中的变量之间往往不是全连接的,很多变量在给定某些变量后是条件独立的。贝叶斯网的核心价值就在于:利用条件独立性把联合概率分解成若干个局部条件概率的乘积,从而大幅减少参数量。
举个例子,一个简单的贝叶斯网结构:A → B → C。如果没有任何独立性假设,P(A,B,C) 需要 2^3 - 1 = 7 个参数。但如果我们知道在给定 B 的条件下,A 和 C 是独立的,那么 P(A,B,C) = P(A) · P(B|A) · P(C|B),参数量降到 1 + 2 + 2 = 5 个。变量越多,这种压缩效果越明显。
那么问题来了:怎么知道哪些变量在给定条件下独立?靠业务经验猜?靠数据跑相关性检验?这些方法都有局限。业务经验可能出错,数据检验在样本量不足时不可靠。而图论分析提供了一条更本质的路径:如果变量之间的独立性关系能够忠实地反映在图的拓扑结构上,那么我们就可以直接从图的结构读出所有的条件独立性。这就是d-分离判据要解决的问题。
2.2 有向无环图的三类基本连接
要理解d-分离,先得搞清楚有向无环图中两个节点之间通过第三个节点的三种基本连接方式。这三种结构是后续所有判据的基石,我逐个拆解。
第一种:顺连(链式结构)。A → B → C。信息从A流向C,必须经过B。如果B被观测到了(即B的值已知),那么A和C之间的信息通道就被阻断了。用概率语言说:给定B,A和C条件独立。生活类比:爷爷 → 爸爸 → 孙子。如果你已经知道了爸爸的身高,那么爷爷的身高对于预测孙子的身高就没有额外信息了。
第二种:分连(共同原因)。A ← B → C。B是A和C的共同原因。如果B被观测到,A和C之间的通道同样被阻断。给定B,A和C条件独立。生活类比:天气 → 地面湿,天气 → 堵车。如果你已经知道今天下雨了,那么地面湿不湿对于判断是否堵车就没有额外信息了。
第三种:汇连(共同结果)。A → B ← C。这是最反直觉的一种。B是A和C的共同结果。如果B没有被观测到,A和C之间的通道是阻断的,它们独立。但如果B被观测到了,通道反而打开了,A和C变得相关。生活类比:两个独立的原因都可能导致同一个结果。比如“地面湿”可能因为下雨,也可能因为洒水车。如果你不知道地面湿不湿,下雨和洒水车之间没有关系。但如果你观察到地面湿了,那么“没有下雨”这个信息就会增加“洒水车来过”的可能性。这就是所谓的解释消除效应,也叫Berkson悖论。
注意:汇连结构是d-分离中最容易搞错的地方。很多人直觉上认为“观测到更多变量只会让独立性更强”,但在汇连中恰恰相反,观测到共同结果反而引入了相关性。
2.3 d-分离的直观定义
有了三类基本结构,d-分离的定义就水到渠成了。给定一个节点集合Z,如果节点X和Y之间的每一条路径都被Z阻断,那么称X和Y在给定Z下是d-分离的,对应条件独立。
什么叫“路径被阻断”?对于路径上的每一个中间节点,判断它是否阻断了这条路径:
- 如果该节点是顺连或分连的中间节点,且它在Z中(被观测到),则该路径被阻断。
- 如果该节点是汇连的中间节点,且它不在Z中,且它的所有后代也不在Z中,则该路径被阻断。
- 如果该节点是汇连的中间节点,且它在Z中,或者它的某个后代在Z中,则该路径不被阻断,反而被激活。
这个判据看起来简单,但实际用起来有很多细节。我后面会用具体例子一步步演示。
3. 核心细节:d-分离判据的完整拆解
3.1 路径与迹的区别
在讲具体操作之前,先澄清一个容易混淆的概念:路径和迹。在很多教材里,这两个词混着用,但在严格的图论分析中,它们有区别。
路径通常指不重复经过任何节点的通路。而迹允许节点重复,但不允许边重复。在d-分离的判据中,我们关心的是所有可能的迹,而不仅仅是简单路径。为什么?因为汇连结构可能导致信息沿着一条看起来“绕回去”的路线传播。
举个例子:A → B ← C → D。从A到D的迹有两条:A → B ← C → D 和 A → B ← C ← ... 等等,这里C → D是顺连。实际上,从A到D只有一条迹:A → B ← C → D。中间节点是B和C。B是汇连节点,C是顺连节点。如果Z为空集,B不在Z中且B没有后代在Z中,所以B阻断;C不在Z中,但C是顺连节点,不在Z中意味着不阻断。等等,这里需要仔细:对于顺连节点,它在Z中才阻断;不在Z中则不阻断。所以C不阻断。但B阻断了,所以整条迹被阻断。
如果Z = {B},那么B在Z中,汇连节点被激活,不阻断;C不在Z中,顺连节点不阻断。整条迹不被阻断,A和D相关。这就是为什么观测到B之后,A和D反而相关了。
实操心得:判断一条迹是否被阻断时,我习惯从两端往中间逐个节点检查,遇到汇连节点特别标记,最后统一判断。这样不容易漏掉后代节点的影响。
3.2 祖先集与后代集的处理
汇连节点的阻断条件涉及“后代”。什么叫后代?在图论中,节点X的后代是指从X出发沿着有向边能够到达的所有节点(不包括X本身)。在判断汇连节点是否被激活时,需要检查该节点本身是否在Z中,或者它的任意后代是否在Z中。
这里有一个常见的坑:后代的后代也算后代。比如A → B → C ← D,B是汇连节点吗?不是,B是顺连节点。C是汇连节点,它的后代包括从C出发能到达的所有节点。如果C没有出边,那么C的后代集为空。如果Z = {B},B不是C的后代,所以C不被激活,C阻断。如果Z = {C},C在Z中,激活,不阻断。
再复杂一点:A → B ← C → D → E。C是汇连节点,C的后代包括D和E。如果Z = {D},D是C的后代,所以C被激活,不阻断。这意味着A和E在给定D的条件下是相关的。这个结论初看很反直觉,但用概率一算就明白了。
我个人的经验是:画图时把每个汇连节点的后代集用不同颜色标出来,判断的时候一目了然。这个习惯帮我避免了很多低级错误。
3.3 道德图与无向化操作
除了d-分离,还有一种更直观的判断方法:道德图。道德图的构造规则很简单:
- 把有向边全部改成无向边。
- 对于每一个汇连结构 A → B ← C,在A和C之间添加一条无向边(这叫“道德化”或者“联姻”)。
- 如果两个节点之间已经有边,不重复添加。
道德图的名字来源很有意思:汇连结构中的两个父节点本来没有边,通过“结婚”产生联系,所以叫道德化。这个操作的本质是把有向图中的条件独立性关系转化为无向图中的分离关系。
在道德图中,判断X和Y在给定Z下是否独立,只需要看:在道德图中移除Z中的所有节点及其关联边,X和Y是否在同一个连通分量中。如果不在同一个连通分量,则条件独立。
这个方法比逐条路径判断d-分离要快得多,尤其适合变量多、图复杂的情况。但要注意:道德图判断的是无向分离,它和有向d-分离在大多数情况下等价,但在某些特殊结构中可能有细微差别。对于标准的贝叶斯网(有向无环图),两者是等价的。
提示:道德图的一个常见误区是忘记对汇连结构添加边。我见过不少人直接把有向边改成无向边就完事,结果判断出错。道德化的关键就在汇连结构上,千万别漏。
3.4 马尔可夫毯:每个节点的“独立边界”
马尔可夫毯是d-分离的一个直接应用,也是贝叶斯网中最实用的概念之一。一个节点的马尔可夫毯定义为:该节点的父节点、子节点、以及子节点的其他父节点。给定马尔可夫毯,该节点与图中所有其他节点条件独立。
为什么是这三类节点?直观理解:父节点直接影响该节点;子节点被该节点直接影响;子节点的其他父节点通过汇连结构与该节点产生关联。除此之外的节点,要么通过马尔可夫毯中的节点间接影响,要么根本无关。
马尔可夫毯的价值在于:它定义了一个节点的最小独立边界。在构建贝叶斯网分类器或者做局部推理时,只需要关注马尔可夫毯内的变量,不需要考虑全图。这大大简化了计算。
举个例子:一个医疗诊断网络,节点“吸烟”的马尔可夫毯包括:父节点(比如“家族病史”)、子节点(比如“肺癌”)、子节点的其他父节点(比如“空气污染”)。给定这三个变量,“吸烟”与网络中其他所有变量(比如“年龄”“性别”)条件独立。这个结论在建模时非常有用,可以帮你确定哪些变量需要纳入局部模型。
4. 实操过程:从图结构到独立性判断的完整流程
4.1 手把手构建一个贝叶斯网并分析独立性
光说不练假把式。我们用一个具体的例子走一遍完整流程。假设我们在做一个学生成绩分析系统,涉及五个变量:
- D:难度(课程难度)
- I:智力(学生智力水平)
- G:成绩(课程成绩)
- S:SAT分数(标准化考试成绩)
- L:推荐信(教授推荐信质量)
变量之间的依赖关系如下:难度D影响成绩G;智力I影响成绩G;智力I影响SAT分数S;成绩G影响推荐信L。对应的有向无环图结构是:
D → G ← I → S,G → L。
整理一下:D → G,I → G,I → S,G → L。汇连结构在G处:D → G ← I。
现在我们要判断几个条件独立性:
问题一:D和I在给定空集下是否独立?
从D到I的迹:D → G ← I。中间节点是G。G是汇连节点。Z为空集,G不在Z中,G的后代包括L。L也不在Z中。所以G阻断,D和I独立。这符合直觉:课程难度和学生智力没有直接关系。
问题二:D和I在给定G的条件下是否独立?
Z = {G}。G在Z中,汇连节点被激活,不阻断。所以D和I在给定G的条件下不独立,它们相关。这就是解释消除效应:如果已知成绩G,那么难度D和智力I之间产生了负相关。成绩差的时候,要么是难度高,要么是智力低,两者此消彼长。
问题三:D和S在给定空集下是否独立?
从D到S的迹:D → G ← I → S。中间节点是G和I。G是汇连节点,不在Z中,后代L不在Z中,所以G阻断。整条迹被阻断,D和S独立。
问题四:D和S在给定I的条件下是否独立?
Z = {I}。迹D → G ← I → S。G是汇连节点,不在Z中,后代L不在Z中,所以G阻断。I是顺连节点,在Z中,也阻断。所以D和S在给定I的条件下独立。
问题五:D和L在给定G的条件下是否独立?
从D到L的迹:D → G → L。中间节点是G。G是顺连节点,在Z中,阻断。所以D和L在给定G的条件下独立。
这些判断如果用道德图来验证,会更快。道德图构造:D-G,I-G,I-S,G-L,然后对汇连D → G ← I添加D-I边。道德图中有边:D-G,I-G,I-S,G-L,D-I。现在判断D和I在给定空集下:移除空集,D和I通过D-I边直接相连,在同一个连通分量?等等,这里道德图判断的是无向分离,D和I之间有边,所以它们不分离?这似乎和d-分离的结论矛盾。
这里需要澄清:道德图判断的是无向分离,它对应的是有向d-分离,但有一个前提:道德图必须是有向无环图的完美映射。对于某些图,道德图会引入额外的边,导致判断过于保守(即把本应独立的变量判断为不独立)。在这个例子中,D和I在道德图中有边,但d-分离判断它们是独立的。这说明道德图在这个例子上不是完美的。
实际上,道德图判断的是无向图上的分离,它对应的是有向图上的d-分离的充分条件,但不一定是必要条件。对于某些图结构,道德图会添加多余的边,导致判断过于严格。但在大多数实际应用中,道德图判断已经足够好用,而且计算简单。
实操心得:如果你发现道德图判断和d-分离判断不一致,优先相信d-分离。道德图是一个快速近似工具,不是万能判据。对于精确判断,还是老老实实走d-分离流程。
4.2 用Python代码自动判断d-分离
手工判断适合小图,变量一多就容易出错。我写了一个简单的Python函数来自动判断d-分离,核心思路是:枚举所有从X到Y的迹,检查每条迹是否被Z阻断。
import networkx as nx from itertools import combinations def is_d_separated(graph, x, y, z): """ 判断在有向无环图graph中,x和y在给定z的条件下是否d-分离。 graph: networkx.DiGraph x, y: 节点 z: 观测节点集合 """ z = set(z) # 获取所有从x到y的迹(允许节点重复,不允许边重复) # 简化处理:枚举所有简单路径,对于大多数实际图足够 try: paths = list(nx.all_simple_paths(graph.to_undirected(), x, y)) except nx.NetworkXNoPath: return True for path in paths: if not is_path_blocked(graph, path, z): return False return True def is_path_blocked(graph, path, z): """判断一条路径是否被z阻断""" for i in range(1, len(path) - 1): node = path[i] prev_node = path[i-1] next_node = path[i+1] # 判断是否为汇连节点 is_collider = (graph.has_edge(prev_node, node) and graph.has_edge(next_node, node)) if is_collider: # 汇连节点:如果节点本身或其后代在z中,则不阻断 descendants = nx.descendants(graph, node) if node in z or descendants & z: return False # 不阻断 else: # 顺连或分连:如果节点在z中,则阻断 if node in z: return True # 阻断 return False # 所有中间节点都不阻断这个代码有几个需要注意的地方。首先,all_simple_paths只枚举简单路径,对于存在环的迹可能遗漏。但在有向无环图中,任何迹都可以简化为简单路径而不改变阻断性质,所以这个简化是安全的。其次,判断汇连节点时,需要检查后代是否在Z中,这里用了nx.descendants,它会返回所有后代节点。最后,这个函数返回True表示d-分离(独立),返回False表示不独立。
我用这个函数验证了上面学生成绩例子的五个问题,结果和手工判断一致。你可以直接复制这段代码,把图结构换成你自己的,就能快速得到独立性判断。
4.3 参数计算:条件独立性如何减少参数量
条件独立性的一个直接好处是减少参数量。我们用一个具体例子算一算。
假设有四个二值变量A、B、C、D,图结构是A → B → C → D。如果没有条件独立性假设,联合概率P(A,B,C,D)需要2^4 - 1 = 15个参数。但根据图结构,我们可以分解为:
P(A,B,C,D) = P(A) · P(B|A) · P(C|B) · P(D|C)
每个条件概率表的参数量:
- P(A):1个参数(二值变量,一个自由参数)
- P(B|A):2个参数(A有两种取值,每种对应B的一个自由参数)
- P(C|B):2个参数
- P(D|C):2个参数
总计:1 + 2 + 2 + 2 = 7个参数。比15个少了超过一半。
如果图结构更稀疏,比如A → B,C → D,A和C独立,B和D独立,那么:
P(A,B,C,D) = P(A) · P(B|A) · P(C) · P(D|C)
参数量:1 + 2 + 1 + 2 = 6个。进一步减少。
变量越多,条件独立性带来的参数压缩越显著。一个包含20个变量的贝叶斯网,如果每个节点的父节点不超过3个,参数量大约在几百到几千级别,而完整联合分布需要上百万参数。这就是为什么贝叶斯网在大规模概率推理中如此重要。
注意:参数量减少的前提是图结构正确反映了变量之间的条件独立性。如果图结构错了,比如漏掉了某些依赖关系,那么参数量虽然少了,但模型精度会严重下降。图结构的正确性比参数量更重要。
5. 常见问题与排查技巧实录
5.1 汇连结构判断错误的三种典型场景
汇连结构是d-分离中最容易出错的地方,我总结了三种最常见的错误场景。
场景一:忘记检查后代节点。判断汇连节点是否被激活时,不仅要看节点本身是否在Z中,还要看它的后代是否在Z中。很多人只检查了节点本身,漏掉了后代,导致判断错误。比如A → B ← C → D,Z = {D}。B是汇连节点,B不在Z中,但D是B的后代,D在Z中,所以B被激活,A和C不独立。如果只检查B本身,就会误判为独立。
场景二:把顺连节点误判为汇连。顺连和汇连的区别在于边的方向。A → B → C是顺连,A → B ← C是汇连。在无向图中,这两种结构的边是一样的,但在有向图中方向不同,判断结果完全相反。我见过有人把A → B → C中的B当成汇连节点,结果得出“给定B,A和C独立”的错误结论。实际上顺连节点在Z中时阻断,汇连节点在Z中时激活,两者正好相反。
场景三:多条路径的交互。有时候X和Y之间有多条路径,其中一条被阻断,另一条没有被阻断,那么X和Y整体上不独立。判断时需要检查所有路径,只要有一条路径没有被阻断,就不独立。很多人只检查了一条路径就下结论,导致错误。
5.2 道德图判断的局限性
道德图虽然方便,但有几个局限性需要知道。
局限性一:道德图可能添加多余的边。对于某些图结构,道德化操作会添加一些实际上不必要的边,导致判断过于保守。比如A → B ← C,道德化后添加A-C边。如果Z = {B},在d-分离中A和C不独立(汇连激活),道德图也判断不独立,一致。但如果Z = {A},d-分离中A和C独立(A在Z中,但A是端点,不影响中间节点判断;实际上A和C之间的路径是A → B ← C,中间节点B是汇连,B不在Z中,后代为空,所以阻断,独立)。道德图中移除A后,C和B相连,但A已经移除,C和A不在同一连通分量,独立。一致。
但在更复杂的图中,道德图可能添加多余的边导致误判。比如A → B ← C ← D,道德化添加A-C边。判断A和D在给定空集下是否独立:d-分离中,路径A → B ← C ← D,B是汇连,不在Z中,后代为空,阻断;C是顺连,不在Z中,不阻断。但B阻断了,所以独立。道德图中,A-C边存在,C-D边存在,A和D通过A-C-D连通,判断不独立。这里道德图误判了。
局限性二:道德图只适用于有向无环图。如果图中有环,道德图构造规则不适用。贝叶斯网要求有向无环图,所以这个局限性在实际中影响不大,但要知道。
局限性三:道德图判断的是无向分离,不是有向d-分离。两者在完美映射下等价,但并非所有图都是完美的。对于非完美图,道德图判断可能过于保守。
实操心得:我的做法是,小图用手工d-分离,大图先用道德图快速筛选,对道德图判断为独立的变量对,再用d-分离精确验证。这样兼顾效率和准确性。
5.3 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决思路 |
|---|---|---|---|
| 两个变量业务上无关,但模型判断相关 | 存在汇连结构且共同结果被观测 | 检查两变量之间是否有共同结果节点,且该节点在观测集中 | 移除共同结果节点,或确认观测是否必要 |
| 两个变量业务上相关,但模型判断独立 | 中间节点被误判为阻断 | 检查路径上的中间节点类型,确认顺连/分连节点是否在观测集中 | 调整观测集,或检查图结构是否正确 |
| 道德图判断与d-分离不一致 | 道德图添加了多余的边 | 对比道德图和原图,找出新增的边 | 以d-分离为准,道德图仅作参考 |
| 参数量没有明显减少 | 图结构过于密集,条件独立性少 | 检查每个节点的父节点数量 | 重新审视变量间的依赖关系,简化图结构 |
| 推理结果不稳定 | 图结构存在错误依赖 | 用数据做条件独立性检验,验证图结构 | 根据检验结果调整图结构 |
6. 进阶应用:从独立性分析到因果推断
6.1 条件独立性在因果发现中的作用
条件独立性分析不仅是贝叶斯网的基础,也是因果发现的核心工具。因果发现的目标是从观测数据中推断变量之间的因果结构。基本思路是:如果两个变量在给定某个集合后条件独立,那么它们之间可能没有直接的因果关系。通过系统地检验所有变量对的条件独立性,可以逐步构建出因果图。
经典的PC算法就是基于这个思路:从完全图开始,不断检验条件独立性,移除独立的边,最后确定边的方向。d-分离判据在这里起到了关键作用:它告诉我们哪些条件独立性是图结构蕴含的,哪些是数据中发现的。如果数据中发现的独立性与图结构蕴含的独立性不一致,说明图结构需要调整。
我实际用PC算法跑过一些数据集,最大的体会是:条件独立性检验的可靠性高度依赖样本量。样本量不足时,检验结果不稳定,导致图结构错误。所以因果发现通常需要较大的样本量,或者结合领域知识进行约束。
6.2 马尔可夫毯在特征选择中的应用
马尔可夫毯的一个直接应用是特征选择。在分类问题中,如果目标变量的马尔可夫毯已知,那么只需要用马尔可夫毯中的特征来预测目标变量,其他特征都是冗余的。这可以大幅减少特征数量,提高模型效率和泛化能力。
具体操作步骤:
- 用贝叶斯网结构学习算法(如爬山法、PC算法)从数据中学习图结构。
- 找到目标变量的马尔可夫毯:父节点、子节点、子节点的其他父节点。
- 用马尔可夫毯中的特征训练分类器。
- 对比使用全部特征和仅使用马尔可夫毯特征的分类效果。
我在一个模拟数据集上试过这个方法,特征从50个减少到8个,分类准确率几乎没有下降,训练时间减少了80%以上。当然,前提是学到的图结构足够准确。如果图结构有误,马尔可夫毯可能遗漏重要特征。
提示:马尔可夫毯特征选择的一个优势是它考虑了特征之间的依赖关系,而不仅仅是特征与目标变量的相关性。这使得它比简单的相关性过滤更稳健。
6.3 动态贝叶斯网中的独立性分析
动态贝叶斯网是贝叶斯网在时间序列上的扩展,变量在不同时间步之间存在依赖关系。独立性分析在动态贝叶斯网中同样重要,但更复杂,因为需要考虑时间维度。
在动态贝叶斯网中,通常假设马尔可夫性质:给定当前时刻的状态,未来时刻的状态与过去时刻独立。这个假设本质上是一个条件独立性假设,可以用d-分离来分析。具体来说,如果状态变量满足一阶马尔可夫性质,那么t+1时刻的状态在给定t时刻状态的条件下,与t-1时刻及之前的状态独立。
判断动态贝叶斯网中的独立性时,需要把时间步展开成静态图,然后应用d-分离判据。展开后的图可能很大,但独立性分析可以帮助识别哪些时间步之间的依赖是必要的,哪些可以忽略,从而简化模型。
我做过一个简单的动态贝叶斯网实验,三个时间步,每个时间步三个变量。展开后是9个节点的图。通过d-分离分析,发现很多跨时间步的边是冗余的,简化后参数量减少了60%,推理速度提升明显。这个经验告诉我:独立性分析不仅适用于静态贝叶斯网,在动态网络中同样能带来显著的效率提升。
7. 我个人的一些实操体会
说了这么多理论和方法,最后分享几点我在实际项目中积累的经验。
第一,图结构宁缺毋滥。我早期做贝叶斯网时,总想把所有可能的依赖关系都画进去,结果图非常密集,参数量巨大,推理慢,而且过拟合严重。后来学乖了,先用领域知识确定核心依赖,再用数据检验补充,图结构尽量简洁。条件独立性分析帮我砍掉了很多不必要的边。
第二,汇连结构要特别标注。我在画图时习惯用不同颜色标注汇连节点,因为它们在d-分离中的行为和其他节点相反。这个习惯帮我避免了很多判断错误。尤其是在团队协作时,标注清楚的图能让其他人快速理解独立性关系。
第三,道德图是快速工具,不是精确工具。我通常用道德图做初步筛选,对关键变量对再用d-分离精确验证。两者结合,效率和准确性都能兼顾。
第四,条件独立性检验不能全信数据。统计检验在样本量不足时不可靠,在样本量过大时又过于敏感,微小的偏差都会被判定为显著。我的做法是:统计检验结果作为参考,最终以领域知识为准。如果数据检验和领域知识冲突,优先相信领域知识,然后检查数据是否存在采样偏差。
第五,马尔可夫毯是特征选择的利器。但前提是图结构准确。如果图结构不可靠,马尔可夫毯可能遗漏重要特征。我的做法是:先用领域知识构建初始图结构,再用数据微调,最后提取马尔可夫毯。这样得到的特征集既简洁又稳健。
这个内容后续还可以这样扩展:把d-分离判据推广到有环图或者部分有向图,研究在更一般的图结构下条件独立性的判断方法。另外,结合因果推断中的do-演算,探讨干预条件下的独立性变化,也是一个有意思的方向。