2012-03-20 19 views
10

Podczas korzystania scipy.optimize „s fmin Dostaję błąd nie rozumiem:scipy optymalizacji fmin ValueError: ustawienie elementu tablicy z sekwencją

ValueError: setting an array element with a sequence. 

Oto prosty przykład kwadrat błędu wykazać:

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. 

Byłbym wdzięczny za pomoc w wyjaśnieniu, gdzie idę źle.

+3

Zwracasz tablicę dla funkcji kosztu, a 'fmin' oczekuje jednej wartości. Zwróć 'J [0,0]' lub przepisz swoją funkcję kosztu jako 'J = 1/(2 * m) * np.sum (error ** 2)' –

Odpowiedz

5

Powodem jest to, że punkt początkowy (initial_theta) nadany fmin nie jest tablicą 1D, ale tablicą 2D. Tak więc po drugiej iteracji fmin przechodzi przez tablicę 1D (tak to powinno działać), a wynik staje się nie-skalarny.

Powinieneś więc odmienić swoją funkcję kosztu, aby zaakceptować tablice 1d jako pierwszy argument.

Najprostszą zmianą jest sprawienie, że kod działa w celu spłaszczenia initial_theta przed przejściem do fmin i przekształcenia theta inside cost_function na (X.shape [1], 1), jeśli chcesz.

+0

Dzięki za wyjaśnienie. Tak, liczba wymiarów mnie myliła. Tak więc, teraz ustawiłem początkowo zarówno theta, jak i y na jeden dim, a wartość zwracana przez funkcję kosztu działa jak skalar bez jakiejkolwiek dalszej regulacji. Twoje zdrowie. – Kim

2

cost_function powinien zwrócić skalar, ale twoja wartość zwracana J jest tablicą jakiegoś rodzaju.

Powiązane problemy