Python中有关scipy.optimize.minimize的问题

Python中有关scipy.optimize.minimize的问题,python,scipy,mathematical-optimization,minimize,Python,Scipy,Mathematical Optimization,Minimize,我对scipy的optimize.minimize例程有一些问题。我希望最小化函数: f(eta)=和i | eta*x_i-y_i| 关于埃塔。由于我不熟悉最小化例程和相应的方法,我尝试了一些。但是,使用BFGS方法会产生以下错误: File "/usr/local/lib/python3.4/dist-packages/scipy/optimize/_minimize.py", line 441, in minimize return _minimize_bfgs(fun, x0, args

我对scipy的optimize.minimize例程有一些问题。我希望最小化函数:

f(eta)=和i | eta*x_i-y_i|

关于埃塔。由于我不熟悉最小化例程和相应的方法,我尝试了一些。但是,使用BFGS方法会产生以下错误:

File "/usr/local/lib/python3.4/dist-packages/scipy/optimize/_minimize.py", line 441, in minimize return _minimize_bfgs(fun, x0, args, jac, callback, **options)
File "/usr/local/lib/python3.4/dist-packages/scipy/optimize/optimize.py", line 904, in _minimize_bfgs
A1 = I - sk[:, numpy.newaxis] * yk[numpy.newaxis, :] * rhok
IndexError: 0-d arrays can only use a single () or a list of newaxes (and a single ...) as an index
这是我无法解决的。请查找导致以下错误的代码。我在Ubuntu 14.04.3 LTS上使用Python3和scipy 0.17.0以及numpy 1.8.2

此外,共轭梯度法的性能似乎比其他方法差

最后但并非最不重要的一点是,我赞成通过scipy.optimize.brentq找到一阶导数的零点来估计最小值。这样行吗?还是你推荐另一种方法?与速度相比,我更喜欢稳健性

以下是一些说明问题和疑问的代码:

from scipy import optimize
import numpy as np

def function(x, bs, cs):
    sum = 0.
    for b, c in zip(bs, cs):
        sum += np.abs(x*b - c)
    return sum

def derivativeFunction(x, bs, cs):
    sum = 0.
    for b, c in zip(bs, cs):
        if x*b > c:
            sum += b
        else:
            sum -= b
    return sum

np.random.seed(1000)
bs = np.random.rand(10)
cs = np.random.rand(10)

eta0 = 0.5

res = optimize.minimize(fun=function, x0=eta0, args=(bs, cs), method='Nelder-Mead', tol=1e-6)
print('Nelder-Mead:\t', res.x[0], function(res.x[0], bs, cs))

res = optimize.minimize(fun=function, x0=eta0, args=(bs, cs,),  method='CG', jac=derivativeFunction, tol=1e-6)
print('CG:\t', res.x[0], function(res.x[0], bs, cs))

x = optimize.brentq(f=derivativeFunction, a=0, b=2., args=(bs, cs), xtol=1e-6, maxiter=100) 
print('Brentq:\t', x, function(x, bs, cs))

#Throwing the error
res = optimize.minimize(fun=function, x0=eta0, args=(bs, cs), method='BFGS', jac=derivativeFunction, tol=1e-6)
print('BFGS:\t', res.x[0], function(res.x[0], bs, cs))
其产出是:

Nelder-Mead:     0.493537902832 3.71986334101
CG:  0.460178525461 3.72659733011
Brentq:  0.49353725172947666 3.71986347245
其中,第一个值是最小值的位置,第二个值是最小值本身。输出忽略了上面的错误消息


谢谢你的帮助