给定每个变量概率的列表变量

时间:2010-12-14 08:34:54

标签: python probability

我一直在尝试编写一个在中间使用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

我完全不知道从哪里开始。任何帮助,将不胜感激。 :)

6 个答案:

答案 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)

嗯有趣,怎么样......

  1. 生成介于0和1之间的数字。

  2. 从列表中删除每个项目的概率。

  3. 选择减值后将您的电话号码降至0或以下的项目。

  4. 这很简单,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