def mv_simple(): mu = np.array([-.1, .5, 1.1]) p = np.array([ [2., 0, 0], [.05, .1, 0], [1., -0.05, 5.5]]) tau = np.dot(p, p.T) with pm.Model() as model: x = pm.MvNormal('x', pm.constant(mu), pm.constant( tau), shape=3, testval=np.array([.1, 1., .8])) H = tau C = np.linalg.inv(H) return model.test_point, model, (mu, C)
def mv_simple(): mu = np.array([-.1, .5, 1.1]) p = np.array([[2., 0, 0], [.05, .1, 0], [1., -0.05, 5.5]]) tau = np.dot(p, p.T) with pm.Model() as model: x = pm.MvNormal('x', pm.constant(mu), pm.constant(tau), shape=3, testval=np.array([.1, 1., .8])) H = tau C = np.linalg.inv(H) return model.test_point, model, (mu, C)
def mv_simple_discrete(): d= 2 n = 5 p = np.array([.15,.85]) with pm.Model() as model: x = pm.Multinomial('x', n, pm.constant(p), shape=d, testval=np.array([1,4])) mu = n * p #covariance matrix C = np.zeros((d,d)) for (i, j) in product(range(d), range(d)): if i == j: C[i,i] = n * p[i]*(1-p[i]) else: C[i,j] = -n*p[i]*p[j] return model.test_point, model, (mu, C)
def mv_simple_discrete(): d = 2 n = 5 p = np.array([.15, .85]) with pm.Model() as model: x = pm.Multinomial('x', n, pm.constant(p), shape=d, testval=np.array([1, 4])) mu = n * p #covariance matrix C = np.zeros((d, d)) for (i, j) in product(range(d), range(d)): if i == j: C[i, i] = n * p[i] * (1 - p[i]) else: C[i, j] = -n * p[i] * p[j] return model.test_point, model, (mu, C)
import numpy as np import matplotlib.pyplot as plt import pymc as pm k = 3 ndata = 500 spread = 5 centres = np.array([-spread, 0, spread]) v = np.random.randint(0, k, ndata) data = centres[v] + np.random.randn(ndata) l_res = plt.hist(data) plt.show() a = pm.constant(np.array([1., 1., 1.])) p = pm.Dirichlet('p', a=a, shape=k) p_min_potential = pm.Potential('p_min_potential', tt.switch(tt.min(p) < .1, -np.inf, 0)) means = pm.Normal('means', mu=[0, 0, 0], sd=15, shape=k) order_means_potential = pm.Potential( 'order_means_potential', ttswitch(means[1] - means[0] < 0, -np.inf, 0) + ttswitch(means[2] - means[1] < 0, -np.inf, 0))