def sample_emcee(self, nIterations): ndim = self.nNodes*36 self.nwalkers = 2 * ndim self.theta0 = np.zeros(ndim) p0 = [self.theta0 + 1e-4*np.random.randn(ndim) for i in range(self.nwalkers)] self.sampler = emcee.EnsembleSampler(self.nwalkers, ndim, self.logLikelihood) loop = 0 self.chain = np.zeros((nIterations,self.nwalkers,ndim)) for result in self.sampler.sample(p0, iterations=nIterations, storechain=False): out, _ = tr.lrBoundedForward(result[0], self.low, self.up) self.chain[loop,:,:] = out ps.util.progressbar(loop, nIterations, text='sampling') loop += 1
def logLikelihood(self, thetaIn): theta, lnJactheta = tr.lrBoundedForward(thetaIn, self.low, self.up) matrix = theta.reshape((self.nNodes,self.nParties,self.nParties)) self.matrix = np.zeros((self.nTimes,self.nParties,self.nParties)) for i in range(self.nParties): for j in range(self.nParties): tmp = interp.UnivariateSpline(self.timeNodes, matrix[:,i,j]) self.matrix[:,i,j] = tmp(self.obsTime) out = np.zeros((self.nTimes,self.nParties)) out[0,:] = self.initialCondition for i in range(self.nTimes-1): out[i+1,:] = out[i,:] + ( self.obsTime[i+1] - self.obsTime[i] ) * self.matrix[i,:,:].dot(out[i,:]) logL = np.sum( (out[1:,:] - self.party[1:,:])**2 / 0.1**2 ) #print(logL) return logL + np.sum(lnJactheta)