2012-01-06 3 views
12

Проблема Сводка: При попытке использовать минимизацию scipy.optimize.fmin_bfgs функции (оптимизация), функция выдает ошибкуматрицы не выровнены ошибка: Python SciPy fmin_bfgs

derphi0 = np.dot(gfk, pk) ValueError: matrices are not aligned

. Согласно моей проверке ошибок это происходит в самом конце первой итерации через fmin_bfgs - непосредственно перед возвратом любых значений или любыми вызовами обратного вызова.

Конфигурация: Windows Vista Python 3.2.2 SciPy 0,10 IDE = Eclipse, с PyDev

Подробное описание: Я использую scipy.optimize.fmin_bfgs, чтобы минимизировать стоимость простая реализация логистической регрессии (преобразование из Octave в Python/SciPy). В принципе, функция стоимости называется функцией cost_arr, а градиентный спуск - в функции gradient_descent_arr.

Я проверил и полностью проверил, что * cost_arr * и * gradient_descent_arr * работают правильно и правильно возвращают все значения. Я также проверял, чтобы соответствующие параметры передавались функции * fmin_bfgs *. Тем не менее, при запуске я получаю значения ValueError: матрицы не выровнены. Согласно обзору источника, точная ошибка возникает в

def line_search_wolfe1 function in # Minpack's Wolfe line and scalar searches as supplied by the scipy packages.

Следует отметить, что если я использую scipy.optimize.fmin вместо этого, Fmin функция выполняется до завершения.

Exact Ошибка:

File "D:\Users\Shannon\Programming\Eclipse\workspace\SBML\sbml\LogisticRegression.py", line 395, in fminunc_opt

optcost = scipy.optimize.fmin_bfgs(self.cost_arr, initialtheta, fprime=self.gradient_descent_arr, args=myargs, maxiter=maxnumit, callback=self.callback_fmin_bfgs, retall=True) 

File "C:\Python32x32\lib\site-packages\scipy\optimize\optimize.py", line 533, in fmin_bfgs old_fval,old_old_fval)
File "C:\Python32x32\lib\site-packages\scipy\optimize\linesearch.py", line 76, in line_search_wolfe1 derphi0 = np.dot(gfk, pk) ValueError: matrices are not aligned

я вызываю функцию оптимизации с: optcost = scipy.optimize.fmin_bfgs (self.cost_arr, initialtheta, fprime = self.gradient_descent_arr, арг = myargs, MaxIter = maxnumit, обратный вызов = self.callback_fmin_bfgs, retall = True)

Я провел несколько дней, пытаясь исправить это и не могу определить, что является причиной матрицы не выровнены ошибку.

ADDENDUM: 2012-01-08 Я работал с этим намного больше и, кажется, сузил проблемы (но я не понял, как их исправить). Во-первых, fmin (используя только fmin) работает с использованием этих функций - стоимость, градиент. Во-вторых, затраты и функции градиента точно возвращают ожидаемые значения при тестировании на одной итерации в ручном режиме (НЕ используя fmin_bfgs). В-третьих, я добавил код ошибки для optimize.linsearch, и ошибка, кажется, была выбрана в def line_search_wolfe1 в строке: derphi0 = np.dot (gfk, pk). Здесь, в соответствии с моими испытаниями, scipy.optimize.optimize pk = [[12.00921659] [11.26284221]] pk type = и scipy.optimize.optimizegfk = [[-12.00921659] [-11.26284221]] gfk type = Примечание: согласно моим тестам, ошибка возникает на самой первой итерации через fmin_bfgs (т. е. fmin_bfgs никогда не завершает ни одной итерации или обновления).

Я ценю ЛЮБОЕ руководство или идеи.

Мой код ниже (каротаж, документация удалены): Пусть тета = 2x1 ndarray (Actual: тэта информация Размер = (2, 1) Тип =) Пусть X = 100x2 ndarray (Actual: X Info Размер = (2 , 100) Тип =) Пусть у = 100x1 ndarray (Фактический: у Info Размер = (100, 1) Тип =)

