在最小化函数中嵌入最小拟合,参数不会改变

问题描述 投票:1回答:1

我尝试拟合一个具有多指数函数的三维矩阵,如

S(w1,w2,T)= sum(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
python-3.x lmfit
1个回答
0
投票

那么,你真正展示的是decay参数不会改为6位有效数字。当拟合完成时,首先将参数值改变非常小的量(如1.e-7)以生成偏导数或雅可比矩阵。因此,打印“仅”六位数可能不会显示所做的更改。

您没有提供完整的脚本或完整的输出。在不知道data(和其他变量)是什么的情况下,很难猜出可能会发生什么。

在拟合函数本身内做许多拟合(len(wt)*len(wtau),无论是那些)当然很奇怪,但也许这实际上是你想要做的 - 我不知道你想要完成什么。

© www.soinside.com 2019 - 2024. All rights reserved.