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

Rou*_*mar 29 python probability

我一直在尝试编写一个在中间使用softmax激活功能的程序.

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

P[0.10,0.25,0.60,0.05]
Run Code Online (Sandbox Code Playgroud)

P中所有变量的总和始终为1.

考虑到附加概率,我想要一种方法来选择列表的索引.或者,换句话说,返回的函数

0 - 10% of the time
1 - 25% of the time
2 - 60% of the time
3 - 5% of the time
Run Code Online (Sandbox Code Playgroud)

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

Sal*_*ali 45

你可以通过numpy轻松实现这一目标.它有一个接受概率参数的选择函数.

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


Jus*_*eel 11

基本上,制作累积概率分布(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())
Run Code Online (Sandbox Code Playgroud)

当然你可以用类似的东西生成一堆随机索引

rs = [bisect(cdf, random()) for i in xrange(20)]
Run Code Online (Sandbox Code Playgroud)

生产

[2, 2, 3, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

(结果将会,并且应该有所不同).当然,对于如此少的可能索引而言,二元搜索是不必要的,但绝对推荐用于具有更多可能索引的分布.


sle*_*ica 10

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

  1. 生成0到1之间的数字.

  2. 从列表中走出,从您的数字中减去每个项目的概率.

  3. 选择减去后将数字降至0或以下的项目.

这很简单,O(n)并且应该工作:)


ani*_*144 6

这个问题相当于从分类分布中抽样。这种分布通常与多项分布混为一谈,后者对来自分类分布的多个样本的结果进行建模。

在 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]
Run Code Online (Sandbox Code Playgroud)