Exemple #1
0
    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)
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
    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))