PC算法详解

news/2024/9/19 17:54:10/文章来源:https://www.cnblogs.com/bleu/p/18412938

基于约束的方法(PC(Peter-Clark)算法)

基于约束的方法大多数是在经验联合分布上测试条件独立性,来构造一张反映这些条件独立性的图。通常会有多个满足一组给定的条件独立性的图,所以基于约束的方法通常输出一个表示某个 MEC(边缘计算) 的图(例如,一个 PAG)。

最有名的算法是 PC 算法,

  1. 从一个完全无向图开始,通过条件独立性(d-separation)测试逐步去除边来识别骨架。
  2. 条件独立性测试用来评估 \(X_i \perp \!\!\! \perp X_j|S\),其中条件集合S可能为空。
  3. 之后,如果骨架中存在一条 \(X_i-X_k-X_j\) 这样的路径满足 \(X_i\perp \!\!\! \perp X_j\)\(X_i\not\!\perp\!\!\!\perp X_j|X_k\) ,那么我们可以知道这条路径事实上一定是一个 v-结构,可以确定边的方向为 \(X_i\rightarrow X_k\leftarrow X_j\)
  4. 在确定了所有 v-结构之后可以尝试给图中剩余的边确定方向,同时保持图的无环性,并尽量避免产生新的 v-结构

算法伪代码步骤详解:

  • 基于给定的顶点集V和条件独立性信息来估计一个骨架(skeleton)C以及可能的分离集S(这些分离集只在后续定向骨架时用得到)。

image

  1. 初始化:首先,基于顶点集V形成一个完全无向图,这是所有可能边都存在的图。然后,初始化一个计数器λ为-1,并设置当前的骨架C
  2. 外层循环:算法通过逐渐增加λ的值来迭代,每次迭代都尝试移除更多的边λ代表考虑作为条件集k的元素数量的上限。
  3. 内层循环:对于每个λ值,算法遍历当前骨架C中所有相邻的顶点对(i, j),但只考虑那些 除了j之外,还有至少λ+1个邻居的顶点i(即|adj(C, i) \ {j}| ≥ λ)。
  4. 条件独立性测试:对于每一对这样的顶点ij,算法尝试所有可能的子集k(从adj(C, i) \ {j}中选择,且|k| = λ),检查在给定k的条件下,ij是否条件独立。
  5. 更新骨架:如果对于某个kij是条件独立的,则从当前骨架C中删除边(i, j),并将k保存到分离集S(i, j)S(j, i)中。然后,尝试下一个可能的k,直到找到至少一个使ij条件独立的k,或者尝试了所有可能的k
  6. 终止条件:当对于所有相邻的顶点对(i, j)|adj(C, i) \ {j}| < λ时,算法终止。这意味着在当前的λ值下,没有更多的边可以被删除。

​ 通过逐步增加条件集k的大小(即λ的值),来更精确地确定哪些变量对在给定其他变量时是条件独立的。通过这种方式,可以逐步减少完全图中的边数,最终得到一个仅包含必要边的骨架图。

  • 条件独立检验(d-分离)用这个结论公式来替换上面伪代码的第11行

image

image

​ PC 算法采用了 Fisher Z Test作为条件独立性检验方法。实际上 Fisher Z Test 是一种相关性检验方法,但 PC 算法认为这一堆随机变量整体上服从多元高斯分布,这时“变量条件独立(没有相关性)”与“变量之间的偏相关系数为 0” 等价。

​ 偏相关系数指校正其它变量后某一变量与另一变量的相关关系,校正的意思可以理解为假定其它变量都取值为均数。任意两个变量 \(i, j\)\(h\) 阶(排除其他 \(h\) 个变量的影响后, \(h<=k-2\) )偏相关系数为:\(\rho_{i,j \mid K} = \frac{\rho_{i,j \mid K \backslash h} - \rho_{i,h \mid K \backslash h} \rho_{j,h \mid K \backslash h}}{\sqrt{(1 - \rho^2_{i,h \mid K \backslash h}) (1 - \rho^2_{j,h \mid K \backslash h})}}\)

