def __init__(self, fit_params=None, verbose=False): if fit_params is None or fit_params == 'mle': fit_params = lambda structure, data: to_mvn(*gn_params(structure, data, sparse=True)) elif fit_params == 'ridge': fit_params = lambda structure, data: to_mvn(*gn_params(structure, data, sparse=True, l2_reg=0.1)) elif callable(fit_params): fit_params = fit_params else: raise NotImplementedError('Only mle estimation is currently available') self.fit_params = fit_params self.verbose = verbose
variables = list(range(5)) gen_mean = np.zeros(len(variables)) gen_var = np.zeros(len(variables)) + 0.2 gen_weight = 2 diff_norm_mean = 0 diff_norm_cov = 0 for i, s in enumerate(seeds): print('Test {0}/{1}'.format(i + 1, len(seeds))) graph = random_dag(variables, rng=rng) beta = graph.T * gen_weight mvn = to_mvn(gen_mean, gen_var, beta, return_mvn=True) n_samples = 200 sample_seed = rng.randint(0, 2**32 - 1) data_gn = sample_from_gn(graph, gen_mean, gen_var, beta, n_samples, sample_seed) data_mvn = mvn.rvs(n_samples, sample_seed) mean_gn = np.mean(data_gn, axis=0) mean_mvn = np.mean(data_mvn, axis=0) cov_gn = np.cov(data_gn, rowvar=False) cov_mvn = np.cov(data_mvn, rowvar=False) mean_norm = norm(mean_mvn - mean_gn)
return mean / graph.n_nodes for i, s in enumerate(seeds): print('Test {0}/{1}'.format(i + 1, len(seeds))) graph = random_dag(variables, rng=rng) beta = graph.T * gen_weight sample_seed = rng.randint(0, 2**32-1) data_gn = sample_from_gn(graph, gen_mean, gen_var, beta, n_samples, sample_seed) mu, var, b = gn_params(graph, data_gn, sparse=True) mu, sigma = to_mvn(mu, var, b) b = b.A # print(beta) # print(b) mean_norm = norm(gen_mean - mu) var_norm = norm(gen_var - var) # noinspection PyTypeChecker beta_norm = norm(beta - b) sklearn_check = sklearn_fit(graph, b) total_mean += mean_norm total_cov += var_norm total_beta += beta_norm
def parameter_estimator(structure, data): return to_mvn(*gn_params_ridge(structure, data, sparse=True, l2_reg=0.1))