我正在尝试从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。
答案 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))