2015-01-20 11 views
1

Я пытаюсь выполнить минимизацию следующей функции: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] и, следовательно, алгоритм заканчивается, но мне кажется странным, что первоначальное предположение - это минимум функции (даже если она локальная). Кто-нибудь знает, как этого избежать?

Любая помощь будет оценена по достоинству.

+0

Это опечатка: 'result = minim (fun, beta0, method = 'BFGS')' shoudl be 'result = minim (fun, beta, method = 'BFGS')' например. бета без '0'? – EdChum

+0

@EdChum На самом деле 'beta0' является исходным предположением для' scipy.optimize.minimize'. Или 'x0 = beta0', чтобы быть более точным. И, как я уже сказал, я уже подсчитал это. – chabert

+0

Можете ли вы опубликовать полную трассу? – mgilson

ответ

2

Изменить определение для 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()), если вы хотите, чтобы оптимизировать стоимость beta, которая является матрицей 2х2.

После этого подумайте о том, чтобы прочитать учебник по Python, особенно. по глобальным и локальным переменным.

+0

Я попробовал ваш ответ, но он возвращает: '0: 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]]) удовольствие: 9.3738544991924501e + 59 х: массив ([3.44860608e + 13, -4.10768809e-02, -1.42222910e + 15, -1.22803296e + 00]) сообщение: «Оптимизация завершена успешно». jac: array ([0., 0., 0., 0.]) '. Таким образом, в основном не вычисляется любая итерация и возвращает начальное значение. – chabert

+0

Я не эксперт, но если инверсия гессиана ('hess_inv') является единичной матрицей, а якобиан (' jac') - нули, то итерация никуда не денется. См. http://en.wikipedia.org/wiki/Newton%27s_method_in_optimization – FuzzyDuck

+0

@FuzzyDuck точно! Вместо этого я изучил множество статей оптимизации, и если 'jack == 0', который является стационарной точкой и как' hess' является полуположительным, является точкой минимума. Я предполагаю, что это может быть локальный минимум, но мне кажется немного странным, как отправная точка алгоритма. – chabert