2012-03-20 6 views
10

Al utilizar scipy.optimize 's fmin Recibo un error que no entiendo:Scipy optimizar fmin ValueError: Configuración de un elemento de matriz con una secuencia

ValueError: setting an array element with a sequence. 

Aquí está un ejemplo simple error al cuadrado de demostrar:

import numpy as np 
from scipy.optimize import fmin 

def cost_function(theta, X, y):  
    m = X.shape[0] 
    error = X.dot(theta) - y 
    J = 1/(2*m) * error.T.dot(error) 
    return J 

X = np.array([[1., 1.], 
       [1., 2.], 
       [1., 3.], 
       [1., 4.]]) 

y = np.array([[2],[4],[6],[8]]) 
initial_theta = np.ones((X.shape[1], 1)) * 0.01 

# test cost_function 
print cost_function(initial_theta, X, y) 
# [[ 14.800675]] seems okay... 

# but then error here... 
theta = fmin(cost_function, initial_theta, args=(X, y)) 

#Traceback (most recent call last): 
# File "C:\Users\me\test.py", line 21, in <module> 
# theta = fmin(cost_function, initial_theta, args=(X, y)) 
# File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 278, in fmin 
# fsim[0] = func(x0) 
#ValueError: setting an array element with a sequence. 

Estaría agradecido por cualquier ayuda para explicar dónde me estoy equivocando.

+3

Está devolviendo una matriz para la función de costo, y 'fmin' espera un único valor. Devuelva 'J [0,0]' o reescriba su función de costo como 'J = 1/(2 * m) * np.sum (error ** 2)' –

Respuesta

5

La razón es que el punto de partida (initial_theta) que le dio a fmin no es una matriz 1D sino una matriz 2D. Entonces, en una segunda iteración, fmin pasa una matriz 1D (así es como se supone que debería funcionar) y el resultado se vuelve no escalar.

Por lo tanto, debe refactorizar su función de costo para aceptar matrices de 1d como primer argumento.

El cambio más simple es hacer que el código funcione para aplanar el initial_theta antes de pasar a fmin y remodelar theta dentro de cost_function a (X.shape [1], 1) si lo desea.

+0

Gracias por la explicación. Sí, el número de dimensiones me confundía. Por lo tanto, ahora he configurado inicialmente tanto theta como y en uno oscuro, y el valor de retorno de la función de costo funciona como un escalar sin ningún otro ajuste. Aclamaciones. – Kim

2

cost_function debe devolver un escalar, pero su valor de retorno J es una matriz de algún tipo.

Cuestiones relacionadas