我正在尝试使用SciPy中的genextreme软件包进行GEV拟合。尽管我可以用它来估计参数,但会收到警告,指出它被零除。
我尝试拟合不同的数据集,尝试为形状参数c设置不同的初始值,还尝试将数据乘以例如100.没有一个起作用。我正在使用Python 2.7.12和SciPy 0.17.0。
我是Python的新手,想对现有安装进行快速的首次测试。
代码中给出的数据大致是Gumbel分布的(c = 0),因为我已经在Gumbel图上进行了检查,并使用线性回归进行了Gumbel拟合。
import numpy as np
from scipy.stats import genextreme as gev
t=np.array([3.8482, 3.6435, 3.0417, 4.0329, 3.2967, 3.3535, 3.6179, 3.3042, 3.6164, 3.5855, 2.7932, 2.8833, 2.6513, 2.7794, 3.2649, 3.2613, 3.1736, 3.1131, 3.3896, 4.2891])
a=gev.fit(t)
基于我的线性回归,我期望形状参数接近c = 0,位置参数接近3.15,比例参数接近0.39。实际结果是:
/usr/lib/python2.7/dist-packages/scipy/stats/_continuous_distns.py:1776: RuntimeWarning: invalid value encountered in true_divide
np.sign(c)*(-g3+(g2+2*g2mg12)*g1)/((g2mg12)**(3./2.)))
/usr/lib/python2.7/dist-packages/scipy/stats/_continuous_distns.py:1781: RuntimeWarning: invalid value encountered in true_divide
(g4+(-4*g3+3*(g2+g2mg12)*g1)*g1)/((g2mg12)**2))
但是,由于以下原因,显然为a分配了一个值:
>>> a
(0.16458924337692377, 3.1800328240261857, 0.37894174199431357)
这些值接近我的预期,但我不理解警告。
答案 0 :(得分:0)
问题是您的代码进行了一些尝试除以零或NaN的计算。
您可以通过深入研究各个计算并处理零和NaN来解决该问题,以使算法跳过它们,或者可以执行以下操作:
import numpy as np
from scipy.stats import genextreme as gev
with np.errstate(divide='ignore', invalid='ignore'):
t=np.array([3.8482, 3.6435, 3.0417, 4.0329, 3.2967, 3.3535, 3.6179, 3.3042, 3.6164, 3.5855, 2.7932, 2.8833, 2.6513, 2.7794, 3.2649, 3.2613, 3.1736, 3.1131, 3.3896, 4.2891])
a=gev.fit(t)
这只是通过告诉算法忽略将要除以0或NaN的值(作为异常处理的一种形式)来抑制警告。
注意:divide
用于除以0,invalid
用于在numpy数学运算中遇到NaN。
有关更多信息:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.errstate.html