gpt4 book ai didi

python - 正确使用 fmin_l_bfgs_b 来拟合模型参数

转载 作者:太空狗 更新时间:2023-10-29 22:14:00 24 4
gpt4 key购买 nike

我有一些实验数据(对于 y、x、t_exp、m_exp),并且想使用 constrained multivariate BFGS method 为这些数据找到“最佳”模型参数(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)

几个问题:

  1. 我的模型公式 func 应该包括我的独立变量 x 还是应该作为 的一部分从实验数据 x_exp 中提供*参数?
  2. 当我运行上面的代码时,我得到一个错误 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。我是否正确指定了边界?

最佳答案

我不想试图弄清楚您使用的模型代表什么,所以这里有一个适合直线的简单示例:

x_true = arange(0,10,0.1)m_true = 2.5b_true = 1.0y_true = m_true*x_true + b_truedef func(params, *args):    x = args[0]    y = args[1]    m, b = params    y_model = m*x+b    error = y-y_model    return sum(error**2)initial_values = numpy.array([1.0, 0.0])mybounds = [(None,2), (None,None)]scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(x_true,y_true), approx_grad=True)scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(x_true, y_true), bounds=mybounds, approx_grad=True)

第一个优化是无界的,并给出了正确的答案,第二个考虑到阻止它达到正确参数的边界。

您犯的重要错误是几乎所有的优化函数,'x' 和 'x0' 指的是您正在优化的参数 - 其他所有内容都作为参数传递。您的 fit 函数返回正确的数据类型也很重要 - 这里我们需要一个单一的值,一些例程需要一个错误向量。除非您想分析计算梯度并提供它,否则您还需要 approx_grad=True 标志。

关于python - 正确使用 fmin_l_bfgs_b 来拟合模型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8672005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com