【问题标题】:Python correct use of scipy.optimize.minimizePython 正确使用 scipy.optimize.minimize
【发布时间】:2015-03-18 22:22:22
【问题描述】:

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

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包的目录中,答案是:是的。

我认为问题在于mvqr() 函数中的betalambda 函数的使用。

有什么帮助吗?

编辑

感谢光伏。代码现在编译没有错误,但是在执行最小化时不会迭代,因为函数 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],因此算法终止,但对我来说,最初的猜测是函数的最小值看起来很奇怪(即使一个本地的)。有谁知道如何避免它?

任何帮助将不胜感激。

【问题讨论】:

  • 这是错字吗?:result = minimize(fun, beta0, method = 'BFGS') 应该是result = minimize(fun, beta, method = 'BFGS') 例如没有0的测试版?
  • @EdChum 实际上beta0scipy.optimize.minimize 的初始猜测。或者更准确地说是x0 = beta0。正如我所说,我之前已经计算过了。
  • 你能发布完整的回溯吗?
  • 除此之外:这不是您的问题,但您的 mvqr 函数可能无法执行您想要的操作 - 它会在循环的第一步返回,即 i == 1 和所以循环并没有真正完成任何事情。
  • @mgilson 回溯很长,并且有一些数据文件加载了pandas。我担心的是我在定义未知变量时遗漏了一些东西。注意optimizationunconstrained所以我不知道beta的所有可能值是什么,我只有起点beta0

标签: python optimization lambda scipy minimize


【解决方案1】:

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

之后,考虑阅读 Python 教程,尤其是。关于全局变量和局部变量。

【讨论】:

  • 我试过你的答案,但它返回: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: 9.3738544991924501e+59 x: array([ 3.44860608e+13, -4.10768809e-02, -1.42222910e+15, -1.22803296e+00]) message: 'Optimization terminated successfully.' jac: array([ 0., 0., 0., 0.])。所以基本上不计算任何迭代并返回初始值。
  • 我不是专家,但如果 Hessian 矩阵的逆矩阵 (hess_inv) 是单位矩阵,而雅可比矩阵 (jac) 为零,那么迭代将不会进行。参见例如en.wikipedia.org/wiki/Newton%27s_method_in_optimization
  • @FuzzyDuck 完全正确!我研究了很多优化的东西,如果jack == 0 是一个固定点,并且hess 是半正定的,那么它也是一个最小值。我的猜测是它可能是一个局部最小值,但它对我来说似乎有点奇怪,因为它是算法的起点。
  • 你有没有尝试过其他的起点?您的函数计算结果相当大。此外,您的x 值数组似乎涵盖了广泛的数量级。让我推测它可能是数字。
猜你喜欢
  • 2019-11-01
  • 2014-01-03
  • 1970-01-01
  • 2015-07-20
  • 2019-04-10
  • 2013-05-10
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多