2012-03-20 4 views
10

Quando si utilizza scipy.optimize s' fmin sto ottenendo un errore che non capisco:SciPy ottimizzare fmin ValueError: l'impostazione di un elemento di un array con una sequenza

ValueError: setting an array element with a sequence. 

Ecco un semplice esempio errore quadratico per dimostrare:

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. 

Sarei grato per qualsiasi aiuto per spiegare dove sto andando male.

+3

Si sta restituendo un array per la funzione di costo e 'fmin' si aspetta un singolo valore. Restituisci 'J [0,0]' o riscrivi la tua funzione di costo come 'J = 1/(2 * m) * np.sum (errore ** 2)' –

risposta

5

Il motivo è che il punto iniziale (initial_theta) che hai dato a fmin non è un array 1D ma un array 2D. Quindi su una seconda iterazione fmin passa una matrice 1D (è così che dovrebbe funzionare) e il risultato diventa non scalare.

Quindi si dovrebbe rifattorizzare la funzione di costo per accettare gli array 1d come primo argomento.

Il cambiamento più semplice consiste nel rendere il codice funzionante in modo da appiattire il parametro initial_theta prima di passare a fmin e rispristinare theta all'interno di cost_function in (X.shape [1], 1) se lo si desidera.

+0

Grazie per la spiegazione. Sì, il numero di dimensioni mi confondeva. Quindi, ora ho inizialmente impostato sia theta e y su un dim, e il valore di ritorno della funzione di costo funziona come uno scalare senza ulteriori aggiustamenti. Saluti. – Kim

2

cost_function dovrebbe restituire uno scalare, ma il valore restituito J è un array di qualche tipo.