我有隐马尔可夫模型的转移矩阵,发射矩阵和起始状态。我想生成一系列观察(排放)。但是,我坚持一件事。
我理解如何在两个州(或排放)中进行选择。如果事件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)
,那么如何扩展上述伪代码?
我没有找到答案谷歌搜索。事实上,我得到的印象是,我错过了许多在线笔记所假设的基本事实。 : - /
答案 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()
用于多项式和其他离散或连续分布作为内置函数。