ValueError при установке подклассного распределения scipy - PullRequest
1 голос
/ 01 мая 2020

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

from scipy import stats
from math import sqrt, pi, exp, log, e


class LogNormal3P(stats.rv_continuous):
    def _pdf(self, x, alpha, m, sigma):
        return 1 / (sigma * (x - alpha) * sqrt(2 * pi)) * exp(-(log(x - alpha, e) - m)**2 / (2 * sigma**2))


lognorm3p = LogNormal3P(name='lognorm3p')


if __name__ == "__main__":
    import numpy as np

    data = np.array([16.66, 28.0, 14.3, 15.99, 16.26, 22.69, 19.1, 14.82, 13.91, 11.1])

    ln3p = lognorm3p.fit(data)

    print('Done')

При выполнении этого кода я получаю ошибку ValueError: math domain error. Это связано с тем, что на первой итерации процесса подбора достигается точка, где x = -11, а значения других параметров равны 1. Это приводит к отрицательному значению в лог-функции, что приводит к ошибке.

Какой типичный обходной путь для этого? Ни одно из значений данных не является отрицательным, поэтому я предполагаю, что это происходит на этапе нормализации. Я скучаю по каким-либо методам rv_continuous, которые должны быть повторно реализованы перед попыткой подгонки данных? В документации упоминается, что либо _pdf, либо _cdf должны быть как минимум повторно реализованы.

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