2024-06-03 08:23:51 发布
网友
假设我想立刻从伯努利分布列表中画出,例如,概率为[0.1, 0.2, 0.3]。我可以用for循环来实现这一点,但是有没有更好的numpy方法(使用scipy也可以)?
[0.1, 0.2, 0.3]
ps = [0.1, 0.2, 0.3] [np.random.choice(2, p=[1 - p, p]) for p in ps]
我建议使用(np.random.uniform(size=d) < probs) * 1,其中probs是概率向量。这将生成统一的随机变量,然后将其阈值设为0或1,得到1的概率正是probs中的概率。
(np.random.uniform(size=d) < probs) * 1
probs
0
1
如果只需要几个bernoulli变量,并且只需要一次,那么用np.random.二项式求解就可以了。然而,它似乎比使用均匀分布生成伯努利变量慢几倍。例如,如果我们有随机概率向量 probs = np.uniform(size=10000), 然后我们得到
probs = np.uniform(size=10000)
%timeit np.random.binomial(n=1, p=probs, size=10000) Result: 775 µs ± 5.35 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) %timeit (np.random.uniform(size=10000) < probs) * 1 Result: 103 µs ± 510 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
你可以从二项式中画出n=1,这相当于伯努利。由于二项式接受数组作为概率参数,因此可以使用:
n=1
np.random.binomial(1, p=ps)
您可以通过给一些元素很小/很大的概率来测试它是否工作,并多次调用函数。
例如,让ps = [0.23, 0.48, 0.64, 0.98]
ps = [0.23, 0.48, 0.64, 0.98]
In [90]: np.sum([np.random.binomial(1,p=ps) for i in range(100000)], axis=0) Out[90]: array([23000, 48115, 64128, 97957])
我建议使用
(np.random.uniform(size=d) < probs) * 1
,其中probs
是概率向量。这将生成统一的随机变量,然后将其阈值设为0
或1
,得到1
的概率正是probs
中的概率。如果只需要几个bernoulli变量,并且只需要一次,那么用np.random.二项式求解就可以了。然而,它似乎比使用均匀分布生成伯努利变量慢几倍。例如,如果我们有随机概率向量
probs = np.uniform(size=10000)
, 然后我们得到你可以从二项式中画出
n=1
,这相当于伯努利。由于二项式接受数组作为概率参数,因此可以使用:您可以通过给一些元素很小/很大的概率来测试它是否工作,并多次调用函数。
例如,让
ps = [0.23, 0.48, 0.64, 0.98]
相关问题 更多 >
编程相关推荐