为了判断 \(\rho\) 是否为 0,需要将 \(\rho\) 通过 Fisher Z 变换转换成正态分布:\(Z(i, j \mid K) = \frac{1}{2} \log (\frac{1 + \hat{\rho}_{i,j \mid K}}{1 - \hat{\rho}_{i,j \mid K}})\)

定义零假设和对立假设:

  • 零假设: \(H_0(i,j \mid K): \rho_{i,j \mid K} = 0\),给定条件k下,变量ij之间不存在条件相关性,即条件独立
  • 对立假设: \(H_A(i,j \mid K): \rho_{i,j \mid K} \not= 0\)

然后给定一个显著性水平 \(\alpha \in (0, 1)\) ,那么(双侧)检验的规则为,如果有:$\sqrt{n - |K| - 3}| Z(i,j \mid K) > \Phi^{-1} (1 - \alpha/2) $

其中 \(\Phi(\cdot)\)\(\mathcal{N}(0, 1)\) 标准正态分布的累积分布函数CDF(norm.cdf),则拒绝零假设\(i, k\) 关于 \(K\) 条件相关。所以将上面伪代码的第 11 行替换成$\sqrt{n - |K| - 3}| Z(i,j \mid K) \leq \Phi^{-1} (1 - \alpha/2) $。

  • 将骨架扩展到DAG的等价类CPDAG,需要用到上面的分离集S

image

  1. 初始化:从给定的骨架图Gskel和分离集S开始。
  2. 处理非邻接变量对:遍历所有在骨架图中非邻接但具有共同邻居k的变量对i, j。如果k不在i, j的分离集S(i, j)中(这个k的条件下不会使这两个i,j独立。只有对撞结构),则将i - k - j(其中-表示无向边)替换为i → k ← j(其中表示有向边)。引入必要的有向边,尽可能找出所有对撞结构。
  3. 应用定向规则:在修改后的图中,通过反复应用以下规则来尽可能多地定向无向边:
    • R1:如果存在有向边i → j,并且ik是非邻接的,则将无向边j - k定向为j → k。(上面已经找出所有对撞,这里避免对撞)
    • R2:如果存在链i → k → j,则将无向边i - j定向为i → j。(避免成环)
    • R3:如果存在两条链i - k → ji - l → j,其中kl是非邻接的,则将无向边i - j定向为i → j。这个规则用于处理更复杂的依赖关系。(可以画图看看,只有当i→j时才能完全避免成环)
    • R4(可选):虽然通常不直接需要,但如果您希望包含这个规则,它表示如果存在两条链i - k → lk → l → j,且kl是非邻接的,则将无向边i - j定向为i → j。这个规则可以通过R3的多次应用来间接实现。
  4. 终止条件:当无法再应用任何规则来定向更多的无向边时,算法终止。

由此得到一个完全部分有向无环图CPDAG,它是一个有向无环图DAG的马尔科夫等价类。所以,严格来说,PC 算法以及大多数基于依赖统计分析的贝叶斯网络结构学习算法,得到的都只是一个 CPDAG(依然有无向边),而不是真正意义上的贝叶斯网络(有向无环图)。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十九讲:幻读是什么,幻读有什么问题?

