贝叶斯网络结构学习器
BnStructureLearner
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| Learn | 1 | 从基因表达数据学习网络结构 |
| MMPCPhase | 1 | MMPC 阶段:为每个节点找到候选父节点集合 使用偏相关系数的条件独立性检验 |
| MMPCCollect | 1 | 单个目标节点的 MMPC 推断(前向 + 后向阶段) 只读共享统计量(相关矩阵等),返回该目标节点的候选父节点列表 |
| PartialCorrelation | 1 | 计算偏相关系数 ρ(x, y | Z) 使用递推公式从全相关矩阵计算 |
| MaterializeColumns | 1 | 将基因表达矩阵按基因物化为列向量(一次构建,全程复用) |
| InitRootlessScores | 1 | 预计算所有节点的无父模型BIC评分(常数项) |
| RootlessBic | 1 | 无父模型下的局部 BIC:边际分布 N(μ, σ²),参数数 k=2 |
| CacheLocalScores | 1 | 在每次搜索迭代开头预缓存全部节点的当前局部BIC评分 (迭代周期内的网络级唯一一次 fork/join,粗粒度任务适合并行) |
| ScoreNodeWithParents | 1 | 给定任意假想父母集合,计算目标节点的局部BIC 纯函数式评估:不读取/不修改共享网络的 Parents 视图,多线程天然安全 |
| RegressedBic | 1 | 给定回归系数的局部高斯BIC |
| PathExistsExcluding | 1 | 只读检测是否存在 fromV ⇒ toV 的有向路径(可选排除 forbidFrom→forbidTo 一条直接边) 用于 Reverse 操作的无环判定:删除 i→j 后再加 j→i 合法 ⇔ 图中不存在不含直接边(i,j)的 i⇒j 路径 |
| ScanRank | 1 | 计算候选操作的串行扫描序号(与原串行实现的嵌套遍历次序一一对应): i 升序 × j 升序,且同一 (i,j) 组合内 Remove 先于 Reverse 先于 Add |
| IsBetterCandidate | 1 | (delta, rank) 全序下的候选优劣判定: delta 严格更小者胜;delta 并列时取扫描序更靠前者 —— 使并行归约结果与串行实现的“字典序首个最小值”语义逐位一致,消除线程调度引起的非确定性 |
| TryUpdateCandidate | 1 | 尝试以更优的 (delta, rank) 全序更新局部最优候选 |
| EnumerateLegalOps | 1 | 枚举 (i,j) 组合上的全部合法操作并通过 report 汇报各自 delta 评分。 纯只读评估:不修改 net 结构、不写任何共享状态,多线程下天然安全。 delta 依据 BIC 的马尔可夫局部性: 删除/添加边 i→j 只改变节点 j 的局部评分; 反转 i→j 为 j→i 同时改变 j(失去父 i)与 i(获得父 j)两端评分。 |
| HillClimbingSearch | 1 | Hill-Climbing 结构搜索(delta 评分 + 外层并行归约) |
| TabuSearch | 1 | Tabu 结构搜索(delta 评分版,复用 Hill-Climbing 的并行归约骨架) |
| ComputeNetworkBIC | 1 | 计算整个网络的 BIC 评分 BIC = Σ BIC_node BIC_node = -2·LL_node + k_node·log(n) 对于高斯BN:LL_node = -n/2·log(2πσ²) - 1/(2σ²)·RSS |
| ComputeNodeBIC | 1 | 计算单个节点在其当前父母集合下的 BIC |
| BuildDesignMatrix | 1 | 构建回归设计矩阵(自物化的基因表达列向量快速构建) |
| TDistPValue | 1 | t 分布 P 值(双侧)的近似计算 使用正态近似(大样本)或查表插值 |
| NormalCDF | 1 | 标准正态 CDF 近似 |
| IncompleteBeta | 1 | 不完全 Beta 函数近似 |
| BetaCF | 1 | Beta 连分数展开 |
| GammaLn | 1 | Gamma 函数对数(Stirling 近似) |
03 Fields
| Name | Overloads | Summary |
|---|---|---|
| _geneExpr | 1 | 物化的基因表达列向量 _geneExpr(g):避免热路径上反复分配数组 |
| _rootlessScores | 1 | 预计算的无父模型局部BIC评分(常数项,奇异矩阵时的回退目标) |
| _localScores | 1 | 当前迭代的节点局部BIC缓存(每次搜索迭代开头由 CacheLocalScores 刷新) |
| _wlEdges | 1 | 白名单正向边索引集:保护白名单边不被结构搜索删除/反转 |
| _mergeLock | 1 | 并行归约各线程局部最优候选时的合并锁 |
04 Members
从基因表达数据学习网络结构
MMPC 阶段:为每个节点找到候选父节点集合 使用偏相关系数的条件独立性检验
以目标节点为粒度并行分发:各 target 的 CPC 推断相互独立且只读共享统计量, 各自写入私有列表,结束后由主线程合并入共享候选集(消除共享 HashSet 写竞争)
Int32)单个目标节点的 MMPC 推断(前向 + 后向阶段) 只读共享统计量(相关矩阵等),返回该目标节点的候选父节点列表
Int32, Int32, List(Of Int32))计算偏相关系数 ρ(x, y | Z) 使用递推公式从全相关矩阵计算
将基因表达矩阵按基因物化为列向量(一次构建,全程复用)
预计算所有节点的无父模型BIC评分(常数项)
Int32)无父模型下的局部 BIC:边际分布 N(μ, σ²),参数数 k=2
在每次搜索迭代开头预缓存全部节点的当前局部BIC评分 (迭代周期内的网络级唯一一次 fork/join,粗粒度任务适合并行)
Int32, List(Of Int32))给定任意假想父母集合,计算目标节点的局部BIC 纯函数式评估:不读取/不修改共享网络的 Parents 视图,多线程天然安全
Int32, Double(), List(Of Int32))给定回归系数的局部高斯BIC
只读检测是否存在 fromV ⇒ toV 的有向路径(可选排除 forbidFrom→forbidTo 一条直接边) 用于 Reverse 操作的无环判定:删除 i→j 后再加 j→i 合法 ⇔ 图中不存在不含直接边(i,j)的 i⇒j 路径
Int32, Int32, Int32, EdgeOp)计算候选操作的串行扫描序号(与原串行实现的嵌套遍历次序一一对应): i 升序 × j 升序,且同一 (i,j) 组合内 Remove 先于 Reverse 先于 Add
(delta, rank) 全序下的候选优劣判定: delta 严格更小者胜;delta 并列时取扫描序更靠前者 —— 使并行归约结果与串行实现的“字典序首个最小值”语义逐位一致,消除线程调度引起的非确定性
尝试以更优的 (delta, rank) 全序更新局部最优候选
Int32, Int32, HashSet(Of ValueTuple(Of Int32, Int32)), HashSet(Of ValueTuple(Of Int32, Int32)), Boolean, Action(Of EdgeOp, Double, Int64))枚举 (i,j) 组合上的全部合法操作并通过 report 汇报各自 delta 评分。 纯只读评估:不修改 net 结构、不写任何共享状态,多线程下天然安全。 delta 依据 BIC 的马尔可夫局部性: 删除/添加边 i→j 只改变节点 j 的局部评分; 反转 i→j 为 j→i 同时改变 j(失去父 i)与 i(获得父 j)两端评分。
HashSet(Of ValueTuple(Of Int32, Int32)))Hill-Climbing 结构搜索(delta 评分 + 外层并行归约)
与传统“试探修改网络 + 全网重评分”的模式不同:
- 每轮迭代开头只做一次网络级 Parallel.For,预缓存全部节点的局部BIC;
- 内层 (i,j) 操作评估纯只读,仅重算受影响节点的局部分(delta 评估), 单次评估成本由 O(nG·cost) 降为 O(cost);
- 外层 i 循环以 thread-local 归约方式展开到全部CPU核心。
收敛后校验内部跟踪 BIC 与重新计算 BIC 的漂移量(应≈0),并断言网络为合法 DAG。
Tabu 结构搜索(delta 评分版,复用 Hill-Climbing 的并行归约骨架)
保持原实现的禁忌表与“渴望准则”(优于历史最优的禁忌操作可解禁)语义; 评估方式改为纯只读 delta 评分,并统一纳入黑名单/白名单/父数上限等合法性约束。 原实现不含反转操作,此处同样仅枚举 删除/添加 两类操作。
Boolean)计算整个网络的 BIC 评分 BIC = Σ BIC_node BIC_node = -2·LL_node + k_node·log(n) 对于高斯BN:LL_node = -n/2·log(2πσ²) - 1/(2σ²)·RSS
粗粒度并行:以节点为单位执行一次网络级 Parallel.For() fork/join。 本方法仅供搜索起点/终点做完整评分校验使用; 搜索热路径内部应采用基于马尔可夫局部性的 delta 增量评估,避免全网重复计算。
计算单个节点在其当前父母集合下的 BIC
委托至共享实现 BnStructureLearner.ScoreNodeWithParents(): 回归设计矩阵奇异时退化为无父模型评分 (修复原先将均值数值误用作索引导致 Array.IndexOf 返回 -1 越界的缺陷)
List(Of Int32), Int32)构建回归设计矩阵(自物化的基因表达列向量快速构建)
Double, Int32)t 分布 P 值(双侧)的近似计算 使用正态近似(大样本)或查表插值
Double)标准正态 CDF 近似
Double, Double, Double)不完全 Beta 函数近似
Double, Double, Double)Beta 连分数展开
Double)Gamma 函数对数(Stirling 近似)
物化的基因表达列向量 _geneExpr(g):避免热路径上反复分配数组
预计算的无父模型局部BIC评分(常数项,奇异矩阵时的回退目标)
当前迭代的节点局部BIC缓存(每次搜索迭代开头由 CacheLocalScores 刷新)
白名单正向边索引集:保护白名单边不被结构搜索删除/反转
并行归约各线程局部最优候选时的合并锁