値が 2 つの場合は 2 項分布であり、2 項分布からランダムな抽選を生成します (基本的に一連のコイントス)。
変数が 2 つを超える場合は、多項分布からサンプルを抽出する必要があります。これは、n>2 の場合の二項分布を単純に一般化したものです。
使用する言語に関係なく、このタスクを実行するための組み込み関数があるはずです。以下は、hmm モデル オブジェクトが与えられた一連の観測と状態をシミュレートする Python のコードです。
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()
組み込み関数としての多項およびその他の離散または連続分布の場合。