我寻找一个简单的函数,可以基于它们的对应(也指定)概率指定的随机值的阵列。 我只需要它来生成浮点值,但我不明白为什么它不应该是能够产生任何标量。 我能想到的现有功能建设的许多方面,但我想我可能只是错过了一个明显的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是我应该使用,请您为我提供了一个简单的例子和上面的“形状”的语句的解释?
从离散分布图是直接内置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)
这里是返回加权值短,功能比较简单,它采用与NumPy的digitize
, accumulate
和random_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]
它的工作原理是这样的:
- 首先采用
accumulate
我们创造箱。 - 然后,我们创建一批随机数(介于
0
和1
),使用random_sample
- 我们用
digitize
来看到的BIN这些数字掉进去。 - 并返回相应的值。
你在往好的方向发展打算:内置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])
其中(整数)的输入值直接与期望概率返回。
你也可以使用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)
这就是它!
最简单的DIY方法是概率总结成一个累积分布。 这样一来,你拆单位间隔成的长度等于原来的概率子区间。 现在生成的[0,1)的单一随机数均匀,并查看哪个间隔它的土地。
文章来源: Generating Discrete random variables with specified weights using SciPy or NumPy