我正在学习 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.]])
,一切都会恢复正常。
关于python - scipy.optimize (python) 中的 fmin_bfgs 的基本示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30797882/