2014-10-30 1 views
2

У меня есть набор экспериментальных значений, и я хочу найти функцию, которая лучше описывает их распределение. Но в процессе обработки некоторыми функциями я обнаружил, что scipy.optimize.curve_fit и scipy.stats.rv_continuous.fit дают очень разные результаты, обычно не в пользу последнего. Вот простой пример:Почему оценка параметров максимального правдоподобия для распределений scipy.stats так плохо работает?

#!/usr/bin/env python3 
import numpy as np 
from scipy.optimize import curve_fit as fit 
from scipy.stats import gumbel_r, norm 
import matplotlib.pyplot as plt 

amps = np.loadtxt("pyr_11.txt")*-1000 # http://pastebin.com/raw.php?i=uPK31JGE 
argsGumbel0 = gumbel_r.fit(amps) 
argsGauss0 = norm.fit(amps) 
bins = np.arange(60) 
probs, binedges = np.histogram(amps, bins=bins, normed=True) 
bincenters = 0.5*(binedges[1:]+binedges[:-1]) 
argsGumbel1 = fit(gumbel_r.pdf, bincenters, probs, p0=argsGumbel0)[0] 
argsGauss1 = fit(norm.pdf, bincenters, probs, p0=argsGauss0)[0] 

plt.figure() 
plt.hist(amps, bins=bins, normed=True, color='0.5') 
xes = np.arange(0, 60, 0.1) 
plt.plot(xes, gumbel_r.pdf(xes, *argsGumbel0), linewidth=2, label='Gumbel, maximum likelihood') 
plt.plot(xes, gumbel_r.pdf(xes, *argsGumbel1), linewidth=2, label='Gumbel, least squares') 
plt.plot(xes, norm.pdf(xes, *argsGauss0), linewidth=2, label='Gauss, maximum likelihood') 
plt.plot(xes, norm.pdf(xes, *argsGauss1), linewidth=2, label='Gauss, least squares') 
plt.legend(loc='upper right') 
plt.show() 

enter image description here

Разница в производительности варьируется от драматической к мягким, но в моем случае это всегда присутствует. Почему это так? Как выбрать наиболее подходящий метод оптимизации для случая?

+1

Различные оптимизации вычисляют разные вещи, поэтому это скорее вопрос статистики, чем вопрос stackoverflow. Это не тот случай, когда оба оптимизатора пытаются оптимизировать одну и ту же функцию и имеют лучшую производительность, чем другие. –

+0

@ von-m, что я понимаю. Когда я говорю о производительности, я имею в виду настоящую доброту. Вопрос в том, как выбирать между оптимизаторами? Я в каких случаях максимальная вероятность дает более близкую посадку, чем наименьшие квадраты (и наоборот)? – Axon

ответ

1

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

Для вашей проблемы я рекомендовал бы использовать распределение Ландау для подгонки.

Смежные вопросы