我正在尝试执行以下功能的最小化:
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]
的固定点,因此算法终止,但我觉得初始猜测是最小的功能(即使是本地功能)。有谁知道如何避免它?
任何帮助都将不胜感激。
答案 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教程,尤其是。全球和地方变量。