Как создать случайную переменную с четким пользовательским PDF, используя scipy.stats.rv_continuous? - PullRequest
0 голосов
/ 03 апреля 2020

Контекст

Я пытаюсь использовать scipy.stats.rv_continuous для создания случайной величины с «резким» pdf: f (x) = 2 * x, если x равен в [0,1], иначе f (x) = 0. Выдает ошибку, которая, как я понимаю, связана с интегралом этого pdf, оцененного с использованием scipy.integrate.quad, не равным 1 (связан с моим вопросом, подробно описанным в this нить ).

С тех пор я понял, что для исправления интеграла можно просто указать аргумент points для функции scipy.integrate.quad:

баллов (последовательность чисел с плавающей точкой, целые числа), необязательно

Последовательность точек разрыва в ограниченном интервале интегрирования, где могут возникать локальные трудности подынтегрального выражения (например, особенности, разрывы). Последовательность не должна быть отсортирована. Обратите внимание, что этот параметр нельзя использовать вместе с весом.

Однако я не нашел способа указать этот тип точек останова для класса rv_continuous. Следовательно ошибка остается. Есть идеи как это исправить? Фрагмент кода и сообщение об ошибке перечислены ниже.

Код для воспроизведения ошибки

# use scipy to create random number for f(x) = 2x when x in [0,1] and 0, otherwise
from scipy.stats import rv_continuous
class custom_rv(rv_continuous):
    "custom distribution"
    def _pdf(self, x):
        if x >= 0.0 and x <=1.0:
            return 2*x
        else:
            return 0.0
rv = custom_rv(name='2x')
rvs = rv.rvs(size=1)

Вывод / Ошибка

RuntimeError: Failed to converge after 100 iterations.

Код для интегрального исправления

from scipy.integrate import quad
print(quad(rv._pdf, -10.0, 10.0))
print(quad(rv._pdf, -10.0, 10.0, points = [1]))
# this following line throws an error though
# since it doesn't support infinity inputs combined with break points.
print(quad(rv._pdf, -np.inf, np.inf, points = [1]))

# Output:
(0.0, 0.0)
(1.0000000000149878, 2.3295111147512406e-09)
ValueError: Infinity inputs cannot be used with break points.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...