使scipy的rv_discrete与浮点值一起使用?

Ben*_* S. 3 python numpy scipy

我正在尝试定义自己的离散分布。我拥有的代码适用于整数值,但不适用于十进制值。例如,这有效:

>>> from scipy.stats import rv_discrete
>>> probabilities = [0.2, 0.5, 0.3]
>>> values = [1, 2, 3]
>>> distrib = rv_discrete(values=(values, probabilities))
>>> print distrib.rvs(size=10)
[1 3 3 2 2 2 2 2 1 3]
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用十进制值,它将不起作用:

>>> from scipy.stats import rv_discrete
>>> probabilities = [0.2, 0.5, 0.3]
>>> values = [.1, .2, .3]
>>> distrib = rv_discrete(values=(values, probabilities))
>>> print distrib.rvs(size=10)
[0 0 0 0 0 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)

谢谢..

unu*_*tbu 5

Per stats.rv_discrete的文档字符串

值:2个array_like的元组,可选 (xk, pk)其中xk整数具有非零概率pksum(pk) = 1

(我的重点)。因此,由创建的离散分布rv_discrete必须使用整数值。但是,通过将rvs值用作整数索引,将这些整数值映射为float并不难values

In [4]: values = np.array([0.1, 0.2, 0.3])

In [5]: idx = distrib.rvs(size=10); idx
Out[5]: array([1, 1, 0, 0, 1, 1, 0, 2, 1, 1])

In [6]: values[idx]
Out[6]: array([ 0.2,  0.2,  0.1,  0.1,  0.2,  0.2,  0.1,  0.3,  0.2,  0.2])
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用:

import numpy as np
import scipy.stats as stats
np.random.seed(2016)
probabilities = np.array([0.2, 0.5, 0.3])
values = np.array([0.1, 0.2, 0.3])
distrib = stats.rv_discrete(values=(range(len(probabilities)), probabilities))
idx = distrib.rvs(size=10)
result = values[idx]
print(result)
# [ 0.3  0.3  0.3  0.3  0.2  0.2  0.2  0.3  0.3  0.2]
Run Code Online (Sandbox Code Playgroud)