0

隠れマルコフモデルの遷移行列、放出行列、および開始状態があります。一連の観測 (放出) を生成したいと考えています。しかし、私は一つのことにこだわっています。

2 つの状態 (または排出量) を選択する方法を理解しています。イベント A の確率が の場合x、イベント B (または実際には A ではない) は確率 で発生し1-xます。乱数 を使用して A と B のシーケンスを生成するにrandは、次のようにします。

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

これを 2 つ以上の変数に拡張する方法がわかりません。たとえば、イベント A が確率 で発生しx1、イベント Bが発生しx2、イベント Cが で発生するような 3 つのイベントが発生した場合1-(x1+x2)、上記の擬似コードをどのように拡張すればよいでしょうか?

グーグルで答えが見つかりませんでした。実際、オンラインのメモの多くが想定している基本的な事実が欠けているような印象を受けます。:-/

4

2 に答える 2

1

値が 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()

組み込み関数としての多項およびその他の離散または連続分布の場合。

于 2013-07-12T10:03:11.857 に答える
1

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 に答える