选择按概率加权的随机状态
Choosing a random state weighted by probability
我正在尝试为自定义 RL 算法创建一个随机环境,此代码的目的是采用有序字典(示例:OrderedDict([(0,1),(1,0), (2 ,0),(3,0)]) 元组中的第一个数字是 indx 第二个是概率)和 return 随机加权的新状态,该状态按有序字典中定义的状态发生的概率加权(在示例中上面有 100% 的机会进入状态 0)
我遇到的问题是,出于某种原因,当 indx 为 0(对于上述示例输入)时,概率也为 0。我预计概率为 1。
在同样的情况下 pcloud[0] == 1 这就是我想要的。这意味着我在使用 enumerate 时有一些错误,但我不知道它是什么。
def collapse(pcloud):
randomnum = Random.uniform(0,1)
threshold = 0
for indx , probability in enumerate(pcloud):
threshold += probability
if randomnum <= threshold:
return indx
raise ValueError("For some reason the probabilities can't be compared with the <= operator.")
#it should never get here.
return
到运行代码创建有序字典。
from collections import OrderedDict
import random as Random
#all probabilities should sum to 1
pcloud = OrderedDict()
pcloud[0] = 1
pcloud[1] = 0
pcloud[2] = 0
pcloud[3] = 0
#then run the function
print collapse(pcloud)
您不应该仅仅因为涉及索引就使用 enumerate
。这些索引已经作为您的 OrderedDict 的键存在。您需要遍历 OrderedDict 的键值对,因此您应该在 items()
或 iteritems()
上遍历 Python 2(因为 items()
在Python 2):
for index, probability in pcloud.items():
...
我正在尝试为自定义 RL 算法创建一个随机环境,此代码的目的是采用有序字典(示例:OrderedDict([(0,1),(1,0), (2 ,0),(3,0)]) 元组中的第一个数字是 indx 第二个是概率)和 return 随机加权的新状态,该状态按有序字典中定义的状态发生的概率加权(在示例中上面有 100% 的机会进入状态 0)
我遇到的问题是,出于某种原因,当 indx 为 0(对于上述示例输入)时,概率也为 0。我预计概率为 1。
在同样的情况下 pcloud[0] == 1 这就是我想要的。这意味着我在使用 enumerate 时有一些错误,但我不知道它是什么。
def collapse(pcloud):
randomnum = Random.uniform(0,1)
threshold = 0
for indx , probability in enumerate(pcloud):
threshold += probability
if randomnum <= threshold:
return indx
raise ValueError("For some reason the probabilities can't be compared with the <= operator.")
#it should never get here.
return
到运行代码创建有序字典。
from collections import OrderedDict
import random as Random
#all probabilities should sum to 1
pcloud = OrderedDict()
pcloud[0] = 1
pcloud[1] = 0
pcloud[2] = 0
pcloud[3] = 0
#then run the function
print collapse(pcloud)
您不应该仅仅因为涉及索引就使用 enumerate
。这些索引已经作为您的 OrderedDict 的键存在。您需要遍历 OrderedDict 的键值对,因此您应该在 items()
或 iteritems()
上遍历 Python 2(因为 items()
在Python 2):
for index, probability in pcloud.items():
...