gpt4 book ai didi

python - `scipy.optimize.minimize` 中的 Jacobian 和 Hessian 输入

转载 作者:太空狗 更新时间:2023-10-29 21:30:45 25 4
gpt4 key购买 nike

我试图了解“dogleg”方法在 Python 的 scipy.optimize.minimize 中是如何工作的功能。我正在调整帮助页面底部的示例。

根据注释,dogleg 方法需要 Jacobian 和 Hessian 参数。为此,我使用 numdifftools 包裹:

import numpy as np
from scipy.optimize import minimize
from numdifftools import Jacobian, Hessian

def fun(x,a):
return (x[0] - 1)**2 + (x[1] - a)**2

x0 = np.array([2,0]) # initial guess
a = 2.5

res = minimize(fun, x0, args=(a), method='dogleg',
jac=Jacobian(fun)([2,0]), hess=Hessian(fun)([2,0]))

print(res)

编辑:

如果我按照下面帖子的建议进行更改,

res = minimize(fun, x0, args=a, method='dogleg',
jac=Jacobian(lambda x: fun(x,a)),
hess=Hessian(lambda x: fun(x,a)))

我得到一个错误 TypeError: <lambda>() takes 1 positional argument but 2 were given .我做错了什么?

在初始猜测时计算 Jacobian 和 Hessian 是否正确 x0

最佳答案

我知道这是一个玩具示例,但我想指出的是,使用像 JacobianHessian 这样的工具来计算导数而不是推导函数本身是相当昂贵的。例如你的方法:

x0 = np.array([2, 0])
a = 2.5
%timeit minimize(fun, x0, args=(a,), method='dogleg', jac=fun_der, hess=fun_hess)
100 loops, best of 3: 13.6 ms per loop

但是您可以这样计算导数函数:

def fun_der(x, a):
dx = 2 * (x[0] - 1)
dy = 2 * (x[1] - a)
return np.array([dx, dy]

def fun_hess(x, a):
dx = 2
dy = 2
return np.diag([dx, dy])

%timeit minimize(fun, x0, args=(a,), method='dogleg', jac=fun_der, hess=fun_hess)
1000 loops, best of 3: 279 µs per loop

如您所见,速度几乎快了 50 倍。它真的开始添加复杂的功能。因此,我总是尝试自己明确地推导函数,不管这可能有多困难。一个有趣的例子是基于内核的 Inductive Matrix Completion 实现。 .

argmin --> sum((A - gamma_u(X) Z gamma_v(Y))**2 - lambda * ||Z||**2)
where gamma_u = (1/sqrt(m_x)) * [cos(UX), sin(UX)] and
gamma_v = (1/sqrt(m_y)) * [cos(VY), sin(VY)]
X.shape = n_x, p; Y.shape = n_y, q; U.shape = m_x, p; V.shape = m_y, q; Z.shape = 2m_x, 2m_y

与显式推导和利用这些函数相比,从该方程计算梯度和 hessian 是极其不合理的。因此,正如@bnaul 指出的那样,如果您的函数确实具有封闭形式的导数,那么您确实想要计算和使用它们。

关于python - `scipy.optimize.minimize` 中的 Jacobian 和 Hessian 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41137092/

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