在给定一系列bin概率的情况下,如何生成随机的bin计数样本?

时间:2015-07-30 17:09:10

标签: python numpy random vectorization probability-density

我有一个整数需要根据概率分布分成二进制位。例如,如果我有N=100个对象进入[0.02, 0.08, 0.16, 0.29, 0.45],那么您可能会获得[1, 10, 20, 25, 44]

import numpy as np
# sample distribution
d = np.array([x ** 2 for x in range(1,6)], dtype=float)
d = d / d.sum()
dcs = d.cumsum()
bins = np.zeros(d.shape)
N = 100
for roll in np.random.rand(N):
    # grab the first index that the roll satisfies
    i = np.where(roll < dcs)[0][0]  
    bins[i] += 1

实际上,N和我的箱数非常大,所以循环并不是一个可行的选择。有什么方法可以将这个操作进行矢量化以加快速度吗?

3 个答案:

答案 0 :(得分:4)

您可以通过获取cumsum将PDF转换为CDF,使用它来定义0到1之间的一组bin,然后使用这些bin来计算 N -long random的直方图统一矢量:

cdf = np.cumsum([0, 0.02, 0.08, 0.16, 0.29, 0.45])     # leftmost bin edge = 0
counts, edges = np.histogram(np.random.rand(100), bins=cdf)

print(counts)
# [ 4,  8, 16, 30, 42]

答案 1 :(得分:2)

您可以使用np.bincountnp.searchsorted一起进行分箱操作,以执行相当于let concurrentQueue: dispatch_queue_t = dispatch_queue_create("MyQueue", nil) dispatch_async(concurrentQueue) { // update some UI dispatch_async(dispatch_get_main_queue()) { // update some UI self.tableView.reloadData() } } 的操作。这是实现这些承诺的实现 -

roll < dcs

使用给定参数进行运行时测试 -

bins = np.bincount(np.searchsorted(dcs,np.random.rand(N),'right'))

答案 2 :(得分:0)

另一种方法:

import numpy as np

p = [0.02, 0.08, 0.16, 0.29, 0.45]
np.bincount(np.random.choice(range(len(p)), size=100, p=p), minlength=len(p))
# array([ 1,  6, 16, 25, 52])

似乎没有必要分配一个长度为100的数组,但是我没有在numpy中看到避免这种情况的方法。