встроить минимизацию в функцию минимизации, параметр не изменяется - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь подобрать 3d-матрицу с мультиэкспоненциальной функцией, так как

S (w1, w2, T) = сумма (A_i (w1, w2) * exp (-T / tau_i))

Чтобы сократить время подгонки, я разделил его на два шага.

Определите целевую функцию только с использованием времени жизни (tau_i) в качестве параметров, в то же время внедрив минимизацию подгонки в целевую функцию, как показанов коде.

Проблема в том, что "когда я минимизирую целевую функцию, параметры не меняются?"

#data, is 3d matrix, data[k,i,j]
ltn = 4

#build the amplifer fitting model        
def fit_2ddas_amp(params, dat, dec):
    model_amp = np.zeros(len(waitT),np.float)
    for k in range(ltn):
        model_amp = model_amp + params['amp_%i'%(k)] * np.exp(-waitT/dec[k])
    resid_amp = dat - model_amp
    return resid_amp 

#build the decay time fitting model
def fit_2ddas_decay(par_decay):
    decay_fit = np.zeros(ltn,np.float)
    for i in range(ltn):
        decay_fit[i] = par_decay['decay_%i'%(i)]
        print('Decay', str(i+1), ':', '%.6f'%(decay_fit[i]), 'ps' )
    resid = np.zeros_like(data)
    #do the amplifier fitting
    for i in range(len(wt)):
        for j in range(len(wtau)):
            #create initial value of amplifier
            par_amp = Parameters()
            for k in range(ltn):
                par_amp.add('amp_%i'%(k), value = 2 )
            #do the amplifer fit
            minner_amp = Minimizer(fit_2ddas_amp, par_amp, fcn_args=(data[:,i,j], decay_fit), nan_policy='propagate')
            result_amp = minner_amp.minimize(method='least_squares')  
            resid[:,i,j] = result_amp.residual
    return resid.flatten()


#create parameters of decay
par_2ddas_decay = Parameters()
for i in range(ltn):
     par_2ddas_decay.add('decay_%i'%(i), value = 2, min = 0.0)

#do the decay time fit
minner_decay = Minimizer(fit_2ddas_decay, par_2ddas_decay, nan_policy='propagate')
result_decay = minner_decay.minimize() 

the decay time always the same.
Decay 1 : 2.000000 ps
Decay 2 : 2.000000 ps
Decay 3 : 2.000000 ps
Decay 4 : 2.000000 ps
Decay 1 : 2.000000 ps
Decay 2 : 2.000000 ps
Decay 3 : 2.000000 ps
Decay 4 : 2.000000 ps
Decay 1 : 2.000000 ps
Decay 2 : 2.000000 ps
Decay 3 : 2.000000 ps
Decay 4 : 2.000000 ps

1 Ответ

0 голосов
/ 03 апреля 2019

Что вы действительно показали, так это то, что параметры decay не меняются до 6 значащих цифр.Когда подбор сделан, значения параметров сначала изменяются на очень небольшую величину (например, 1.e-7), чтобы генерировать частные производные или матрицу Якоби.Таким образом, распечатка «только» шести цифр может не показать внесенные изменения.

Вы не даете полный сценарий или полный вывод.Не зная, что такое data (и другие переменные), очень трудно угадать, что может происходить.

Конечно, странно делать много подгонок (len(wt)*len(wtau), какими бы они ни были) внутри сама функция подгонки, но, возможно, это именно то, что вы хотите сделать - я не могу сказать,что вы пытаетесь достичь.

...