2013-05-22 16 views
6

Ich versuche, ein MATLAB/Octave-Programm mit NumPy 1.8.0 und Python 2.7.3 nach Python zu portieren. Ich habe this reference als Hilfe bei der Konvertierung von MATLAB-Funktionen in NumPy-Methoden mit großem Erfolg verwendet, bis ich an den Punkt komme, wo ich die Korrelation zwischen zwei Matrizen berechnen möchte.Was ist der Unterschied zwischen MATLAB/Octave corr und Python numpy.correlate?

Die erste Matrix ist 40000x25 Floats, die zweite Matrix ist 40000x1 Ints. In Octave verwende ich die Anweisung corr(a,b) und bekomme eine 25x1-Matrix von Floats. Der Versuch, das entsprechende Verfahren in NumPy (numpy.correlate(a,b)) erzeugt einen Fehler:

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 

Ich kann es an die Arbeit, wenn ich den Code ändern, um eine Korrelation für jede Spalte von a zu berechnen, wie folgt:

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

Die Werte im Array c2 sind jedoch anders als die Ausgabe von Octave. Octave gibt eine 25x1-Matrix von Floats zurück, die alle kleiner als 1 sind. Die Werte, die ich von NumPy erhalte, sind Floats zwischen -270 und 900.

Ich habe versucht zu verstehen, was die beiden Algorithmen unter der Haube machen, sind aber kläglich gescheitert. Kann jemand auf meinen Logikfehler hinweisen?

Antwort

6

Es scheint, dass es eine numpy.corrcoef gibt, die die Korrelationskoeffizienten wie gewünscht berechnet. Die Schnittstelle unterscheidet sich jedoch von der Octave/Matlab corr.

Zunächst behandelt die Funktion standardmäßig Zeilen als Variablen, wobei die Spalten Beobachtungen sind. Um das Verhalten von Octave/Matlab nachzuahmen, können Sie eine Markierung übergeben, die dies umkehrt.

Auch nach this answer die numpy.cov Funktion (die corrcoef intern verwendet, nehme ich an) gibt eine 2x2-Matrix, von denen jede eine spezifische Kovarianz enthalten:

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

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

Er weist darauf hin, das [0][1] Element ist, was Sie für cov(a,b) wollen. So vielleicht so etwas wie dies funktionieren wird:

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

Als Referenz sind hier einige Auszüge der beiden Funktionen, die Sie versucht hatte. Es scheint so zu sein, dass sie ganz andere Dinge tun.

Octave:

— 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.

Und 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

Ich habe versucht, dass aber 'numpy.cov (a, b)' gibt einen 2x2-Array von Schwimmern und ich weiß nicht, wie das bezieht sich auf die Korrelation. – Crystal

+0

oder versuchen Sie einfach zu erhalten [Pearson's r] (http://docs.scipy.org/doc/scipy-0.12.0/reference/generated/scipy.stats.pearsonr.html) – Rasman

+0

oder [dies] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html) – Rasman