2013-05-22 15 views
6

NumPy 1.8.0とPython 2.7.3を使用して、MATLAB/OctaveプログラムをPythonに移植しようとしています。私はthis referenceを使って、MATLAB関数をNumPyメソッドに変換するのを助けてくれました.2つの行列間の相関関係を計算したいところに到達するまでは大成功でした。MATLAB/Octave corrとPython numpy.correlateの違いは何ですか?

第1の行列は40000x25浮動小数点数であり、第2の行列は40000x1整数です。 Octaveでは文corr(a,b)を使用し、浮動小数点数の25x1の行列を取得します。 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は25x1の浮動小数点数の行列を返します。NumPyから得られる値は、-270と900の間の浮動小数点数です。

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

答えて

6

望ましくは、相関係数を計算するnumpy.corrcoefが存在するように見えます。しかし、そのインタフェースはOctave/Matlab corrとは異なります。

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

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

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

彼が指摘するように、[0][1]要素:

また、this answerによれば、numpy.cov関数は(corrcoefが内部で使用する、私は仮定)特定の共分散を含むそれぞれが2×2行列を返しますcov(a,b)のために欲しいものです。したがって、おそらくこのような何かが動作します。参考のため

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

を、ここにあなたがしようとした2つの関数の一部抜粋です。彼らは全く違ったことをしているようです。

オクターブ:

— Function File: corr (x, y)

Compute matrix of correlation coefficients.

If each row of x and y is an observation and each column is a variable, then the (i, j)-th entry of corr (x, y) is the correlation between the i-th variable in x and the j-th variable in y.

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

If called with one argument, compute corr (x, x), the correlation between the columns of x.

とnumpyの:

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

Cross-correlation of two 1-dimensional sequences.

This function computes the correlation as generally defined in signal processing texts:

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

with a and v sequences being zero-padded where necessary and conj being the conjugate.

+0

私はそれを試みたが、 'numpy.cov(a、b)は' floatの2x2の配列を返し、私は方法がわからないてきましたその相関に関連する。 – Crystal

+0

または[Pearson's r](http://docs.scipy.org/doc/scipy-0.12.0/reference/generated/scipy.stats.pearsonr.html) – Rasman

+0

または[this](http: /docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html) – Rasman

関連する問題