From 7035c097fe9337c406d31d54c3f54af67014d323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Faria?= Date: Sun, 16 Aug 2020 19:39:42 +0100 Subject: [PATCH] hidden vars --- cimg.png | Bin 20160 -> 25660 bytes scm.py | 28 ++++++++++++++++++++-------- test.py | 6 ++++-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/cimg.png b/cimg.png index 8c7a7861e6b7454124ace1d3e898e7be930d2308..4bdb0e81b62bf513fcf87631d98341b9230fcdaa 100644 GIT binary patch literal 25660 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 b&oKzA`1DK{EXjkj(UcX{6jJvbyYT-2&$gly literal 20160 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 diff --git a/scm.py b/scm.py index 80271e7..d9907e6 100644 --- a/scm.py +++ b/scm.py @@ -9,6 +9,11 @@ def Variable(name, dist): SCM.model.addVariable(arv) return arv +def HiddenVariable(name,dist): + arv = AncestorRandomVariable(name, dist, observed=False) + SCM.model.addVariable(arv) + return arv + class SCM(Named): def __init__(self, @@ -47,13 +52,13 @@ def mark(self, name, rv): rv._mark() del self.nodes[rv.name] - rv.name = "RV/" + name + rv.name = "M/" + name self.addAuxVariable(rv) return rv def draw_complete(self): - plt.figure() + plt.figure(figsize=(12,8)) plt.title(self.name) G = nx.DiGraph() @@ -64,7 +69,7 @@ def draw_complete(self): for to in n.outbound : G.add_edge(n.name,to.name) - nx.draw(G,with_labels=True, arrows=True, node_size=1400) + nx.draw(G,with_labels=True, arrows=True, node_size=1200) plt.savefig("img.png") @@ -80,10 +85,10 @@ def reach(rv): return l def draw(self): - plt.figure() + plt.figure(figsize=(12,8)) plt.title(self.uname()) G = self.build_causal_graph() - nx.draw(G,with_labels=True, arrows=True, node_size=1400) + nx.draw(G,with_labels=True, arrows=True, node_size=1200) plt.savefig("cimg.png") @@ -93,7 +98,9 @@ def build_causal_graph(self): q = queue.Queue() for n in self.ancestors: - q.put(self.nodes[n]) + node = self.nodes[n] + if node.observed : + q.put(node) for n in self.nodes.values(): if n.observed : @@ -131,6 +138,10 @@ def addChildren(self, chlds): def _mark(self): self.observed = True + def mark(self): + self._mark() + return self + def reach(self): l= [] @@ -158,9 +169,10 @@ def mark(self, name): class AncestorRandomVariable(RandomVariable): def __init__(self, name, - sampler): + sampler, + observed=True): super(AncestorRandomVariable,self).__init__(name, - True) + observed) self.sampler=sampler def sample(self, sample_shape=()): diff --git a/test.py b/test.py index dea3543..2b53aac 100644 --- a/test.py +++ b/test.py @@ -5,10 +5,12 @@ model = SCM("Simple Causal Graph") X = Variable("X", tfp.distributions.Normal(loc=0,scale=1)) +Z = Variable("Z", tfp.distributions.Normal(loc=0,scale=1)) +Ny = HiddenVariable("Ny", tfp.distributions.Normal(loc=0, scale=1)) -Y = math.exp( math.square(X) ).mark("Y") +NyZ = math.multiply(Ny,Z) -Z = math.add(X, Y).mark("Z") +Y = math.add( NyZ, math.exp( math.square(X)) ).mark("Y") model.draw() model.draw_complete()