2012-03-20 77 views
10

當使用scipy.optimizefmin我得到一個錯誤,我不明白:SciPy的優化FMIN ValueError異常:設置一個數組元素與序列

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)' – 2012-03-20 00:43:23

回答

5

原因是您給fmin的起點(initial_theta)不是一維數組,而是二維數組。因此,在第二次迭代中,fmin傳遞一維數組(這是它應該如何工作的),結果變成非標量。

所以你應該重構你的成本函數來接受1d數組作爲第一個參數。

最簡單的變化就是讓代碼工作在傳遞給fmin之前將initial_theta弄平,並在cost_function中將theta重構爲(X.shape [1],1)如果你喜歡的話。

+0

感謝您的解釋。是的,維度的數量令我感到困惑。所以,我現在最初將theta和y都設置爲一個暗淡,並且成本函數返回值作爲標量運行,而無需進一步調整。乾杯。 – Kim 2012-03-21 17:53:42

2

cost_function應該返回一個標量,但是您的返回值J是某種數組。

相關問題