Как сделать смешанную случайную величину в scipy.stats - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь понять случайные величины из scipy.stats.Я могу сделать выборку из единой случайной величины:

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

Но как мне сделать случайную переменную, которая с 0.5 вероятностными выборками равномерно из 0..1 и с 0.5 пробными выборками равномерно из 5..6?

Я мог бы написать цикл, который выбирает случайное число от 0 до 1. Если это <.5, то выбирается случайное число от 0 до 1. Если это> = .5, выбираем случайное числомежду 0 и 1 и добавьте 5. Но мне бы очень хотелось, чтобы это можно было назвать так:

mixed_uniform.rvs(size=1000)

Мне также нужно использовать функцию выживания этого смешанного распределения.

1 Ответ

1 голос
/ 01 июля 2019

Для распределения, сочетание пользовательской функции для преобразования, а затем использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...