SciPy genextreme.fit дает: «RuntimeWarning: делить на ноль» - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь сделать GEV-соответствие, используя пакет genextreme в SciPy.Хотя я могу получить его для оценки параметров, я получаю предупреждение о том, что он делится на ноль.

Я попытался подогнать разные наборы данных, попытался установить разные начальные значения для параметра формы c, а также попыталсяумножить данные, например, на 100. Ничего из этого не сработало.Я использую Python 2.7.12 и SciPy 0.17.0.

Я новичок в Python и хотел сделать быстрый первый тест с моей существующей установкой.

Данные, приведенные в коде, примерно распределены по Гумбелю (c = 0), поскольку я проверил их на графике Гумбеля и выполнил подгонку по Гумбелю с использованием линейной регрессии.

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)

Эти значения близки к тому, что я ожидал, но я не понимаюпредупреждение.

1 Ответ

0 голосов
/ 17 февраля 2019

Проблема в том, что в вашем коде есть некоторые вычисления, в которых он пытается разделить на ноль или 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 для обнаружения NaN в математических операциях с нулевыми числами.
Для получения дополнительной информации: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.errstate.html

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