# Probabilistic model T = 2. N = 100 dt = T/float(N) time_range = np.linspace(0., T, N) a = BetaVariable(1., 1., name="a") b = BetaVariable(1., 1., name="b") c = NormalVariable(0., 0.1, name="c") d = NormalVariable(0., 0.1, name="d") xi = LogNormalVariable(0.1, 0.1, name="xi") chi = LogNormalVariable(0.1, 0.1, name="chi") x_series = [NormalVariable(0., 1., name="x_0")] y_series = [NormalVariable(0., 1., name="y_0")] for n, t in enumerate(time_range): x_new_mean = (1-dt*a)*x_series[-1] + dt*c*y_series[-1] y_new_mean = (1-dt*b)*y_series[-1] + dt*d*x_series[-1] x_series += [NormalVariable(x_new_mean, np.sqrt(dt)*xi, name="x_{}".format(n+1))] y_series += [NormalVariable(x_new_mean, np.sqrt(dt)*chi, name="y_{}".format(n+1))] dynamic_causal_model = ProbabilisticModel([x_series[-1], y_series[-1]]) # Run dynamics sample = dynamic_causal_model.get_sample(number_samples=3) # Observe observable_data = sample[[x.name for x in x_series] + [y.name for y in y_series]] dynamic_causal_model.observe(observable_data) # Variational model
assignment_matrix = [[1], [1], [1], [1], [1]] people_means = [ Normal(sum([l * m for l, m in zip(assignment_list, group_means)]), 0.1, "person_{}".format(m)) for m, assignment_list in enumerate(assignment_matrix) ] scores = [ Normal(people_means[m], 0.1, "score_{}_{}".format(m, z)) for m in range(N_people) for z in range(N_scores) ] model = ProbabilisticModel(scores) # Observations sample = model.get_sample(1) data = sample.filter(regex="^score").filter(regex="^((?!scale).)*$") model.observe(data) # Variational model Qgroup_means = [ Normal(0., 4., "group_mean_{}".format(n), learnable=True) for n in range(N_groups) ] Qpeople_means = [ Normal(0., 0.1, "person_{}".format(m), learnable=True) for m, assignment_list in enumerate(assignment_matrix) ] model.set_posterior_model(ProbabilisticModel(Qpeople_means + Qgroup_means)) # Inference # N_itr = 300 N_smpl = 50
dim=1, keepdim=True), dim=2, keepdim=True) #TODO; not very intuitive response = NormalVariable(mean_response, nu, name="response") model = ProbabilisticModel([response, experimental_input]) # Generate data and observe the model sample = model.get_sample(15, input_values={ mu_x: 1., mu_y: 2., v: 0.3, nu: 0.1 })[["x", "y", "w1", "w2", "b", "response"]] model.observe(sample) # Variational model Qmu_x = NormalVariable(0., 1., name="mu_x", learnable=True) Qmu_y = NormalVariable(0., 1., name="mu_y", learnable=True) Qv = LogNormalVariable(0., 0.1, name="v", learnable=True) Qnu = LogNormalVariable(-1, 0.01, name="nu", learnable=True) variational_posterior = ProbabilisticModel([Qmu_x, Qmu_y, Qv, Qnu]) model.set_posterior_model(variational_posterior) # Inference # inference.perform_inference(model, number_iterations=1500, number_samples=50, optimizer='Adam', lr=0.01)