def _generate_sample_from_state(self, state, random_state=None): """Generate random samples from the output distribution of a state. Returns ------- sample : mp.array, shape (`n_features`,) """ x = vonmises.rvs(self._kappas_[state], self._means_[state]) return circwrap(x)
def create_timeseries(means, kappas, transmat): """Construct a random timeseries based on a specified Markov model.""" numStates = len(means) state = random.randint(0, numStates - 1) cdf = np.cumsum(transmat, 1) numFrames = 1000 X = np.empty((numFrames, 1)) for i in range(numFrames): rand = random.random() state = (cdf[state] > rand).argmax() X[i, 0] = circwrap(vonmises.rvs(kappas[state], means[state])) return X
def adjust(self, node): """ sample from posterior """ D = np.vstack([d.pos for d in node.data ]) old=np.array([node.get_likelihood_angle(d) for d in node.data ]) old=np.log(old).mean() #import ipdb as pdb; pdb.set_trace() D -= node.parent.pos D = D.T old_angle = node.angle # determine posterior of angle given prior and data x_ang = np.arctan2(D[1,:],D[0,:]) R1 = self.angle_kappa * np.cos(node.parent.angle) + np.sum(np.cos(x_ang)) R2 = self.angle_kappa * np.sin(node.parent.angle) + np.sum(np.sin(x_ang)) #R1 = np.sum(np.cos(x_ang)) #R2 = np.sum(np.sin(x_ang)) mu = np.arctan2(R2,R1) Rn = R1 / np.cos(mu) node.angle = vonmises.rvs(Rn,loc=mu) #node.angle = mu X = D.copy() # rotate around newly drawn angle D = np.dot(rotmat(-node.angle), D) assert D.shape[1] == len(node.data) # determine posterior of length given prior and data aN = self.length_a0 + D.shape[1]/2.0 bN = self.length_b0 + D.shape[1]/2.0 * np.var(D[0,:]) #aN = D.shape[1]/2.0 #bN = D.shape[1]/2.0 * np.var(D[0,:]) #import ipdb; ipdb.set_trace() node.length = gamma.rvs(aN,loc=1.0/bN) #node.length = np.var(D[0,:]) old_pos = node.pos.copy() node.update_position() def f(): plt.plot(X[0,:],X[1,:],".b") #plt.plot(D[0,:],D[1,:],".r") plt.plot(node.pos[0]-node.parent.pos[0],node.pos[1]-node.parent.pos[1],"*r") plt.plot(old_pos[0]-node.parent.pos[0],old_pos[1]-node.parent.pos[1],"*b") #plt.plot(node.parent.pos[0],node.parent.pos[1],"*r") plt.show() new=np.array([node.get_likelihood_angle(d) for d in node.data ]) new=np.log(new).mean() print('old likelihood: %f new likelihood: %f'%(old,new))