我正在python中实现PC算法。这种算法构建了一个 n 变量高斯分布的图形模型。这个图形模型基本上是有向无环图的骨架,这意味着如果一个结构像:
(x1)---(x2)---(x3)
在图中,则 x1 与给定 x2 的 x3 无关。更一般地,如果 A 是图的邻接矩阵且 A(i,j)=A(j,i) = 0(i 和 j 之间缺少边),则 i 和 j 条件独立,所有变量出现在从 i 到 j 的任何路径中。出于统计和机器学习的目的,可以“学习”底层图形模型。如果我们对联合高斯 n 变量随机变量有足够的观察,我们可以使用 PC 算法,其工作原理如下:
given n as the number of variables observed, initialize the graph as G=K(n)
for each pair i,j of nodes:
if exists an edge e from i to j:
look for the neighbours of i
if j is in neighbours of i then remove j from the set of neighbours
call the set of neighbours k
TEST if i and j are independent given the set k, if TRUE:
remove the edge e from i to j
该算法还计算图的分离集,该分离集由另一种算法使用,该算法构建从骨架开始的 dag 和由 pc 算法返回的分离集。这是我到目前为止所做的:
def _core_pc_algorithm(a,sigma_inverse):
l = 0
N = len(sigma_inverse[0])
n = range(N)
sep_set = [ [set() for i in n] for j in n]
act_g = complete(N)
z = lambda m,i,j : -m[i][j]/((m[i][i]*m[j][j])**0.5)
while l<N:
for (i,j) in itertools.permutations(n,2):
adjacents_of_i = adj(i,act_g)
if j not in adjacents_of_i:
continue
else:
adjacents_of_i.remove(j)
if len(adjacents_of_i) >=l:
for k in itertools.combinations(adjacents_of_i,l):
if N-len(k)-3 < 0:
return (act_g,sep_set)
if test(sigma_inverse,z,i,j,l,a,k):
act_g[i][j] = 0
act_g[j][i] = 0
sep_set[i][j] |= set(k)
sep_set[j][i] |= set(k)
l = l + 1
此函数实现了一个统计测试,该测试使用了估计偏相关的 Fisher z 变换。我以两种方式使用这个算法:
从线性回归模型生成数据并将学习到的 DAG 与预期的进行比较
读取数据集并学习底层 DAG
在这两种情况下,我并不总是得到正确的结果,要么是因为我知道某个数据集背后的 DAG,要么是因为我知道生成模型但它与我的算法学习的模型不一致。我完全知道这是一项重要的任务,即使在我在这里省略的部分代码中,我也可能误解了理论概念以及犯了错误;但首先我想知道(从比我更有经验的人那里),如果我写的测试是正确的,并且是否有执行此类测试的库函数,我尝试搜索但我找不到任何合适的功能。
交互式爱情
相关分类