Как оценить максимальную вероятность с помощью GEV в Python

Я пытаюсь сопоставить функцию плотности вероятности распределения обобщенных экстремальных значений (GEV) (pdf) с данными pdf. Эта гистограмма является функцией корзины. При настройке этого бункера также изменяется результат подбора функций. И curve_fit(func, x, y) правильно играет эту роль. но эта функция использует оценку наименьших квадратов. Я хочу использовать оценку максимального правдоподобия (MLE). И он дает хорошие результаты с функцией stats.genextreme.fit(data). Однако эта функция не отображает изменения формы гистограммы в зависимости от интервала. Просто используйте исходные данные.

Пытаюсь использовать MLE. И мне удалось оценить параметры стандартного нормального распределения с помощью MLE. Однако он основан на исходных данных и не меняется в зависимости от корзины. Даже параметры GEV не могли быть оценены с исходными данными.

Я проверил исходный код genextreme_gen, rv_continuous и т. Д. Но этот код слишком сложен. Я не мог принять исходный код с моими навыками Python.

Я хотел бы оценить параметры распределения GEV через MLE. И я хочу получить результат, что оценка меняется в зависимости от корзины.

Что я должен делать?

Прошу прощения за мой плохой английский и благодарю вас за вашу помощь.

+)

h = 0.5  # bin width
dat = h105[1]  # data
b = np.arange(min(dat)-h/2, max(dat), h)  # bin range
n, bins = np.histogram(dat, bins=b, density=True)  # histogram
x = 0.5*(bins[1:]+bins[:-1])  # x-value of histogram

popt,_ = curve_fit(fg, x, n)  # curve_fit(GEV's pdf, x-value of histogram, pdf value)
popt = -popt[0], popt[1], popt[2]  # estimated paramter (Least squares estimation, LSE)
x1 = np.linspace((popt[1]-popt[2])/popt[0], dat.max(), 1000)
a1 = stats.genextreme.pdf(x1, *popt)  # pdf

popt = stats.genextreme.fit(dat) # estimated parameter (Maximum likelihood estimation, MLE)
x2 = np.linspace((popt[1]-popt[2])/popt[0], dat.max(), 1000)
a2 = stats.genextreme.pdf(x2, *popt)

ширина бункера = 2

введите описание изображения здесь

ширина бункера = 0,5

введите описание изображения здесь


person huon    schedule 24.11.2020    source источник
comment
Не могли бы вы пояснить, что вы имеете в виду под тем, что оценочные параметры основаны на исходных данных и не меняются в зависимости от корзины? Ваш код, оценивающий параметры, также был бы полезен. Приведите конкретные примеры вместе с полученными и ожидаемыми результатами.   -  person fdermishin    schedule 25.11.2020


Ответы (1)


Один из способов сделать это - преобразовать бункеры в данные. Вы можете сделать это, подсчитав количество точек данных в каждой ячейке, а затем повторив центр ячейки это количество раз.

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

import scipy.stats as stats
from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt

ground_truth_params = (0.001, 0.5, 0.999)
count = 50

h = 0.2  # bin width
dat = stats.genextreme.rvs(*ground_truth_params, count)  # data
b = np.arange(np.min(dat)-h/2, np.max(dat), h)  # bin range
n, bins = np.histogram(dat, bins=b, density=True)  # histogram
bin_counts, _ = np.histogram(dat, bins=b, density=False)  # histogram
x = 0.5*(bins[1:]+bins[:-1])  # x-value of histogram
    
def flatten(l):
    return [item for sublist in l for item in sublist]

popt,_ = curve_fit(stats.genextreme.pdf, x, n, p0=[0,1,1])  # curve_fit(GEV's pdf, x-value of histogram, pdf value)
popt_lse = -popt[0], popt[1], popt[2]  # estimated paramter (Least squares estimation, LSE)
popt_mle = stats.genextreme.fit(dat) # estimated parameter (Maximum likelihood estimation, MLE)

uniform_dat_from_bins = flatten((np.linspace(x - h/2, x + h/2, n) for n, x in zip(bin_counts, x)))
popt_uniform_mle = stats.genextreme.fit(uniform_dat_from_bins) # estimated parameter (Maximum likelihood estimation, MLE)

centered_dat_from_bins = flatten(([x] * n for n, x in zip(bin_counts, x)))
popt_centered_mle = stats.genextreme.fit(centered_dat_from_bins) # estimated parameter (Maximum likelihood estimation, MLE)

plot_params = {
    ground_truth_params: 'tab:green',
    popt_lse: 'tab:red',
    popt_mle: 'tab:orange',
    popt_centered_mle: 'tab:blue',
    popt_uniform_mle: 'tab:purple'
}
param_names = ['GT', 'LSE', 'MLE', 'bin centered MLE', 'bin uniform MLE']

plt.figure(figsize=(10,5))

plt.bar(x, n, width=h, color='lightgrey')
plt.ylim(0, 0.5)
plt.xlim(-2,10)

for params, color in plot_params.items():
    x_pdf = np.linspace(-2, 10, 1000)
    y_pdf = stats.genextreme.pdf(x_pdf, *params) # the normal pdf
    plt.plot(x_pdf, y_pdf, label='pdf', color=color)
plt.legend(param_names)

plt.figure(figsize=(10,5))
for params, color in plot_params.items():
    plt.plot(np.sum(stats.genextreme.logpdf(dat, *params)), 'o', color=color)

На этом графике показаны PDF-файлы, оцененные с использованием различных методов, а также достоверные PDF-файлы.

примерные PDF-файлы

И следующий график показывает вероятность предполагаемых параметров с учетом исходных данных.

PDF, который оценивается MLE на исходных данных, имеет максимальное ожидаемое значение. Затем следуют PDF-файлы, которые оцениваются с использованием бина гистограммы (центрированные и однородные). После них идет достоверный PDF. И, наконец, идет PDF с наименьшей вероятностью, которая оценивается методом наименьших квадратов.

вероятность

person fdermishin    schedule 26.11.2020
comment
Большое спасибо! Ваш код помогает мне открывать новые возможности. Я мог узнать, что LSE лучше подходит для гистограммы, чем MLE, используя ваш код. - person huon; 27.11.2020
comment
Рад это слышать! Если это отвечает на ваш вопрос, пожалуйста, проголосуйте за него и отметьте его как принятый ответ. - person fdermishin; 27.11.2020