2013-05-22 2 views
6

Я пытаюсь перенести программу MATLAB/Octave на Python с помощью NumPy 1.8.0 и Python 2.7.3. Я использовал this reference как помощь в преобразовании функций MATLAB в методы NumPy с большим успехом, пока не дойду до точки, где я хочу вычислить корреляцию между двумя матрицами.В чем разница между MATLAB/Octave corr и Python numpy.correlate?

Первая матрица - 40000x25 поплавков, вторая матрица - 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 с поплавками, все меньше 1. Значения, которые я получаю от NumPy, являются поплавками между -270 и 900.

Я попытался понять, что оба алгоритма делают под капотом, но с треском провалились. Может ли кто-нибудь указать на мой логический провал?

ответ

6

Похоже, что существует numpy.corrcoef, который вычисляет коэффициенты корреляции, если требуется. Однако его интерфейс отличается от Octave/Matlab corr.

Прежде всего, по умолчанию функция обрабатывает строки как переменные, причем столбцы являются наблюдениями. Чтобы имитировать поведение Octave/Matlab, вы можете передать флаг, который отменяет это.

Кроме того, в соответствии с this answer, то numpy.cov функция (которая corrcoef использует внутренне, я полагаю) возвращает матрицу 2х2, каждый из которых содержит определенную ковариации:

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] 

Для справки, вот некоторые выдержки из двух функций, которые вы уже пробовали. Похоже, что они выполняют совершенно разные вещи.

Октава:

— 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 (а, б)' возвращает массив 2х2 поплавков, и я не знаю, как что связано с корреляцией. – Crystal

+0

или попробуйте просто получить [Pearson's r] (http://docs.scipy.org/doc/scipy-0.12.0/reference/generated/scipy.stats.pearsonr.html) – Rasman

+0

или [это] (http: /docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html) – Rasman

Смежные вопросы