2012-03-20 2 views
10

私は理解していないエラーを取得していシーケンスで配列要素を設定する:scipyのダウンロードとValueError FMIN最適化:<code>scipy.optimize</code>の<code>fmin</code>を使用する場合

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配列ではなく2次元配列です。だから、2回目の反復で、fminは1D配列を渡します(それが動作するはずです)。結果は非スカラーになります。

したがって、1d配列を最初の引数として受け入れるようにコスト関数をリファクタリングする必要があります。

最も簡単な変更は、必要に応じて、fminに渡す前にinitial_thetaを平坦化し、cost_function内のthetaを(X.shape [1]、1)に再整形することです。

+0

ありがとうございます。はい、次元の数は私を混乱させていました。だから、私は最初にthetaとyの両方を1つに薄暗く設定しました。そして、コスト関数の戻り値は、それ以上調整することなくスカラとして機能します。乾杯。 – Kim

2

cost_functionはスカラーを返しますが、戻り値Jは何らかの配列です。

関連する問題