Почему этот подкласс `scipy.stats.rv_continuous` не генерирует случайные переменные в правильном диапазоне? - PullRequest
2 голосов
/ 19 марта 2019

У меня есть следующий подкласс scipy.stats.rv_continuous:

from scipy.stats import rv_continuous
import math

class Distribution(rv_continuous):
    def _cdf(self, x, a, b, mu):
        return (
            math.erf(x/(math.sqrt(2)*a)) + \
            math.erf((x - mu)/(math.sqrt(2)*b)) \
            ) / 2 + math.erf(mu/(math.sqrt(2)*b)) / 2

distribution = Distribution(a = 0, b = float('inf'))

Насколько я могу судить, все настроено правильно (я проверил математику, и это также правильно). Однако по какой-то причине он хочет генерировать значения только от 0 до mu, а не от ожидаемых 0 и inf, как указано явно . Например, вот 50 точек, сгенерированных с помощью distribution.rvs(3, 1.6, 10) (вместе с PDF):

enter image description here

и вот пример с distribution.rvs(0.6, 0.4, 4.85):

enter image description here

Почему мой дистрибутив ограничен mu? Я неправильно установил свой rv_continuous подкласс?

1 Ответ

4 голосов
/ 19 марта 2019

Ваша реализация CDF неверна.Обратите внимание:

In [188]: distribution.cdf(25, 3, 16., 10)
Out[188]: 1.059763759070757

In [189]: distribution.cdf(40, 3, 16., 10)
Out[189]: 1.203618109186038

Эти значения не верны.CDF (который вы реализовали в методе _cdf) не должен превышать 1,0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...