Я пытаюсь выполнить минимизацию следующей функции:Python правильное использование scipy.optimize.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')
бета является неизвестность переменная функции mvqr()
и beta0
- это начальная догадка, массив (2,2)
, который я ранее вычислил.
я получил ошибку:
NameError: global name 'beta' is not defined
.
Для кого интересует, был ли файл функции mvqr()
уже размещен в папке пакетов python, ответ таков: yes, it has.
Я думаю, проблема в beta
в функции mvqr()
и использование функции lambda
.
Любая помощь?
EDIT
Благодаря ру. код теперь компилируется без ошибок, но при выполнении минимизации не повторяется, так как вывод функции 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 = minim (fun, beta0, method = 'BFGS')' shoudl be 'result = minim (fun, beta, method = 'BFGS')' например. бета без '0'? – EdChum
@EdChum На самом деле 'beta0' является исходным предположением для' scipy.optimize.minimize'. Или 'x0 = beta0', чтобы быть более точным. И, как я уже сказал, я уже подсчитал это. – chabert
Можете ли вы опубликовать полную трассу? – mgilson