生成离散随机变量使用SciPy的或指定的NumPy的权重(Generating Discrete r

2019-06-14 17:01发布

我寻找一个简单的函数,可以基于它们的对应(也指定)概率指定的随机值的阵列。 我只需要它来生成浮点值,但我不明白为什么它不应该是能够产生任何标量。 我能想到的现有功能建设的许多方面,但我想我可能只是错过了一个明显的SciPy的或NumPy的功能。

例如:

>>> values = [1.1, 2.2, 3.3]
>>> probabilities = [0.2, 0.5, 0.3]
>>> print some_function(values, probabilities, size=10)
(2.2, 1.1, 3.3, 3.3, 2.2, 2.2, 1.1, 2.2, 3.3, 2.2)

注:我发现scipy.stats.rv_discrete ,但我不明白它是如何工作的。 具体地讲,我不明白这是什么(下)意味着它也不应该怎么做:

numargs = generic.numargs
[ <shape(s)> ] = ['Replace with resonable value', ]*numargs

如果rv_discrete是我应该使用,请您为我提供了一个简单的例子和​​上面的“形状”的语句的解释?

Answer 1:

从离散分布图是直接内置numpy的。 函数被调用random.choice (难以找到没有任何参考在numpy的文档离散分布)。

elements = [1.1, 2.2, 3.3]
probabilities = [0.2, 0.5, 0.3]
np.random.choice(elements, 10, p=probabilities)


Answer 2:

这里是返回加权值短,功能比较简单,它采用与NumPy的digitizeaccumulaterandom_sample

import numpy as np
from numpy.random import random_sample

def weighted_values(values, probabilities, size):
    bins = np.add.accumulate(probabilities)
    return values[np.digitize(random_sample(size), bins)]

values = np.array([1.1, 2.2, 3.3])
probabilities = np.array([0.2, 0.5, 0.3])

print weighted_values(values, probabilities, 10)
#Sample output:
[ 2.2  2.2  1.1  2.2  2.2  3.3  3.3  2.2  3.3  3.3]

它的工作原理是这样的:

  1. 首先采用accumulate我们创造箱。
  2. 然后,我们创建一批随机数(介于01 ),使用random_sample
  3. 我们用digitize来看到的BIN这些数字掉进去。
  4. 并返回相应的值。


Answer 3:

你在往好的方向发展打算:内置scipy.stats.rv_discrete()相当直接创建一个离散型随机变量。 下面是它的工作原理:

>>> from scipy.stats import rv_discrete  

>>> values = numpy.array([1.1, 2.2, 3.3])
>>> probabilities = [0.2, 0.5, 0.3]

>>> distrib = rv_discrete(values=(range(len(values)), probabilities))  # This defines a Scipy probability distribution

>>> distrib.rvs(size=10)  # 10 samples from range(len(values))
array([1, 2, 0, 2, 2, 0, 2, 1, 0, 2])

>>> values[_]  # Conversion to specific discrete values (the fact that values is a NumPy array is used for the indexing)
[2.2, 3.3, 1.1, 3.3, 3.3, 1.1, 3.3, 2.2, 1.1, 3.3]

分布distrib上述从而返回从索引 values列表。

更一般地, rv_discrete()数值的在其第一元素的序列values=(…,…)的参数,并返回这些值,在这种情况下; 没有必要转换为具体的(浮点)值。 下面是一个例子:

>>> values = [10, 20, 30]
>>> probabilities = [0.2, 0.5, 0.3]
>>> distrib = rv_discrete(values=(values, probabilities))
>>> distrib.rvs(size=10)
array([20, 20, 20, 20, 20, 20, 20, 30, 20, 20])

其中(整数)的输入值直接与期望概率返回。



Answer 4:

你也可以使用LEA ,一个纯Python包专用于离散概率分布。

>>> distrib = Lea.fromValFreqs((1.1,2),(2.2,5),(3.3,3))
>>> distrib
1.1 : 2/10
2.2 : 5/10
3.3 : 3/10
>>> distrib.random(10)
(2.2, 2.2, 1.1, 2.2, 2.2, 2.2, 1.1, 3.3, 1.1, 3.3)

这就是它!



Answer 5:

最简单的DIY方法是概率总结成一个累积分布。 这样一来,你拆单位间隔成的长度等于原来的概率子区间。 现在生成的[0,1)的单一随机数均匀,并查看哪个间隔它的土地。



文章来源: Generating Discrete random variables with specified weights using SciPy or NumPy