0

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

我了解如何在两种状态(或排放)之间进行选择。如果事件 A 的概率x为 ,那么事件 B(或者,实际上不是 A)的发生概率为1-x。要使用随机数生成 A 和 B 的序列rand,请执行以下操作。

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

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

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

4

2 回答 2

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 ...),然后在给定随机数的情况下在该表中进行二分搜索. 如果你愿意做更多的预处理,还有一种更有效的方法,例如看这里

于 2012-11-04T15:55:21.933 回答
1

两个值的情况是二项式分布,您从二项式分布(本质上是一系列硬币翻转)中生成随机抽取。

对于超过 2 个变量,您需要从多项分布中抽取样本,这只是对 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()

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

于 2013-07-12T10:03:11.857 回答