使用theano编译的函数与scipy最小化

时间:2017-08-19 18:14:39

标签: python optimization theano minimize

我目前正在编写一个脚本来计算一些适合某些中子散射数据的函数。 我有一个带有能量值的数组X,我用其他参数传递给函数以得到拟合曲线。 我使用简单的平方距离进行最小化,并且我想使用theano并一次计算包含所有数据集的大数组(对于所有测量的散射角度,相同的参数值,现在我是' m只测试每个角度的最小化程序。)

使用标准库直接定义表达式但使用theano,' x'来自scipy最小化的向量永远不会更新,它们只是与初始猜测保持一致,就像成本函数不依赖它一样。

以下是代码:

def resFunc_pseudo_voigt():
''' Resolution function for the backscattering spectrometer using a pseudo-voigt profile.

    Returns: The compiled theano function

    Inputs: normF   - scale factor which can be used for normalization
            S       - contribution factor for the lorentzian
            lorW    - lorentzian width
            gauW    - gaussian width    
            shift   - shift from 0 of the voigt profile's maximum
            bkgd    - background term

    Output: The compiled theano function result '''


X = T.vector()
normF = T.scalar()
S = T.scalar()
lorW = T.scalar()
gauW = T.scalar()
shift = T.scalar()
bkgd = T.scalar()


results, updates = theano.scan(lambda x_i: (normF * (S * lorW / (lorW**2 + (x_i - shift)**2) / np.pi 
                                         + (1-S) * T.exp(-(x_i-shift)**2 / 2*gauW**2) / gauW*T.sqrt(2*np.pi)
                                         + bkgd)), 
                                         sequences=X)

f_out = theano.function(inputs=[X, normF, S, lorW, gauW, shift, bkgd],
                    outputs=results, updates=updates, allow_input_downcast=True)


return f_out

使用最小化:

def res_cost(self, x, datas):

    cost = np.sum((datas.intensities - self.resFunc(datas.energies, *x))**2 / datas.errors**2)

    return cost


def resFit(self):

    for i, resFile in enumerate(self.dataList):
        resList = []
        for j, datas in enumerate(resFile):
            resList.append(optimize.minimize(lambda x: self.res_cost(x, datas),
                                             datas.intensities
                                             [50, 0.4, 0.5, 0.4, 0, 0.05],
                                             bounds=[(0., 1000.), (0., 1.), (0., 10.), (0., 10.),
                                                     (-5., 5.), (0., 0.8)]))

            print('\n> Final result for qVal = %s: ' % datas.qVal, flush=True)
            print('Fit normF : ' + str(resList[j].x[0]), flush=True)
            print('Fit S     : ' + str(resList[j].x[1]), flush=True)
            print('Fit lorW  : ' + str(resList[j].x[2]), flush=True)
            print('Fit gauW  : ' + str(resList[j].x[3]), flush=True)
            print('Fit shift : ' + str(resList[j].x[4]), flush=True)
            print('Fit bkgd  : ' + str(resList[j].x[5]), flush=True)

        self.resFitList.append(resList)

有没有人有想法?

由于

0 个答案:

没有答案