我正在尝试从子类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。这会导致 log 函数中的负值导致错误。
什么是典型的解决方法?没有一个数据值是负数,所以我假设这发生在标准化步骤中。rv_continuous
在尝试拟合数据之前,我是否遗漏了应重新实施的任何方法?该文档提到至少应该重新实现_pdf
或重新实现。_cdf