import autograd.numpy as np from autograd import grad def g(m): return np.log(1 - np.exp(-m)) def h(m): return -m def ll(cascades, theta): res = 0 for x, s in cascades: for t in range(1, x.shape[1] + 1): w = np.dot(x[t-1], theta) res += g(w)[x[t]].sum() + h(w)[~x[t] & s[t]].sum() def sample(params): return np.random.normal(*params) def ll_full(params, cascades): nsamples = 50 return np.mean([ll(cascades, sample(params)) for _ in xrange(nsamples)]) grad_ll_full = grad(ll_full)