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

时间:2015-06-12 07:45:56

标签: python optimization scipy

我正在学习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})

1 个答案:

答案 0 :(得分:2)

这里的问题是你正在寻找一个最小值,但你的目标函数f(x)的值不是负面的。

乍一看,你的问题看起来像凸目标函数的一个基本例子,但是如果你仔细看一下,你会发现它不是。

凸度A必须是正(半)明确的。在您的情况下违反了这种情况。 (只需计算A的行列式,你就会立即看到它。)

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