我一直在尝试编写一个在中间使用softmax激活功能的程序。
现在,我有一个这样的概率列表:
P[0.10,0.25,0.60,0.05]
P中所有变量的总和始终为1.
我想要一种方法来选择附加概率的列表索引。 或者,换句话说,返回的函数
0 - 10% of the time
1 - 25% of the time
2 - 60% of the time
3 - 5% of the time
我完全不知道从哪里开始。任何帮助,将不胜感激。 :)
答案 0 :(得分:36)
你可以通过numpy轻松实现这一目标。它有一个choice函数,它接受概率参数。
np.random.choice(
['pooh', 'rabbit', 'piglet', 'Christopher'],
5,
p=[0.5, 0.1, 0.1, 0.3]
)
答案 1 :(得分:11)
基本上,创建一个cumulative probability distribution(CDF)数组。基本上,给定指数的CDF值等于P中等于或小于该指数的所有值的总和。然后生成0到1之间的随机数并进行二分搜索(如果需要,可以进行线性搜索)。这是一些简单的代码。
from bisect import bisect
from random import random
P = [0.10,0.25,0.60,0.05]
cdf = [P[0]]
for i in xrange(1, len(P)):
cdf.append(cdf[-1] + P[i])
random_ind = bisect(cdf,random())
当然你可以用
之类的东西生成一堆随机索引rs = [bisect(cdf, random()) for i in xrange(20)]
产生
[2, 2, 3, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2]
(结果将会,并且应该有所不同)。当然,对于如此少的可能指数而言,二元搜索是不必要的,但绝对推荐用于具有更多可能指数的分布。
答案 2 :(得分:10)
嗯有趣,怎么样......
生成介于0和1之间的数字。
从列表中删除每个项目的概率。
选择减值后将您的电话号码降至0或以下的项目。
这很简单,O(n)并且应该起作用:)
答案 3 :(得分:4)
此问题相当于从categorical distribution采样。这种分布通常与多项分布相混合,多分布分布模拟来自分类分布的多个样本的结果。
在numpy中,很容易使用numpy.random.multinomial从多项分布中进行抽样,但不存在特定的分类版本。但是,可以通过单次试验从多项分布中抽样,然后在输出中返回非零元素来实现。
import numpy as np
pvals = [0.10,0.25,0.60,0.05]
ind = np.where(np.random.multinomial(1,pvals))[0][0]
答案 4 :(得分:3)
您要查找的是加权随机生成,虽然它不是内置的,但有a lot of standard recipes for this。
答案 5 :(得分:2)
import random
probs = [0.1, 0.25, 0.6, 0.05]
r = random.random()
index = 0
while(r >= 0 and index < len(probs)):
r -= probs[index]
index += 1
print index - 1