我是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
答案 0 :(得分: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 distribution as defined in scipy,则当shape为负数时,有效间隔为[loc + scale / shape ... + infinity]。我计算了后者的值,它等于
-2.935417290135696
应该工作...
Python3,Anaconda,scipy 1.1,Windows 10 64bit
更新
好的,我已经更新了代码并添加了绘图功能,看起来有些合理。你在找什么基本上,技巧是对其进行直方图绘制并绘制与PDF重叠的密度箱
答案 1 :(得分:0)
出于好奇,我尝试了OpenTURNS中可用的GeneralizedExtremeValue Factory(GEV)
import openturns as ot
sample = ot.Sample([[p] for p in max_precip])
gev = ot.GeneralizedExtremeValueFactory().buildAsGeneralizedExtremeValue(sample)
print (gev)
>>> GeneralizedExtremeValue(mu=12.7497, sigma=3.44903, xi=0.219894)
我可以确认它给出了相同的结果。