2016-10-08 4 views
1

私が取り組んでいるプロジェクトの一部として、2mベクトル間の平均二乗誤差を計算する必要があります。行列乗算を実行中にメモリエラーが発生する

は基本的に私二つの行列xxhat、両方がnによってサイズmであり、私が興味ベクトルは、これらのベクトルの行です。

私はそれが正常に機能しています。このコード

def cost(x, xhat): #mean squared error between x the data and xhat the output of the machine 
    return (1.0/(2 * m)) * np.trace(np.dot(x-xhat,(x-xhat).T)) 

とMSEを計算し、この式が正しいです。

私の特定のケースでは、私のmnが非常に大きいという問題があります。具体的には、m = 60000およびn = 785である。だから私のコードを実行し、この関数を入力すると、私はメモリエラーが発生します。

MSEを計算する良い方法はありますか?私はむしろループを避け、行列の乗算に大きく傾くが、行列の乗算はここでは非常に無駄に思える。たぶん私は気づいていない気がしますか?

+2

あなたは方法がここで提案しようとすることができます:http:// stackoverflowの。 com/questions/16774849/mean-squared-error-in-numpy – jerry

+3

2つの配列を点滅させてからトレースを使用するだけでは、 – Julius

答えて

5

np.dot(x-xhat,(x-xhat).T)は、shape(m、m)の配列を作成します。あなたはmが60000だから、配列はほぼ29ギガバイトだと言う。

あなたは対角要素の合計だけである配列のトレースを取るので、その巨大な配列のほとんどは使用されません。 np.trace(np.dot(x-xhat,(x-xhat).T))を注意深く見ると、すべての要素の平方和の合計がx - xhatであることがわかります。したがって、巨大な中間配列を必要としないnp.trace(np.dot(x-xhat,(x-xhat).T))を計算する簡単な方法は((x - xhat)**2).sum()です。例えば、

In [44]: x 
Out[44]: 
array([[ 0.87167186, 0.96838389, 0.72545457], 
     [ 0.05803253, 0.57355625, 0.12732163], 
     [ 0.00874702, 0.01555692, 0.76742386], 
     [ 0.4130838 , 0.89307633, 0.49532327], 
     [ 0.15929044, 0.27025289, 0.75999848]]) 

In [45]: xhat 
Out[45]: 
array([[ 0.20825392, 0.63991699, 0.28896932], 
     [ 0.67658621, 0.64919721, 0.31624655], 
     [ 0.39460861, 0.33057769, 0.24542263], 
     [ 0.10694332, 0.28030777, 0.53177585], 
     [ 0.21066692, 0.53096774, 0.65551612]]) 

In [46]: np.trace(np.dot(x-xhat,(x-xhat).T)) 
Out[46]: 2.2352330441581061 

In [47]: ((x - xhat)**2).sum() 
Out[47]: 2.2352330441581061 

は、MSEの計算についてのより多くのアイデアについては、コメントでlink provided by user1984065を参照してください。あなたにも、パフォーマンスのために行くされている場合は

1

、一つの代替アプローチがそうのように、np.einsumを使用することができ二乗差の合計を計算する -

subs = x-xhat 
out = np.einsum('ij,ij',subs,subs)