Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyMC3中构建离散HMM的问题_Python_Hidden Markov Models_Pymc3 - Fatal编程技术网

Python 在PyMC3中构建离散HMM的问题

Python 在PyMC3中构建离散HMM的问题,python,hidden-markov-models,pymc3,Python,Hidden Markov Models,Pymc3,我在玩PyMC3中的玩具离散HMM模型,遇到了一些问题 我的初始代码如下所示: # Known transition and emission with pymc3.Model() as hmm1: T = tt.as_tensor_variable(Tr) E = tt.as_tensor_variable(Er) # State models p0 = np.ones(num_states) / num_states # No shape, so ea

我在玩PyMC3中的玩具离散HMM模型,遇到了一些问题

我的初始代码如下所示:

# Known transition and emission
with pymc3.Model() as hmm1:
    T = tt.as_tensor_variable(Tr)
    E = tt.as_tensor_variable(Er)
    # State models
    p0 = np.ones(num_states) / num_states
    # No shape, so each state is a scalar tensor
    states = [pymc3.Categorical('s0', p=p0)]
    emissions = [pymc3.Categorical('z0', p=E[:,states[0]], observed=Zr[:,0])]
    for i in range(1, num_times):
        states.append(pymc3.Categorical('s{0}'.format(i), p=T[:,states[i-1]]))
        emissions.append(pymc3.Categorical('z{0}'.format(i), p=E[:,states[i]], observed=Zr[:,i]))
这里
Tr
Er
是真正的过渡和发射矩阵

我的问题是:

  • 该模型似乎没有探究状态的完整值,它停留在每个状态的单个值上(参见笔记本)

  • 我还没有找到一种方法来定义
    状态
    排放
    ,例如使用
    形状=…

  • 此外,当我扩展模型以考虑未知的过渡或发射矩阵时,我遇到了一个索引问题,我被迫使用
    theano.tensor.clip
    ,如下一个代码:

    # Unknown transitions and emissions
    with pymc3.Model() as hmm3:
        # Transition "matrix"
        a_t = np.ones((num_states,num_states))
        T = pymc3.Dirichlet('T', a=a_t, shape=(num_states,num_states))
        # Emission "matrix"
        a_e = np.ones((num_emissions, num_states))
        E = pymc3.Dirichlet('E', a=a_e, shape=(num_emissions, num_states))
        # State models
        p0 = np.ones(num_states) / num_states
        # No shape, so each state is a scalar tensor
        states = [pymc3.Categorical('s0', p=p0)]
        clp_state = tt.clip(states[0], 0, num_states-1)
        emissions = [pymc3.Categorical('z0', p=E[:,clp_state], observed=Zr[0])]
        for i in range(1, num_times):
            clp_prev_state = tt.clip(states[i-1], 0, num_states-1)
            states.append(pymc3.Categorical('s{0}'.format(i), p=T[:,clp_prev_state]))
            clp_state = tt.clip(states[i], 0, num_states-1)
            emissions.append(pymc3.Categorical('z{0}'.format(i), p=E[:,clp_state], observed=Zr[i]))
    
  • 请参阅以下内容。

    定义隐马尔可夫状态模型的更为pymc3的方法(或者,更为无方法)如下所示:

    class HMMStatesN(pm.Categorical):
        """
        Hidden Markov Model States
        Parameters
        ----------
        P : tensor
            transition probability
            shape = (N_states,N_states)
    
        PA : tensor
             equilibrium probabilities
             shape = (N_states)
    
        """
    
        def __init__(self, PA=None, P=None,
                     *args, **kwargs):
            super(pm.Categorical, self).__init__(*args, **kwargs)
            self.P = P
            self.PA = PA
            self.k = N_states
            self.mode = tt.cast(0,dtype='int64')
    
        def logp(self, x):
            P = self.P
            PA = self.PA
    
            # calculate equilibrium
    
            # now we need to create an array with probabilities
            # so that for x=A: PA=P1, PB=(1-P1)
            # and for x=B: PA=P2, PB=(1-P2)
            #P = tt.switch(x[:-1],P1,P2)
    
            PS = P[x[:-1]]
    
            x_i = x[1:]
            ou_like = pm.Categorical.dist(PS).logp(x_i)
            return pm.Categorical.dist(PA).logp(x[0]) + tt.sum(ou_like)
    
    我还创建了一个类似的高斯发射类:

    class HMMGaussianEmmisionsN(pm.Continuous):
        """
        Hidden Markov Model Gaussian Emmisions
        Parameters
        ----------
        A : tensor
            prior for Gaussian emmision mu
            shape = (2,N_states)
    
        S : tensor
            prior for Gaussian emmision width
            shape = (2,N_states)
    
        states : tensor
             equilibrium probabilities
             shape = (N_states)
    
        """
    
        def __init__(self, A=None, S=None, states=None,
                     *args, **kwargs):
            super(HMMGaussianEmmisionsN, self).__init__(*args, **kwargs)
            self.A = A
            self.S = S
            self.states = states
            self.mean = 0.
    
        def logp(self, x):
            A = self.A
            S = self.S
            states = self.states
    
            AS = A[states]        
            SS = S[states]
    
            ou_like = pm.Normal.dist(mu=AS,sd=SS).logp(x)
            return tt.sum(ou_like)
    
    可通过以下方式调用:

    from scipy import optimize
    with pm.Model() as model:
        # N_states state model
    
        P = pm.Dirichlet('P', a=np.ones((N_states,N_states)), shape=(N_states,N_states))
        A = pm.InverseGamma('A',alpha=alphaA, beta=betaA, shape=(N_states))
        S = pm.InverseGamma('S', alpha=alphaS, beta=betaS, shape=(N_states))
    
        AA = tt.dmatrix('AA')
        AA = tt.eye(N_states) - P + tt.ones(shape=(N_states,N_states))
        PA = pm.Deterministic('PA',sla.solve(AA.T,tt.ones(shape=(N_states))))
    
        states = HMMStatesN('states',PA=PA, P=P, shape=(len(measurement)))
    
        emmision = HMMGaussianEmmisionsN('emmision', A=A, S=S, states=states, observed=measurement)
    
        start = pm.find_MAP(fmin=optimize.fmin_powell)
        step1 = pm.Metropolis(vars=[P,A,S,PA,emmision])
        step2 = pm.CategoricalGibbsMetropolis(vars=[states])
        trace = pm.sample(10000, start=start, step=[step1,step2])
    

    我认为你的模型可以用类似的方式编码。对于HMM状态,使用CategoricalGibbsMetropolis步进器(有关更多详细信息,请参见此)非常重要。请参阅更详细的代码示例。

    Hi@Helmut Strey,我使用您的代码片段实现了一个基于马尔可夫链的不同模型。你能提供更多的信息说明为什么使用分类GibbsMetropolis在这里很重要吗?我找不到你在这里提到的对话:除非有所改变,否则CategoricalGibbsMetropolis是为通过离散状态进行采样而编写的,而Metropolis是在连续空间中进行采样的。老实说,这不是一种非常有效的实现HMM的方法,因为模拟时间随着实验数据的大小而增加。最好的方法是实现一个过滤器,将各个州整合起来(或将它们边缘化)。我还没有时间编写代码。