gpt4 book ai didi

python - 如何更新 scipy.optimize.minimize 函数中的 args 值?

转载 作者:太空宇宙 更新时间:2023-11-03 17:27:09 26 4
gpt4 key购买 nike

在我的问题中,我需要更新成本函数内的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您必须能够改变输入参数(否则它将始终具有相同的值!)。 optimize.minimize功能会有所不同(“更新”)x但它会离开args正如它所称的那样,未受影响costFunc ,这意味着您的 paraList实际上应该给出 x ,不是args .

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 中前三个参数的最佳值:detValVec , projTrans ,和MeasVec 。如果您想获取它们暗示的最后三个值,您可以调用 forwardModelFuncres.x :

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

当然,了解 optimize.minimize 的局限性很重要:它只能最小化数组 x如果它是一维标量数组,那么希望是 paramList 中的值是标量。如果没有,您将必须展平并连接它们。此外,它将通过相同的 xargs雅可比 gradientFunc ,因此请确保其格式正确。

关于python - 如何更新 scipy.optimize.minimize 函数中的 args 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32407409/

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