给定转移矩阵并在隐马尔可夫模型中开始状态,生成一组排放

时间:2012-11-04 06:03:54

标签: simulation linear-algebra hidden-markov-models

我有隐马尔可夫模型的转移矩阵,发射矩阵和起始状态。我想生成一系列观察(排放)。但是,我坚持一件事。

我理解如何在两个州(或排放)中进行选择。如果事件A概率为x,则事件B(或实际上不是-A)以概率1-x发生。要使用随机数rand生成A和B的序列,请执行以下操作。

 for iteration in iterations:
      observation[iteration] <- A if rand < x else B

我不明白如何将其扩展到两个以上的变量。例如,如果发生三个事件,使事件A以概率x1发生,事件B发生x2,事件C发生1-(x1+x2),那么如何扩展上述伪代码?

我没有找到答案谷歌搜索。事实上,我得到的印象是,我错过了许多在线笔记所假设的基本事实。 : - /

2 个答案:

答案 0 :(得分:1)

一种方法是

 x<-rand()
  if x < x1 observation is A
  else if x < x1 + x2 observation is B
  else observation is C

当然,如果你有大量的替代方案,最好建立一个累积概率表(保持x1,x1 + x2,x1 + x2 + x3 ......),然后在该表中进行二进制搜索随机数。如果您愿意进行更多预处理,则可以采用更有效的方式,例如here

答案 1 :(得分:1)

两个值的情况是二项分布,你可以从二项分布(一系列硬币翻转,基本上)生成随机抽取。

对于2个以上的变量,您需要从multinomial distribution中提取样本,这只是对n> 2的二项分布的推广。

无论您使用何种语言,都应该使用内置函数来完成此任务。下面是Python中的一些代码,它们根据你的hmm模型对象模拟一组观察和状态:

import numpy as np
def random_MN_draw(n, probs):
    """ get X random draws from the multinomial distribution whose probability is given by 'probs' """
    mn_draw = np.random.multinomial(n,probs) # do 1 multinomial experiment with the given probs with probs= [0.5,0.5], this is a coin-flip
    return np.where(mn_draw == 1)[0][0] # get the index of the state drawn e.g. 0, 1, etc.

def simulate(self, nSteps):
    """ given an HMM = (A, B1, B2 pi), simulate state and observation sequences """
    lenB= len(self.emission)
    observations = np.zeros((lenB, nSteps), dtype=np.int) # array of zeros
    states = np.zeros(nSteps)
    states[0] = self.random_MN_draw(1, self.priors) # appoint the first state from the prior dist
    for i in range(0,lenB): # initialise observations[i,0] for all observerd variables
        observations[i,0] = self.random_MN_draw(1, self.emission[i][states[0],:]) #ith variable array, states[0]th row

    for t in range(1,nSteps): # loop through t
        states[t] = self.random_MN_draw(1, self.transition[states[t-1],:]) # given prev state (t-1) pick what row of the A matrix to use

        for i in range(0,lenB): # loop through the observed variable for each t
            observations[i,t] = self.random_MN_draw(1, self.emission[i][states[t],:]) # given current state t, pick what row of the B matrix to use

    return observations,states

在几乎所有语言中,您都可以找到

的等价物
  

np.random.multinomial()

用于多项式和其他离散或连续分布作为内置函数。