如何使用稳态概率在python代码的每次迭代中选择一个状态?

时间:2013-06-12 02:14:53

标签: python

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

你有什么建议吗?

最佳, Aissan

1 个答案:

答案 0 :(得分: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]