def cost_arr(self, theta, X, y): 

    theta = scipy.resize(theta,(2,1))   

    m = scipy.shape(X) 

    m = 1/m[1] # Use m[1] because this is the length of X 
    logging.info(__name__ + "cost_arr reports m = " + str(m))   

    z = scipy.dot(theta.T, X) # Must transpose the vector theta    

    hypthetax = self.sigmoid(z) 

    yones = scipy.ones(scipy.shape(y)) 

    hypthetaxones = scipy.ones(scipy.shape(hypthetax)) 

    costright = scipy.dot((yones - y).T, ((scipy.log(hypthetaxones - hypthetax)).T)) 

    costleft = scipy.dot((-1 * y).T, ((scipy.log(hypthetax)).T)) 


def gradient_descent_arr(self, theta, X, y): 

    theta = scipy.resize(theta,(2,1)) 

    m = scipy.shape(X) 

    m = 1/m[1] # Use m[1] because this is the length of X 

    x = scipy.dot(theta.T, X) # Must transpose the vector theta 

    sig = self.sigmoid(x) 

    sig = sig.T - y 

    grad = scipy.dot(X,sig) 

    grad = m * grad 

    return grad 

def fminunc_opt_bfgs(self, initialtheta, X, y, maxnumit): 
    myargs= (X,y) 

    optcost = scipy.optimize.fmin_bfgs(self.cost_arr, initialtheta, fprime=self.gradient_descent_arr, args=myargs, maxiter=maxnumit, retall=True, full_output=True) 

    return optcost 
+0

Можете ли вы опубликовать простой, сжатый случай, который может запустить кто-то другой, который воспроизводит ошибку? Вероятно, что аргумент, который вы поставляете, находится в неправильной форме, но, не видя, что делает ваш код, будет невозможно помочь. – talonmies

+0

'Защиту gradient_descent_arr (само, тета, X, Y): тета = scipy.resize (тета, (2,1)) # Выдает размер октава матрицы т = scipy.shape (X) м = 1/м [1] # Используйте м [1], потому что это длина X х = scipy.dot (theta.T, х) # Должно транспонирование вектора тета сиг = self.sigmoid (х) сиг = sig.T - у град = scipy.dot (х, сиг) град = м * град return grad' – SaB

+0

talonmies - Спасибо. Я добавил код в исходное сообщение. Любые идеи были бы оценены. – SaB

ответ

16

В случае, если кто-либо другой встречи с этой проблемой ....

1) ОШИБКА 1: Как отмечено в комментариях, я неправильно вернул значение из моего градиента в виде многомерного массива (m, n) или (m, 1). Кажется, что fmin_bfgs требует получить 1d-массив из градиента (т. е. вы должны вернуть массив (m)) и массив NOT (m, 1). Используйте scipy.shape (myarray), чтобы проверить размеры, если вы не уверены в возвращаемое значение

исправления включает добавление:...

grad = numpy.ndarray.flatten(grad) 

только перед возвратом градиента от вашей функции градиента Этого «сглаживает» массив из (м, 1) до (м) fmin_bfgs может возьмите это как вход.

2) ОШИБКА 2: Помните, что fmin_bfgs работает с функциями NONlinear. В моем случае образец, с которым я работал, был функцией LINEAR. По-видимому, это объясняет некоторые аномальные результаты даже после упомянутого выше исправления сглаживания. Для LINEAR-функций fmin, а не fmin_bfgs, может работать лучше.

QED

+0

Кажется, что 'fmin_ncg' также требует сглаженных градиентных возвратов, (m, 1) необходимо заменить на (m,) – dashesy

0

В текущей версии SciPy вам не нужно проходить fprime аргумент. Он будет вычислять градиент для вас без каких-либо проблем. Вы также можете использовать «минимизировать» fn и передать метод как «bfgs», не предоставляя градиент в качестве аргумента.

Смежные вопросы