我目前正在编写一个脚本来计算一些适合某些中子散射数据的函数。 我有一个带有能量值的数组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)
有没有人有想法?
由于