2013-06-28 2 views
0

Я пытался подгонять некоторые данные гистограммы с помощью scipy.optimize.curve_fit, но до сих пор я ни разу не смог создать подходящие параметры, которые значительно отличаются от моих параметров догадки.Почему scipy.optimize.curve_fit создает параметры, которые едва ли отличаются от предположений?

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

Если вы видели что-либо подобное раньше, я бы хотел получить совет. Выполняют ли минимально-квадратные процедуры минимизации только некоторые классы функций?

Я стараюсь это,

import numpy as np 
from matplotlib.pyplot import * 
from scipy.optimize import curve_fit 

def grating_hist(x,frac,xmax,x0): 
    # model data to be turned into a histogram 
    dx = x[1]-x[0] 
    z = np.linspace(0,1,20000,endpoint=True) 
    grating = np.cos(frac*np.pi*z) 
    norm_grating = xmax*(grating-grating[-1])/(1-grating[-1])+x0 
    # produce the histogram 
    bin_edges = np.append(x,x[-1]+x[1]-x[0]) 
    hist,bin_edges = np.histogram(norm_grating,bins=bin_edges) 
    return hist 

x = np.linspace(0,5,512) 
p_data = [0.7,1.1,0.8] 
pct = grating_hist(x,*p_data) 
p_guess = [1,1,1] 
p_fit,pcov = curve_fit(grating_hist,x,pct,p0=p_guess) 

plot(x,pct,label='Data') 
plot(x,grating_hist(x,*p_fit),label='Fit') 
legend() 

show() 

print 'Data Parameters:', p_data 
print 'Guess Parameters:', p_guess 
print 'Fit Parameters:', p_fit 
print 'Covariance:',pcov 

и я вижу это: http://i.stack.imgur.com/GwXzJ.png (Я новичок здесь, поэтому я не могу добавлять изображения)

Data Parameters: [0.7, 1.1, 0.8] 
Guess Parameters: [1, 1, 1] 
Fit Parameters: [ 0.97600854 0.99458336 1.00366634] 
Covariance: [[ 3.50047574e-06 -5.34574971e-07 2.99306123e-07] 
[ -5.34574971e-07 9.78688795e-07 -6.94780671e-07] 
[ 2.99306123e-07 -6.94780671e-07 7.17068753e-07]] 

Whaaa? Я уверен, что это не локальный минимум для изменений в xmax и x0, и это далеко от глобального минимума. Параметры посадки по-прежнему не меняются, даже с лучшими догадками. Различные варианты функций кривой (например, сумма двух нормальных распределений) do создают новые параметры для одних и тех же данных, поэтому я знаю, что это не сами данные. Я также пробовал то же самое с scipy.optimize.leastsq сам на всякий случай, но без кубиков; параметры по-прежнему не перемещаются. Если у вас есть мысли по этому поводу, я бы хотел их услышать!

+0

Я хотел бы попробовать docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html – user333700

ответ

0

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

Вот модифицированная версия кода делает так:

z = np.linspace(0,1,20000,endpoint=True) 

def grating_hist_indicator(x,frac,xmax,x0): 
    # model data to be turned into a histogram 
    dx = x[1]-x[0] 
    grating = np.cos(frac*np.pi*z) 
    norm_grating = xmax*(grating-grating[-1])/(1-grating[-1])+x0 
    return norm_grating 

x = np.linspace(0,5,512) 
p_data = [0.7,1.1,0.8] 
pct = grating_hist(x,*p_data) 

pct_indicator = grating_hist_indicator(x,*p_data) 
p_guess = [1,1,1] 
p_fit,pcov = curve_fit(grating_hist_indicator,x,pct_indicator,p0=p_guess) 

plot(x,pct,label='Data') 
plot(x,grating_hist(x,*p_fit),label='Fit') 
legend() 
show() 
+0

Конечно, вы право - я подхожу к статистическому описанию данных, потому что он намного стройнее, а сами данные - это трехмерная поверхность, запертая на тайном программном обеспечении 1998 года без разумного формата экспорта. – Tyler

+0

Вы имеете в виду, что у вас нет доступа к самим данным, и единственный вывод, который у вас есть, - это статистическое описание, то есть то, что возвращает ваша функция 'grating_hist'? – gg349