如何在scipy.stats中制作混合随机变量

时间:2019-07-01 17:28:45

标签: python scipy

我正在尝试从scipy.stats了解随机变量。我可以从统一随机变量中采样:

from scipy.stats import uniform
print(uniform.rvs(size=1000))

但是我该如何创建一个随机变量,该变量具有0.5的{​​{1}}概率样本和0..1的均匀的0.5概率样本?

我可以编写一个循环,选择一个介于0和1之间的随机数。如果它是<.5,则选择一个介于0和1之间的随机数。如果它是> = .5,则选择一个介于0和1之间的随机数。并添加5。但是我真的很希望能够这样称呼它:

5..6

我还需要使用此混合发行版的survival function

2 个答案:

答案 0 :(得分:1)

对于发行版,混合使用自定义函数进行转换,然后使用vectorize()进行应用将比循环更有效。

In [1]: from scipy.stats import uniform

In [2]: r = uniform.rvs(size=1000)

In [3]: r
Out[3]:
array([7.48816182e-02, 4.63880797e-01, 8.75315477e-01, 3.61116729e-01,
       ...
       3.13473322e-01, 3.45434625e-01, 9.49993090e-01, 1.55553018e-01])

In [4]: type(r)
Out[4]: numpy.ndarray

In [8]: def f(a):
   ...:     a *= 2
   ...:     if a > 1: a += 4
   ...:     return a
   ...:


In [10]: import numpy

In [11]: vf = numpy.vectorize(f)

In [12]: r2 = numpy.vectorize(f)(r)

In [13]: r2
Out[13]:
array([1.49763236e-01, 9.27761594e-01, 5.75063095e+00, 7.22233457e-01,
       ...
       6.26946644e-01, 6.90869250e-01, 5.89998618e+00, 3.11106036e-01])

In [14]: max(r2)
Out[14]: 5.999360665646841

In [15]: min(r2)
Out[15]: 0.0004563758727054168

In [17]: len([x for x in r2 if x<=2])
Out[17]: 504

In [18]: len([x for x in r2 if x>=5])
Out[18]: 496

答案 1 :(得分:0)

我生成了 0 到 1 之间的 1000 个数字的随机分布,并从列表中随机选择了一个元素。如果元素大于 .5,则添加 5

from scipy.stats import uniform
import random
min_number=0
max_number=1
size=1000

number_pool= uniform.rvs(min_number,max_number,size=size)

plt.hist(number_pool)
plt.show()

def getValue(number_pool):
    val=random.choice(number_pool)
    if val>.5: 
        val+=5
    return val
print(getValue(number_pool))