【问题标题】:Is there a bug in scipy-0.18.1's `scipy.optimize.minimize`?scipy-0.18.1 的 `scipy.optimize.minimize` 中是否有错误?
【发布时间】:2016-12-14 13:54:05
【问题描述】:

我正在尝试专门使用 scipy.optimize.minimize 中的 dogleg 方法求解一个函数。为了更好地理解它,我正在修改帮助页面底部的示例并使用 dogleg 方法:

from scipy.optimize import minimize

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

# solver
res = minimize(fun, (2, 0), method='dogleg', jac=False) # or jac=None, it doesn't matter

print(res)

我收到一个错误ValueError: Jacobian is required for dogleg minimization.

这类似于一个较老的问题:"Jacobian is required for Newton-CG method" when doing a approximation to a Jacobian not being used when jac=False?,似乎没有得到解决。

所以我的问题是:minimize 中是否真的存在错误,或者我没有正确使用它?

【问题讨论】:

  • 请注意,Scipy 和 Python 是两个完全独立的项目,具有不同的发布周期和版本号。问题标题表明您认为 SciPy 是 Python 3.5 的一部分,但它绝对不是。 Scipy 的每个版本都可以与多个 Python 版本一起使用,Scipy 版本号与您的问题的相关性比 Python 版本号要高得多。

标签: python numpy optimization scipy


【解决方案1】:

您必须传递雅可比函数才能使用dogleg 方法,因为它是一种基于梯度的优化方法。如果您查看 scipy.optimize.minimizejac 参数,它会说

jac : 布尔型或可调用,可选
目标函数的雅可比(梯度)。仅适用于 CG、BFGS、Newton-CG、L-BFGS-B、TNC、SLSQP、dogleg、trust-ncg。如果jac 是布尔值并且是True,则假定fun 会随目标函数返回梯度。如果False,梯度将以数值方式估计。 jac 也可以是返回目标梯度的可调用函数。在这种情况下,它必须接受与fun 相同的参数。

那么如果你向下看页面底部的注释:

方法 dogleg 使用 dog-leg 信任区域算法进行无约束最小化。 该算法需要梯度和Hessian;此外,Hessian 必须是正定的。

一些基于梯度的方法不需要显式的 Jacobian(和/或 Hessian),因为它们将使用差分方法来近似它们。然而dogleg 确实需要你显式地传递这样一个函数。

【讨论】:

  • 我同意这似乎是一个未实现的功能,而不是一个错误。但是,我对文档的阅读是,当没有明确提供雅可比行列时,它将在数值上近似。完全可以使用带有数值近似 Hessian 的 dog-leg 信任区域优化器。
  • @SvenMarnach 这也是我的解释。但是如果我没有雅可比/黑森呢?我可以使用say approx_fprime(docs.scipy.org/doc/scipy-0.14.0/reference/generated/…) 来计算雅可比并将这个结果简单地解析为jac 吗?还是我需要更高级的东西?
  • @MedullaOblongata 试试看怎么样?对于您提供的示例函数,它肯定会起作用,但在实际应用中,它可能取决于您尝试优化的函数的细节。
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2014-08-14
  • 2016-12-16
相关资源
最近更新 更多