2017-12-20 22 views
0

私はA '* Aを計算するさまざまな方法で、Pythonでベンチマークテストを行います.AはN x Mの行列です。最も速い方法の1つはnumpy.dot()を使用することでした。Aの共分散を使ってA '* Aを計算できますか?

numpy.cov()(共分散行列を与える)を使用して、何らかの形で重みを変えたり、何らかの形でA行列を前処理しても同じ結果が得られるかどうか不思議でしたか?しかし、私は成功しなかった。誰もが、A '* AとAの共分散の間に関係があるかどうかを知っていますか?AはN行/観測とM列/変数の行列ですか?

+2

'' 'np.dot()' ''は、実際の行列乗算が必要な場合は、最も高速です(高密度配列の場合はBLASを使用します)。他のアプローチを分析する必要はありません。なぜあなたはこれに興味がありますか?あなたの答えには – sascha

+0

ありがとう。私が働いている研究者は、 'numy.cov()'と 'numpy.corrcoef()'で行列の乗算を行うことができるかどうか、Pythonの他のメソッドと比較してタイミングをベンチマークするかどうかを調べました。 – AdhityaRavi

+1

これは数学的な問題ではなく数学(線形代数)の問題だと思います。 A.T * Aと共分散行列の変換との間に等価関係があるかどうかを確認しています。 – Tai

答えて

1

cov sourceをご覧ください。関数の終わりに近づくと、次のようになります。

c = dot(X, X_T.conj()) 

これは基本的に実行したいドットプロダクトです。しかし、入力のチェック、平均値の減算、正規化など、すべての種類の操作があります。

つまり、np.covは、内部で正確にその操作が含まれているため、決してnp.dot(A.T, A)より高速になることはありません。

import numpy as np 

a = np.random.rand(10, 3) 

m = np.mean(a, axis=0, keepdims=True) 
x = np.dot((a - m).T, a - m)/(a.shape[0] - 1) 

y = np.cov(a.T) 

assert np.allclose(x, y) # check they are equivalent 

あなたが見ることができるようにあなたが平均を引く場合、共分散行列は、生の内積に相当します。

enter image description here

やPythonのようcovariance matrix is computed - 言っ

結果をサンプル数(マイナス1)で除算します。

+0

ありがとうございます!私は私の答えを得た – AdhityaRavi

+0

あなたは大歓迎です。 – kazemakase

関連する問題