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

标签 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})

最佳答案

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

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

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

如果您选择A = np.array([[2.,2.],[2.,3.]]),一切都会恢复正常。

关于python - scipy.optimize (python) 中的 fmin_bfgs 的基本示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30797882/

相关文章:

python - `print()`是怎么工作的?

c - 优化的itoa功能

python - 计算n维图像熵Python

numpy - scipy 和 numpy svd 或 eig 总是返回相同的奇异/本征向量吗?

python - 模拟电子运动——python中自适应步长的微分方程

python - 如果流的另一端调用了socket.close(),则在哪里声明socket.recv()调用返回空字节对象?

python - 使用plotly保护数据隐私

python - 在 Python 中使用列表而不是字典进行优化

c - GCC Optimization 删除了函数 Prologue 和 Epilogue

python - 如何从带有parent_id的dict创建带有children的dict