【发布时间】: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() 函数中的beta 和lambda 函数的使用。
有什么帮助吗?
编辑
感谢光伏。代码现在编译没有错误,但是在执行最小化时不会迭代,因为函数 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 实际上
beta0是scipy.optimize.minimize的初始猜测。或者更准确地说是x0 = beta0。正如我所说,我之前已经计算过了。 -
你能发布完整的回溯吗?
-
除此之外:这不是您的问题,但您的
mvqr函数可能无法执行您想要的操作 - 它会在循环的第一步返回,即i == 1和所以循环并没有真正完成任何事情。 -
@mgilson 回溯很长,并且有一些数据文件加载了
pandas。我担心的是我在定义未知变量时遗漏了一些东西。注意optimization是unconstrained所以我不知道beta的所有可能值是什么,我只有起点beta0。
标签: python optimization lambda scipy minimize