【问题标题】:How I can Update args value in scipy.optimize.minimize function?如何在 scipy.optimize.minimize 函数中更新 args 值?
【发布时间】:2015-09-07 02:12:07
【问题描述】:

在我的问题中,我需要更新成本函数中的 args 值,但 args 是一个函数参数,也具有元组结构。我想知道有没有办法改变 args 的元素并更新它以通过 jac 函数使用它?例如,在下面的代码中

paraList = [detValVec, projTrans, MeasVec, 
            coeMat, resVec, absCoeRec]
res = optimize.minimize(costFunc, x0, args=(paraList,), method='BFGS', jac=gradientFunc, options={'gtol': 1e-6, 'disp': True}) 
def costFunc(x0,arg):
    para = list(arg)
    para[3], para[4], para[5] = forwardModelFunc(para[0], para[1], para[2]) 
    return para[5]

我想更新 args 参数中的 para[3]、para[4]、para[5]。

【问题讨论】:

  • 您的costFunc 不依赖于x0。如果更改x0 没有效果,则不能将x0 最小化?您需要重新排列您的函数,以便您要更改的“参数”是第一个 (x0) 参数。

标签: python optimization scipy argument-passing minimize


【解决方案1】:

为了最小化costFunc,您必须能够改变输入参数(否则它将始终具有相同的值!)。 optimize.minimize 函数将改变(“更新”)x,但它会保持 args 不变,因为它调用 costFunc,这意味着您的 paraList 应该真正作为 x 给出,而不是 @987654328 @。

由于costFunc 仅取决于参数列表para[:3] 中的前三个值,因此更新后三个para[3:] 将无效,因此您可以使用x = para[:3]args = para[3:]。事实上,你甚至根本不需要args,因为它没有任何作用。

类似:

paraList = [detValVec, projTrans, MeasVec, coeMat, resVec, absCoeRec]

def costFunc(x):
    out = forwardModelFunc(x[0], x[1], x[2]) 
    return out[2]

x0 = paraList[:3] # the initial guess
res = optimize.minimize(costFunc, x0, method='BFGS', jac=gradientFunc,
                        options={'gtol': 1e-6, 'disp': True}) 

因此,您将获得的最佳结果(在res.x 中返回)将是paraList 中前三个参数的最佳值:detValVecprojTransMeasVec。如果你想得到它们暗示的最后三个值,你可以在res.x上调用forwardModelFunc

paraList_opt = list(res.x) + list(forwardModelFunc(*res.x)

当然,了解optimize.minimize 的局限性很重要:如果它是一维标量数组,它只能在数组x 上最小化,因此希望paramList 中的值是标量。如果没有,您将不得不将它们展平并连接起来。此外,它会将相同的 xargs 传递给 jacobian gradientFunc,因此请确保它的格式也正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多