Я пытался подгонять некоторые данные гистограммы с помощью 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 сам на всякий случай, но без кубиков; параметры по-прежнему не перемещаются. Если у вас есть мысли по этому поводу, я бы хотел их услышать!
Я хотел бы попробовать docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html – user333700