1

我有一个遍历三个状态的马尔可夫链。我计算了稳态概率。状态提出了我的问题的输入。我想为 n 次迭代解决我的问题,在每次迭代中,我们根据计算出的稳态概率选择输入。换句话说,这与具有特定概率的三个选项相同。我们希望在每次迭代中随机选择其中一个。

你有什么建议吗??

最好的,艾桑

4

1 回答 1

1

假设您有一个概率向量(而不仅仅是 3 个),并且您的初始状态是第一个。

import random

def markov(probs, iter):

  # normalize the probabilities
  total = sum(probs)
  probs = map(lambda e: float(e)/total, probs)

  # determine the number of states
  n = len(probs)

  # Set the initial state
  s = 0

  for i in xrange(iter):

    thresh = random.random()
    buildup = 0

    # When the sum of our probability vector is greater than `thresh`
    # we've found the next state
    for j in xrange(n):

      buildup += probs[j]
      if buildup >= thresh:
        break

    # Set the new state
    s = j

  return s

因此

>>> markov([1,1,1], 100)
2
>>> markov([1,1,1], 100)
1

但这只会返回最后一个状态。不过,用一个巧妙的技巧很容易解决这个问题。让我们把它变成一个生成器。我们实际上只需要多一行,yield s.

def markov(probs, iter):
  # ...
  for i in xrange(iter):

    # Yield the current state
    yield s

    # ...
    for j in xrange(n):
      # ...

现在,当我们打电话时,markov我们没有立即得到回应。

>>> g = markov([1,1,1], 100)
>>> g
<generator object markov at 0x10fce3280>

相反,我们得到了一个generator object有点像“冻结”循环的东西。你可以一步一步用next

>>> g.next()
1
>>> g.next()
1
>>> g.next()
2

甚至放松整个事情list

>>> list(markov([1,1,1], 100))
[0, 0, 1, 1, 0, 0, 0, 2, 1, 1, 2, 0, 1, 0, 0, 1, 2, 2, 2, 1, 2, 0, 1, 2, 0, 1, 2, 2, 2, 2, 1, 0, 0, 0, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 0, 0, 2, 2, 1, 0, 0, 0, 2, 0, 2, 2, 1, 0, 1, 1, 1, 2, 2, 2, 2, 0, 2, 1, 0, 0, 1, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2, 1, 0, 0, 1, 0, 2, 1, 1, 0, 1, 1, 2, 2, 2, 1, 1, 0, 0, 0]
于 2013-06-12T02:44:56.510 回答