我正在学习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})
答案 0 :(得分:2)
这里的问题是你正在寻找一个最小值,但你的目标函数f(x)
的值不是负面的。
乍一看,你的问题看起来像凸目标函数的一个基本例子,但是如果你仔细看一下,你会发现它不是。
凸度A
必须是正(半)明确的。在您的情况下违反了这种情况。 (只需计算A的行列式,你就会立即看到它。)
如果您改为选择A = np.array([[2.,2.],[2.,3.]])
,一切都会好起来的。