Python 根据每个变量的概率选择列表变量 我一直试图编写一个程序,它使用中间的SoftMax激活函数。

Python 根据每个变量的概率选择列表变量 我一直试图编写一个程序,它使用中间的SoftMax激活函数。,python,probability,Python,Probability,现在,我有一个这样的概率列表: 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和1之间的数字 从你的数字中减去每一项的概率 选择一个项目,经过减法运算后,

现在,我有一个这样的概率列表:

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和1之间的数字

  • 从你的数字中减去每一项的概率

  • 选择一个项目,经过减法运算后,将您的数字降到0或以下

  • 这很简单,O(n)应该可以:)

    importrandom
    概率=[0.1,0.25,0.6,0.05]
    r=random.random()
    索引=0
    而(r>=0且指数
    基本上,制作一个(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]
    

    (结果将会而且应该有所不同)。当然,对于如此少的可能索引,二进制搜索是相当不必要的,但对于具有更多可能索引的分布,绝对建议使用二进制搜索。

    这个问题相当于从一个样本中进行采样。该分布通常与多项式分布合并,多项式分布对分类分布中多个样本的结果进行建模

    在numpy中,很容易使用从多项式分布中采样,但不存在这种情况的特定分类版本。然而,它可以通过一次试验从多项式分布中取样,然后返回输出中的非零元素来实现

    import numpy as np
    pvals = [0.10,0.25,0.60,0.05]
    ind = np.where(np.random.multinomial(1,pvals))[0][0]
    

    使用numpy可以轻松实现这一点。它有一个接受概率参数的函数

    np.random.choice(
      ['pooh', 'rabbit', 'piglet', 'Christopher'], 
      5,
      p=[0.5, 0.1, 0.1, 0.3]
    )
    

    哈哈,在你发帖前2秒,我想我是原创的。这总是需要O(n)时间,其中n是len(probs)。我们能做得更好吗?@Sush是的:我们可以对问题进行排序并进行二进制搜索。这将减少到O(log n)。我认为使用argmax()而不是where()[0][0]更简单,而且效果也一样。您所寻找的是加权随机生成,虽然它不是内置的,但确实有。实际上,从Python 3.6开始,有
    随机。选择
    (请注意结尾的“s”)它允许提交相对权重。简明,尽管我认为
    numpy
    在这里有点过分,特别是如果脚本没有超出标准库的依赖项,如果概率以降序的方式预先排序,它会有所帮助-迭代可能会更快地终止。
    np.random.choice(
      ['pooh', 'rabbit', 'piglet', 'Christopher'], 
      5,
      p=[0.5, 0.1, 0.1, 0.3]
    )