Я пытаюсь создать подкласс 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
должны быть как минимум повторно реализованы.