Python - Подгонка распределения GEV из этих значений

1

Я очень новичок в Python, и я огляделся по интернету, но не смог найти ничего логичного, что могло бы помочь мне с моей проблемой.

У меня есть значения осадков на графике, и теперь мне нужно установить распределение GEV из этих значений на графике. Каждое значение равно максимальному значению года, начиная с 1974 по 2017 год (так что всего 43 значения).

Это значения:

max_precip = [9.4, 38.0, 12.5, 35.3, 17.6, 12.9, 12.4, 19.6, 15.0, 13.2, 12.3, 16.9, 16.9, 29.4, 13.6, 11.1, 8.0, 16.6, 12.0, 13.1, 9.1, 9.7, 21.0, 11.2, 14.4, 18.8, 14.0, 19.9, 12.4, 10.8, 21.6, 15.4, 17.4, 14.8, 22.7, 11.5, 10.5, 11.8, 12.4, 16.6, 11.7, 12.9, 17.8]

Я обнаружил, что мне нужно использовать gev.fit, поэтому я подумал использовать следующее:

t = np.linspace(1,43,43)
fit = gev.fit(max_precip,loc=3)
pdf = gev.pdf(t, *fit)
plt.plot(t,pdf)
plt.plot(t, max_precip, "o")

Но это только печатает точки max_precip в графе, а не в распределении GEV.

Кто-нибудь может мне помочь? Извините, если этот вопрос уже задан, я не смог найти ничего подобного.

Я использовал эти импортные товары:

import csv
import matplotlib.pyplot as plt
import numpy as np

from dateutil.rrule import rrule, YEARLY
import datetime
from matplotlib.dates import DateFormatter
from scipy.stats import genextreme as gev
from scipy.stats import genpareto as gpd
from scipy.optimize import minimize
Теги:
plot
distribution

1 ответ

1
Лучший ответ

Я попытался подогнать ваши данные

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import genextreme as gev

def main(rvs):
    shape, loc, scale = gev.fit(rvs)
    return shape, loc, scale

if __name__ == '__main__':
    rvs = [9.4, 38.0, 12.5, 35.3, 17.6, 12.9, 12.4, 19.6, 15.0, 13.2, 12.3, 16.9, 16.9, 29.4, 13.6, 11.1, 8.0, 16.6, 12.0, 13.1, 9.1, 9.7, 21.0, 11.2, 14.4, 18.8, 14.0, 19.9, 12.4, 10.8, 21.6, 15.4, 17.4, 14.8, 22.7, 11.5, 10.5, 11.8, 12.4, 16.6, 11.7, 12.9, 17.8]

    shape, loc, scale = main(rvs)

    print(shape)
    print(loc)
    print(scale)

    l = loc + scale / shape

    xx = np.linspace(l+0.00001, l+0.00001+35, num=71)
    yy = gev.pdf(xx, shape, loc, scale)

    hist, bins = np.histogram(rvs, bins=12, range=(-0.5, 23.5), density=True)
    plt.bar(bins[:-1], hist, width = 2, align='edge')

    plt.plot(xx, yy, 'ro')
    plt.show()

но я вернулся

-0.21989526255575445
12.749780017954315
3.449061347316184

для shape, loc и scale. Если вы посмотрите на распределение GEV, как определено в scipy, когда форма отрицательная, допустимый интервал [loc + scale/shape... +infinity]. Я вычислил последнее значение и равен

-2.935417290135696

должно сработать...

Python3, Anaconda, scipy 1.1, Windows 10 64bit

ОБНОВИТЬ

Хорошо, я обновил код и добавил график, выглядит несколько разумным. Это то, что вы ищете? В принципе, трюк заключается в гистограмме и компоновке ячеек плотности, перекрывающихся с PDF

Изображение 174551

  • 0
    Если вы сравните параметризацию, приведенную в статье в википедии, с той, что используется genextreme , вы увидите, что параметры формы имеют противоположные знаки. Таким образом, поддержка подгонки, которую вы вычислили: (loc + scale / shape, + ∞) = (-2.9354, + ∞).
  • 0
    @WarrenWeckesser Ах, хорошо, спасибо
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню