matrices no están alineadas Error: Python SciPy fmin_bfgs

Sinopsis del problema: Al intentar utilizar la función de minimización (optimización) scipy.optimize.fmin_bfgs, la función arroja una

derphi0 = np.dot (gfk, pk) ValueError:matrices no están alineadas

error. De acuerdo con mi error de verificación, esto ocurre al final de la primera iteración a través de fmin_bfgs, justo antes de que se devuelvan los valores o las llamadas a devolución de llamada.

Configuración Windows Vista Python 3.2.2 SciPy 0.10 IDE = Eclipse con PyDev

Descripción detallada Estoy usando scipy.optimize.fmin_bfgs para minimizar el costo de una implementación de regresión logística simple (conversión de Octave a Python / SciPy). Básicamente, la función de costo se denomina función cost_arr y el descenso de gradiente está en la función gradient_descent_arr.

He probado manualmente y verificado completamente que * cost_arr * y * gradient_descent_arr * funcionan correctamente y devuelven todos los valores correctamente. También probé para verificar que los parámetros adecuados se pasan a la función * fmin_bfgs *. Sin embargo, cuando se ejecuta, obtengo el ValueError: las matrices no están alineadas. Según la revisión de la fuente, el error exacto ocurre en el

def line_search_wolfe1 funciona en la línea Wolfe de # Minpack y en las búsquedas escalares proporcionadas por los paquetes scipy.

Notablemente, si uso scipy.optimize.fmin en cambio, la fmina función @ se ejecuta hasta completarse.

Error exacto:

File "D: \ Users \ Shannon \ Programming \ Eclipse \ workspace \ SBML \ sbml \ LogisticRegression.py", línea 395, en 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)   

Archivo "C: \ Python32x32 \ lib \ site-packages \ scipy \ Optimize \ Optimize.py", línea 533, en fmin_bfgs old_fval, old_old_fval)
File "C: \ Python32x32 \ lib \ site-packages \ scipy \ optimizar \ linesearch.py", línea 76, en line_search_wolfe1 derphi0 = np.dot (gfk, pk) ValueError: las matrices no están alineadas

Llamo a la función de optimización con: 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)

He pasado unos días tratando de arreglar esto y parece que no puedo determinar qué está causando lamatrices no están alineadas error.

ADDENDUM: 2012-01-08 Trabajé mucho más con esto y parece haber reducido los problemas (pero estoy desconcertado sobre cómo solucionarlos). Primero, fmin (usando solo fmin) funciona usando estas funciones: costo, gradiente. En segundo lugar, las funciones de costo y gradiente devuelven con precisión los valores esperados cuando se prueban en una sola iteración en una implementación manual (NO utilizando fmin_bfgs). Tercero, agregué un código de error para optimizar.linsearch y el error parece ser arrojado a def line_search_wolfe1 en la línea: derphi0 = np.dot (gfk, pk). Aquí, de acuerdo con mis pruebas, scipy.optimize.optimize pk = [[12.00921659] [11.26284221]] pk type = y scipy.optimize.optimizegfk = [[-12.00921659] [-11.26284221]] gfk type = Nota: según mi En las pruebas, el error se genera en la primera iteración a través de fmin_bfgs (es decir, fmin_bfgs ni siquiera completa una única iteración o actualización).

Aprecio CUALQUIER orientación o información.

Mi código a continuación (registro, documentación eliminada): Asuma theta = 2x1 ndarray (Real: theta Info Size = (2, 1) Type =) Suponga X = 100x2 ndarray (Actual: X Info Size = (2, 100) Type = ) Suponga y = 100x1 ndarray (Real: y Tamaño de información = (100, 1) Tipo =)

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta