1

我正在尝试从子类rv_continuousscipy.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

4

0 回答 0