Возможно ли, что numpy.correlate не соответствует данной формуле?

В документации команды numpy.correlate говорится, что взаимная корреляция двух массивов вычисляется как общее определение для обработки сигналов следующим образом:

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

Похоже, это не так. Похоже, корреляция перевернута. Это означало бы, что либо знак в последнем члене формулы меняется

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

или что два входных вектора находятся в неправильном порядке. Простая реализация данной формулы будет:

x = [1.0, 2.0, 3.0]
y = [0.0, 0.5, 2.0]
y_padded = numpy.append( [0.0, 0.0] , y)
y_padded = numpy.append(y_padded, [0.0, 0.0] )

crosscorr_numpy = numpy.correlate(x, y, mode='full')

crosscorr_self = numpy.zeros(5)
for k in range(5):
    for i in range(3):
        crosscorr_self[k] += x[i] * y_padded[i+k]

print crosscorr_numpy
print crosscorr_self

Вы можете легко увидеть, что результирующий вектор имеет неправильный порядок. Я был очень сбит с толку, когда это не дало ожидаемых результатов, и я почти уверен (после обсуждения этого с моими коллегами), что это ошибка.


person Florian Fahrenberger    schedule 03.09.2012    source источник


Ответы (1)


Какую версию NumPy вы используете? На моей коробке Debian Squeeze:

In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.4.1'

Когда я запускаю ваш пример, я получаю:

/usr/lib/pymodules/python2.6/numpy/core/numeric.py:677: DeprecationWarning: 
The current behavior of correlate is deprecated for 1.4.0, and will be removed
for NumPy 1.5.0.

The new behavior fits the conventional definition of correlation: inputs are
never swapped, and the second argument is conjugated for complex arrays.
  DeprecationWarning)
[ 2.   4.5  7.   1.5  0. ]
[ 0.   1.5  7.   4.5  2. ]

так что вы можете быть правы насчет (неправильного) поведения, но, вероятно, оно было исправлено в новой версии.

person Taro Sato    schedule 03.09.2012