第十九讲:幻读是什么,幻读有什么问题? 简概:引入 ​ 在上一篇文章最后,我给你留了一个关于加锁规则的问题。 ​ 今天,我们就从这个问题说起吧。为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表。 ​ 建表和初始化语句如下(为了便于本期的例子说明,我把上篇…

网络计划技术——关键路线法精解

网络计划技术最早由美国杜邦公司于1957年开发的“关键路径法(CPM)”和美国海军在1958年发明的“计划评审技术(PERT)”推动。网络计划技术(Network Planning Techniques)是一种用于项目管理和调度的科学方法,其核心思想是通过构建网络图来描述项目中各个任务之间的逻辑关…

Rust使用Actix-web和SeaORM开发WebAPI通过Swagger UI查看接口文档

本文将介绍Rust语言使用Actix-web和SeaORM库,数据库使用PostgreSQL,开发增删改查项目,同时可以通过Swagger UI查看接口文档和查看标准Rust文档 开始项目 首先创建新项目,名称为rusty_crab_api cargo new rusty_crab_apiCargo.toml [dependencies] sea-orm = { version = &q…

JOI Open 2016

T1 JOIRIS你在玩俄罗斯方块,游戏区域是一个宽度为 \(n\),高度足够大的矩形网格、初始时第 \(i\) 列有 \(a_i\) 个方块。 给定参数 \(k\),你可以做不超过 \(10^4\) 次操作,来将这个网格中的所有方块全部消除,一次操作形如:在网格的最顶端落下一个 \(1 \times k\) 或者 \(k…

章12——异常exception

异常 快捷键 ctrl + alt + t 选中 try-catch 如果进行异常处理,即使出现了异常,程序可以继续执行。异常介绍 开发过程中的语法错误和逻辑错误不是异常。 执行过程中所发生的异常事件可分为如下两大类:异常体系图小结:常见的运行时异常没有关联的类不能进行上下转型 异常处理…

APB总线总结

APB总结 一、简介 APB提供了一个低功耗的接口,并降低了接口的复杂性。APB接口用在低带宽和不需要高性能总线的外围设备上。APB是非流水线结构,所有的信号仅与时钟上升沿相关,这样就可以简化APB外围设备的设计流程,每个传输至少耗用两个周期。 二、信号列表信号名 来源 描述…

面试- Web安全

XSS攻击(跨站脚本攻击)XSS预防 < < > >XSRF(CSRF)攻击(跨站请求伪造)就像是你在不知情的情况下,被别人利用你的权限发起了某个你没打算进行的请求。重点是可以把你的用户信息给带过去,你不知不觉就帮我付款了。XSS 是恶意代码“潜伏”在页面上,欺骗你去执行…

k8s 中的 Service 简介【k8s 系列之二】

〇、前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址,那么是不是有 IP 了,访问起来就简单了呢,其实不然。 因为在 k8s 中 Pod 不是持久性的,摧毁重建将获得新的 IP,客户端通过会变更 IP 来访问显然不合理。另外 Pod 还经常会通过多个副本来实现负载均衡,客户端如何高效的…

软工作业二:论文查重系统

这个作业属于哪个课程 <计科22级34班>这个作业要求在哪里 [<作业要求>](个人项目 - 作业 - 计科22级34班 - 班级博客 - 博客园 (cnblogs.com))这个作业的目标 通过实际编程任务,全面提升学生在编程、算法、项目管理、性能优化、代码测试和版本控制等方面的能力,为…

面试-JS基础知识-作用域和闭包

问题this的不同应用场景 手写bind函数 实际开发中闭包的应用场景,举例说明 创建10个<a>标签,点击的时候弹出来对应的序号作用域:某个变量的合法使用范围全局 函数 块级** 自由变量上面图的最里面的红框————a a1 a2都是自由变量,因为都没有被定义。会一层一层往上…

学习高校课程-软件设计模式-软件设计原则(lec2)

软件设计原则Feature of Good Design (1) 优秀设计的特点(一) Code reuse 代码复用 – Challenge: tight coupling between components, dependencies on concrete classes instead of interfaces, hardcoded operations – Solution: design patterns – 挑战:组件之间的紧…

ATTCK红队评估(红日靶场4)

靶场介绍本次靶场渗透反序列化漏洞、命令执行漏洞、Tomcat漏洞、MS系列漏洞、端口转发漏洞、以及域渗透等多种组合漏洞,希望大家多多利用。 环境搭建 机器密码 WEB主机 ubuntu:ubuntuWIN7主机 douser:Dotest123(DC)WIN2008主机 administrator:Test2008网络配置111网段是web的网…