来自 scipy.optimize (python) 的 fmin_bfgs 的基本示例不起作用

basic example with fmin_bfgs from scipy.optimize (python) does not work

我正在学习 scipy 中的优化函数。我想使用可以提供函数梯度的 BFGS 算法。作为一个基本示例,我想最小化以下函数: f(x) = x^T A x ,其中 x 是一个向量。

当我在 python 中实现它时(参见下面的实现),我收到以下错误:

message: 'Desired error not necessarily achieved due to precision loss.'

追根溯源,我找到了 scipy 的函数,该函数执行线搜索以确定步长,但我不知道为什么在这样一个简单的例子中它会失败。

我的实现代码如下:

# coding: utf-8
from scipy import optimize
import numpy as np

# Matrix to be used in the function definitions
A = np.array([[1.,2.],[2.,3.]])

# Objectve function to be minimized: f = x^T A x
def f(x):
    return np.dot(x.T,np.dot(A,x))

# gradient of the objective function, df = 2*A*x
def fp(x):
    return 2*np.dot(A,x)

# Initial value of x
x0 = np.array([1.,2.])

# Try with BFGS
xopt = optimize.minimize(f,x0,method='bfgs',jac=fp,options={'disp':1})

这里的问题是您正在寻找最小值,但您的目标函数 f(x) 的值在负方向上不受限制。

乍一看,您的问题看起来像是凸目标函数的基本示例,但如果仔细观察,您会发现它不是。

对于凸性 A 必须是正(半)定的。您的情况违反了此条件。 (只需计算 A 的行列式,您将立即看到)。

如果你改为选择 A = np.array([[2.,2.],[2.,3.]]),一切都会好起来的。