我有一个遍历马尔可夫链三个状态。我计算了稳态概率。 国家提出我的问题的输入。 我想解决我的n次迭代问题,在每次迭代中我们根据计算出的稳态概率选择输入。 换句话说,这是具有特定概率的三个选项。我们希望在每次迭代中随机选择其中一个。
你有什么建议吗?
最佳, Aissan
答案 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]