我有一个遍历三个状态的马尔可夫链。我计算了稳态概率。状态提出了我的问题的输入。我想为 n 次迭代解决我的问题,在每次迭代中,我们根据计算出的稳态概率选择输入。换句话说,这与具有特定概率的三个选项相同。我们希望在每次迭代中随机选择其中一个。
你有什么建议吗??
最好的,艾桑
我有一个遍历三个状态的马尔可夫链。我计算了稳态概率。状态提出了我的问题的输入。我想为 n 次迭代解决我的问题,在每次迭代中,我们根据计算出的稳态概率选择输入。换句话说,这与具有特定概率的三个选项相同。我们希望在每次迭代中随机选择其中一个。
你有什么建议吗??
最好的,艾桑
假设您有一个概率向量(而不仅仅是 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]