gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:58 25 4
gpt4 key购买 nike

我有一个具有三个状态的遍历马尔可夫链。我计算了稳态概率。状态呈现我的问题的输入。我想解决 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>

相反,我们得到一个生成器对象,它有点像“卡住”循环。您可以使用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]

关于python - 如何使用稳态概率在Python代码的每次迭代中选择一个状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com