我有一些实验数据(对于 y、x、t_exp、m_exp),并希望使用受约束的多元 BFGS 方法找到该数据的“最佳”模型参数(A、B、C、D、E) 。参数 E 必须大于 0,其他不受约束。
def func(x, A, B, C, D, E, *args):
return A * (x ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * x) / numpy.cos(t_exp))) + numpy.exp((-2 * B * x) / numpy.cos(t_exp)) * C + (D * m_exp)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0, None)]
x,f,d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(m_exp, t_exp), bounds=mybounds)
几个问题:
- 我的模型公式应该
func
包括我的自变量x
还是应该从实验数据中提供x_exp
作为 的一部分*args
? - 当我运行上面的代码时,我得到一个错误
func() takes at least 6 arguments (3 given)
,我假设是 x,我的两个 *args ......我应该如何定义func
?
编辑:感谢@zephyr 的回答,我现在明白目标是最小化残差平方和,而不是实际函数。我得到了以下工作代码:
def func(params, *args):
l_exp = args[0]
s_exp = args[1]
m_exp = args[2]
t_exp = args[3]
A, B, C, D, E = params
s_model = A * (l_exp ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * l_exp) / numpy.cos(t_exp))) + numpy.exp((-2 * B * l_exp) / numpy.cos(theta_exp)) * C + (D * m_exp)
residual = s_exp - s_model
return numpy.sum(residual ** 2)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0,None)]
x, f, d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(l_exp, s_exp, m_exp, t_exp), bounds=mybounds, approx_grad=True)
我不确定界限是否正常工作。当我为 E 指定 (0, None) 时,我得到一个运行标志 2,异常终止。如果我将其设置为 (1e-6, None),它运行良好,但选择 1e-6 作为 E。我是否正确指定了边界?