早些时候发布了一个类似的问题,但是太模糊了,希望这可以解决我的疑问:
我有一个函数IVcal(rho,alpha,K)
,我希望找到rho
和alpha
的最佳值,以便数据列表smiledata
(函数的输出变化) K)最适合数据列表calibrate
:
xaxis = np.linspace(0.006,0.036,20)
calibrate = [calfun(K) for K in xaxis]
smiledata = [IVcal(rho,alpha,K) for K in xaxis]
我的想法是,我希望图表plt.plot(xaxis,smiledata, 'b--')
尽可能地与图plt.plot(xaxis,calibrate, 'r--')
完全匹配,只改变rho
和alpha
。
我不确定如何优化以找到这些最佳值。我考虑过采用smiledata
和calibrate
之间的差异并尽量减少但是我还没有找到一个好方法,特别是因为我需要输入的值而不是输出。我以前对于含糊不清感到抱歉。如果有任何其他要求澄清,请告诉我。
答案 0 :(得分:1)
您可以尝试使用scipy.optimize.leastsq
这是一种优化方法,旨在减少当前值集与目标值集之间的差异。
import scipy.optimize as opt
import numpy as np
def calfun(k):
"""Example calibration function"""
return k * 2 * 4
def IVcal(rho, alpha, k):
"""Example test function"""
return rho * alpha * k
def error_function(x0, **args):
"""Calculates error between functions with current inputs"""
xaxis = np.linspace(0.006, 0.036, 20)
calibrate = np.array([calfun(K) for K in xaxis])
smiledata = np.array([IVcal(x0[0], x0[1], K) for K in xaxis])
# Get error between data
error = smiledata - calibrate
# Print square root of sum of errors
print np.sqrt(np.sum(error**2.0))
return error
# Initial guesses
rho = 1
alpha = 1
x0 = np.array([rho, alpha])
# Run optimisation
result = opt.leastsq(func=error_function, x0=x0)[0]
print 'opt rho: ', result[0]
print 'opt alpha: ', result[1]
一些注意事项:
calibrate
和smiledata
的输出从list
转换为np.array
,可以计算两个数组中每个值之间的误差,而无需遍历列表opt.leastsq
输出中的第一个条目,因为这是优化变量的数组从scipy
版本17开始,有一个约束版本的最小平方称为scipy.optimize.least_squares
从上面的链接:
自变量的下限和上限。默认为无界限。每个数组必须匹配x0的大小或者是标量,在后一种情况下,所有变量的绑定都是相同的。使用带有适当符号的
np.inf
来禁用所有或部分变量的边界。
对于你的情况,我相信这将是
bounds = ([rho_lower, rho_higher],[-np.inf, np.inf])