def computeMI2(spn, f1, f2, verbose=False): Pxy = spn.marginalizeToEquation([f1, f2]) Px = spn.marginalizeToEquation([f1]) Py = spn.marginalizeToEquation([f2]) sumIxy = "{Pxy} * (log({Pxy})/log(2) - (log({Px})/log(2) + log({Py})/log(2)))".format( **{ 'Pxy': Pxy, 'Px': Px, 'Py': Py }) # evl = lambda x, y: eval(sumIxy, None, {"x_%s_" % f1:x, "x_%s_" % f2: y, "poissonpmf":poissonpmf}) evl = compileEq(sumIxy, { "x_%s_" % f1: "x", "x_%s_" % f2: "y" }, compileC=False) Ixy = nsum(lambda x, y: evl(int(x), int(y)), [0, inf], [0, inf], verbose=False, method="d", tol=10**(-10)) if verbose: print("I(%s,%s)=%s" % (f1, f2, Ixy)) return Ixy
def computeEntropy2(spn, f1, f2, verbose=False): Pxy = spn.marginalizeToEquation([f1, f2]) sumHxy = "{Pxy} * log({Pxy})/log(2)".format(**{'Pxy': Pxy}) evl = compileEq(sumHxy, {"x_%s_" % f1: "x", "x_%s_" % f2: "y"}) # evl = lambda x, y: eval(sumHxy, None, {"x_%s_" % f1:x, "x_%s_" % f2: y, "poissonpmf": poissonpmf}) Hxy = -nsum(lambda x, y: evl(int(x), int(y)), [0, inf], [0, inf], verbose=False, methomethod="d", tol=10**(-10)) if verbose: print("H(%s,%s)=%s" % (f1, f2, Hxy)) return Hxy
def computeExpectation(spn, f1, verbose=False): Px = spn.marginalizeToEquation([f1]) sumEx = "x * {Px}".format(**{'Px': Px}) evl = compileEq(sumEx, {"x_%s_" % f1: "x"}) Ex = nsum(lambda x: evl(int(x)), [0, inf], verbose=False, method="d", tol=10**(-10)) if verbose: print("E(%s)=%s" % (f1, Ex)) return Ex
def computeEntropy(spn, f1, verbose=False): Px = spn.marginalizeToEquation([f1]) sumHxy = "{Px} * log({Px})/log(2)".format(**{'Px': Px}) evl = compileEq(sumHxy, {"x_%s_" % f1: "x"}) Hx = -nsum(lambda x: evl(int(x)), [0, inf], verbose=False, method="d", tol=10**(-10)) if verbose: print("H(%s)=%s" % (f1, Hx)) return Hx
def computeExpectation2(spn, f1, f2, verbose=False): Pxy = spn.marginalizeToEquation([f1, f2]).replace("x_%s_" % f1, "x").replace( "x_%s_" % f2, "y") sumExy = "(x * y) * {Pxy}".format(**{'Pxy': Pxy}) evl = compileEq(sumExy, {"x_%s_" % f1: "x", "x_%s_" % f2: "y"}) Exy = nsum(lambda x, y: evl(int(x), int(y)), [0, inf], [0, inf], verbose=False, method="d", tol=10**(-10)) if verbose: print("E(%s, %s)=%s" % (f1, f2, Exy)) return Exy
def getJointDist(self, f1, f2): Pxy = self.marginalizeToEquation([f1, f2]) func = compileEq(Pxy, {"x_%s_" % f1: "x", "x_%s_" % f2: "y"}) return func