def CDist(scm_a, scm_b, nb_samples_x, nb_samples_k=5, discrete=False): nodes_a = scm_a.nodes() nodes_b = scm_b.nodes() assert nodes_a == nodes_b, \ "The two causal graphs should have the same nodes" n = len(nodes_a) x_distrib = IndependentComponentsDistribution( [UniformDistribution(0, 1) for _ in range(n)]) scm_a.precompute_log_probabilities() scm_b.precompute_log_probabilities() results = IDist(scm_a, scm_b, nb_samples_k, discrete=discrete) for x in x_distrib.sample(nb_samples_x): # print('x: ' + str(x)) cf_a = en.NUTSSampler(n, scm_a.log_probability) cf_b = en.NUTSSampler(n, scm_b.log_probability) counterfactual_scm_a = copy.deepcopy(scm_a) counterfactual_scm_b = copy.deepcopy(scm_b) # print("Creating noise") a_samples = cf_a.sample(x, M=nb_samples_k, Madapt=200) b_samples = cf_b.sample(x, M=nb_samples_k, Madapt=200) counterfactual_scm_a.noises_distribution = CounterfactualNoise( a_samples, x, nb_samples_k) counterfactual_scm_b.noises_distribution = CounterfactualNoise( b_samples, x, nb_samples_k) # print('End noise') # print("Run IDist") results += IDist(counterfactual_scm_a, counterfactual_scm_b, nb_samples_k, discrete=discrete) # print("E nd IDist") return results / float(nb_samples_x + 1)
def __init__(self, funcs): """ A multidimensional freeform probability distribution object for independent dimensions Parameters ---------- funcs: list, chippr.gauss or chippr.discrete or chippr.gmix objects 1D functions, one per dimension """ self.funcs = funcs self.dims = len(funcs) #for d in range(self.dims): # print('multi dist '+str((d, type(self.funcs[d])))) self.funcs = [func.dist for func in self.funcs] self.dist = ICD(self.funcs)
def non_gaussian_noise(n): IndependentComponentsDistribution([ GammaDistribution(alpha=np.random.rand(), beta=np.random.rand()) for _ in range(n) ])
def default_gaussian_noise(n): return IndependentComponentsDistribution( [NormalDistribution(0, np.random.rand()) for _ in range(n)])
def default_noise(n): return IndependentComponentsDistribution( [NormalDistribution(0, 0.1) for _ in range(n)])
class multi_dist(object): def __init__(self, funcs): """ A multidimensional freeform probability distribution object for independent dimensions Parameters ---------- funcs: list, chippr.gauss or chippr.discrete or chippr.gmix objects 1D functions, one per dimension """ self.funcs = funcs self.dims = len(funcs) #for d in range(self.dims): # print('multi dist '+str((d, type(self.funcs[d])))) self.funcs = [func.dist for func in self.funcs] self.dist = ICD(self.funcs) def pdf(self, points): return self.evaluate(points) def evaluate_one(self, point): """ Function to evaluate the probability at a point in multidimensional space Parameters ---------- point: numpy.ndarray, float coordinate at which to evaluate the probability Returns ------- prob: float probability associated with point """ # prob = 1. # for d in range(self.dims): # prob *= self.funcs[d].evaluate_one(point[d]) prob = self.dist.probability(point) return prob def evaluate(self, points): """ Function to evaluate the probability at a point in multidimensional space Parameters ---------- points: numpy.ndarray, float coordinates at which to evaluate the probability Returns ------- probs: float probabilities associated with points """ # if len(np.shape(points.T)) == 1: # return self.evaluate_one(points) # probs = np.ones(len(points)) # points = points.T # for d in range(self.dims): # probs *= self.funcs[d].evaluate(points[d]) probs = self.dist.probability(points) return probs def sample_one(self): """ Function to take one sample from independent distributions Returns ------- point: numpy.ndarray, float single sample from independent distributions """ # point = np.zeros(self.dims) # for d in range(self.dims): # point[d] = self.funcs[d].sample_one() point = self.dist.sample(1) return point def sample(self, n_samps): """ Function to sample from multivariate probability distribution with independent components Parameters ---------- n_samps: positive int number of samples to take Returns ------- points: ndarray, float array of n_samps samples from independent distributions """ # print('multi_dist trying to sample '+str(n_samps)+' from '+str(self.dist)) # points = np.array([self.sample_one() for n in range(n_samps)]) points = np.array([self.dist.sample() for n in range(n_samps)]) # print('multi_dist sampled '+str(n_samps)+' from '+str(self.dist)) return points