Python正确使用scipy.optimize.minimize

时间:2015-01-20 15:50:33

标签: python optimization lambda scipy minimize

我正在尝试执行以下功能的最小化:

def mvqr(P, y, x, c):
    s = 0
    for i in xrange(1, len(y)):
        summation =  numpy.linalg.norm(numpy.dot(numpy.linalg.inv(P), (y[i,:] - numpy.dot(beta, x[i,:])))) + numpy.dot(numpy.dot(c.T, linalg.inv(P)), (y[i,:] - numpy.dot(beta, x[i,:])))
        s = s + summation
    return s

这是主文件的行:

fun = lambda beta: mvqr(E, Y_x, X_x, v)
result = minimize(fun, beta0, method = 'BFGS')

beta是函数mvqr()的未知变量,beta0是初始猜测,是我之前计算过的(2,2)数组。

我收到了一个错误:

NameError: global name 'beta' is not defined

谁想知道函数mvqr()的文件是否已经位于python包的目录中,答案是:是的,它有。

我认为问题出在beta函数中mvqr()lambda函数的使用。

任何帮助?

修改

感谢pv。代码现在编译时没有错误,但是当执行最小化不迭代时,因为函数minimize的输出显示消息'Optimization terminated successfully.'但是没有迭代并返回初始猜测。

  status: 0
 success: True
    njev: 1
    nfev: 6
hess_inv: array([[1, 0, 0, 0],
                 [0, 1, 0, 0],
                 [0, 0, 1, 0],
                 [0, 0, 0, 1]])
     fun: 1.2471261924040662e+31
       x: array([  3.44860608e+13,  -4.10768809e-02,  -1.42222910e+15,
                  -1.22803296e+00])
 message: 'Optimization terminated successfully.'
     jac: array([ 0.,  0.,  0.,  0.])

我也试过了scipy.optimize.fmin_bfgs但结果却大致相同:

Optimization terminated successfully.
Current function value: 937385449919245008057547138533569682802290504082509386481664.000000
            Iterations: 0
  Function evaluations: 6
  Gradient evaluations: 1

可能不幸的是beta0是局部最小值,或者是jac == [0, 0, 0, 0]的固定点,因此算法终止,但我觉得初始猜测是最小的功能(即使是本地功能)。有谁知道如何避免它?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果您希望优化def mvqr(beta, P, y, x, c):的2x2矩阵值,请将定义更改为fun = lambda beta: mvqr(beta.reshape(2,2), E, Y_x, X_x, v)并执行minimize(fun, beta0.ravel())beta

之后,请考虑阅读Python教程,尤其是。全球和地方变量。