6

NumPy 1.8.0 と Python 2.7.3 を使用して、MATLAB/Octave プログラムを Python に移植しようとしています。私はこのリファレンスを MATLAB 関数を NumPy メソッドに変換する際の助けとして使用してきましたが、2 つの行列間の相関を計算したいところまで行き着きました。

最初のマトリックスは 40000x25 float で、2 番目のマトリックスは 40000x1 int です。Octave では、ステートメントを使用しcorr(a,b)て 25x1 の float 行列を取得します。NumPy ( numpy.correlate(a,b)) で対応するメソッドを試すと、エラーが発生します。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/numpy-1.8.0.dev_1a9aa5a_20130415-py2.7-macosx-10.8-intel.egg/numpy/core/numeric.py", line 751, in correlate
  return multiarray.correlate2(a,v,mode)
ValueError: object too deep for desired array

の各列の相関を計算するようにコードを変更するとa、次のように機能するようになります。

for i in range(25):
    c2[i] = numpy.correlate(a[:,i], b)

ただし、c2配列内の値は Octave からの出力とは異なります。Octave は、すべて 1 未満の浮動小数点数の 25x1 行列を返します。NumPy から取得した値は、-270 から 900 の間の浮動小数点数です。

2 つのアルゴリズムが内部で何をしているのかを理解しようとしましたが、惨めに失敗しました。誰かが私の論理的な失敗を指摘できますか?

4

1 に答える 1

7

numpy.corrcoef必要に応じて、相関係数を計算するが存在するようです。ただし、そのインターフェースは Octave/Matlab とは異なりますcorr

まず、デフォルトでは、関数は行を変数として扱い、列は観測値です。Octave/Matlab の動作を模倣するために、これを逆にするフラグを渡すことができます。

また、この回答によると、numpy.cov関数 (corrcoef内部的に使用されていると思います) は 2x2 行列を返し、それぞれに特定の共分散が含まれています。

cov(a,a)  cov(a,b)

cov(a,b)  cov(b,b)

彼が指摘するように、[0][1]要素はあなたが望むものですcov(a,b). したがって、おそらく次のようなものが機能します。

for i in range(25):
    c2[i] = numpy.corrcoef(a[:,i], b, rowvar=0)[0][1]

参考までに、あなたが試した 2 つの機能の抜粋を次に示します。彼らはまったく異なることをしているようです。

オクターブ:

— 関数ファイル: corr (x, y)

相関係数の行列を計算します。

x と y の各行が観測値で、各列が変数の場合、corr (x, y) の (i, j) 番目のエントリは、x の i 番目の変数と j 番目の変数の間の相関です。 y の変数。

      corr (x,y) = cov (x,y) / (std (x) * std (y))

1 つの引数で呼び出された場合、corr (x, x)、x の列間の相関を計算します。

そしてナンピー:

numpy.correlate(a, v, mode='valid', old_behavior=False)[ソース]

2 つの 1 次元シーケンスの相互相関。

この関数は、信号処理テキストで一般的に定義されている相関を計算します。

z[k] = sum_n a[n] * conj(v[n+k])

a および v シーケンスは必要に応じてゼロで埋められ、conj は共役です。

于 2013-05-22T18:25:26.043 に答える