2012-03-20 2 views
10

로 배열 요소를 설정 내가 오류를 받고 있어요 scipy.optimizefmin를 사용하는 경우 이해가 안 : 여기 Scipy는 ValueError를 FMIN 최적화 : 시퀀스

ValueError: setting an array element with a sequence. 

입증하는 간단한 제곱 오차의 예입니다 :

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. 

어디에서 잘못 될지 설명하는 데 도움이 되었으면 좋겠습니다.

+3

당신은 비용 함수에 대한 배열을 리턴하고,'fmin'은 단일 값을 기대합니다. 'J [0,0]'를 반환하거나 비용 함수를 'J = 1/(2 * m) * np.sum (error ** 2)'로 다시 써라. –

답변

5

이유는 fmin에 지정한 시작점 (initial_theta)이 1D 배열이 아니라 2D 배열이기 때문입니다. 따라서 두 번째 반복에서 fmin은 1D 배열을 통과합니다 (즉, 어떻게 작동 할 것입니까?) 결과는 비 스칼라가됩니다.

따라서 첫 번째 인수로 1 차원 배열을 허용하도록 비용 함수를 리팩터링해야합니다.

가장 간단한 변경은 원하는 경우 cost_function 내에서 theta를 (X.shape [1], 1)로 바꾸기 전에 initial_theta를 평평하게 만드는 것입니다.

+0

감사합니다. 그렇습니다. 치수의 수가 혼란 스러웠습니다. 그래서 저는 처음에 theta와 y를 하나의 희미하게 설정했고, 비용 함수 반환 값은 더 이상 조정하지 않고 스칼라로 작동합니다. 건배. – Kim

2

cost_function은 스칼라를 반환해야하지만 반환 값 J은 어떤 종류의 배열입니다.