2016-05-07 3 views
4

Я посмотрел this question, но на самом деле он не дал мне никаких ответов.Интерпретация (и сравнение) вывода из numpy.correlate

По существу, как я могу определить, существует или нет сильная корреляция с использованием np.correlate? Я ожидаю такой же результат, как и у модели Matlab xcorr, с опцией coeff, которую я могу понять (1 - сильная корреляция с запаздыванием l и 0 - отсутствие корреляции при лаге l), но np.correlate производит значения больше 1, даже если вход векторы были нормализованы между 0 и 1.

Пример входных данных

import numpy as np 
x = np.random.rand(10) 
y = np.random.rand(10) 

np.correlate(x, y, 'full') 

Это дает следующий результат:

array([ 0.15711279, 0.24562736, 0.48078652, 0.69477838, 1.07376669, 
    1.28020871, 1.39717118, 1.78545567, 1.85084435, 1.89776181, 
    1.92940874, 2.05102884, 1.35671247, 1.54329503, 0.8892999 , 
    0.67574802, 0.90464743, 0.20475408, 0.33001517]) 

Как я могу сказать, что такое сильная корреляция, а что слабое, если я не знаю, насколько максимально возможное значение корреляции?

Другой пример:

In [10]: x = [0,1,2,1,0,0] 

In [11]: y = [0,0,1,2,1,0] 

In [12]: np.correlate(x, y, 'full') 
Out[12]: array([0, 0, 1, 4, 6, 4, 1, 0, 0, 0, 0]) 

Edit: Это было плохо задаваемый вопрос, но отмеченная ответ не ответил, что было предложено. Я думаю, что важно отметить то, что я нашел, когда вы копались в этой области, вы не можете сравнивать выходы от кросс-корреляции. Другими словами, было бы нецелесообразно использовать выходы из кросс-корреляции, чтобы сказать сигнал x лучше коррелирован с сигналом y чем сигнал z. Кросс-корреляция не предоставляет такой вид информации

+0

Из того, что я прочитал о ['xcorr'] (http://de.mathworks.com/help/signal/ref/xcorr.html?requestedDomain=www.mathworks.com), вывод не нормирован на [0,1]. Кажется, что он идентичен 'numpy.correlate'. –

+0

@ ChristophTerasa Извините, я имел в виду 'xcorr' с опцией' coeff'. Вопрос исправлен. – RockJake28

ответ

7

numpy.correlate является под -документирован. Я думаю, что мы можем понять это. Давайте начнем с вашего образца случая:

>>> import numpy as np 
>>> x = [0,1,2,1,0,0] 
>>> y = [0,0,1,2,1,0] 
>>> np.correlate(x, y, 'full') 
array([0, 0, 1, 4, 6, 4, 1, 0, 0, 0, 0]) 

Эти цифры являются кросс-корреляции для каждого из возможных запаздывает. Чтобы сделать это более ясным, давайте число лагов выше корреляций:

>>> np.concatenate((np.arange(-5, 6)[None,...], np.correlate(x, y, 'full')[None,...]), axis=0) 
array([[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], 
     [ 0, 0, 1, 4, 6, 4, 1, 0, 0, 0, 0]]) 

Здесь мы можем видеть, что кросс-корреляция достигает свой пик на лаге -1. Если вы посмотрите на x и y выше, это имеет смысл: он сдвигает y влево на одно место, точно соответствует x.

Чтобы убедиться в этом, давайте попробуем еще раз, на этот раз сдвигая y дальше:

>>> y = [0, 0, 0, 0, 1, 2] 
>>> np.concatenate((np.arange(-5, 6)[None,...], np.correlate(x, y, 'full')[None,...]), axis=0) 
array([[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], 
     [ 0, 2, 5, 4, 1, 0, 0, 0, 0, 0, 0]]) 

Теперь пики корреляции при лаге -3, а это означает, что лучший матч между x и y происходит, когда y является сдвинутый влево на 3 места.

+1

Но учитывая максимальное соотношение 6 в первом примере и 5 во втором, как узнать, являются ли эти сильные корреляции? Я знаю, что вы можете сказать, что это точка задержки, в которой они наиболее коррелируют, и я знаю, что соотношение 6 сильнее, чем соотношение 5, но является ли соотношение 6 сильным? Является ли соотношение 5 сильным? – RockJake28

+1

Для этого вам потребуется [_normalized_ cross -корреляция] (https://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation). Существует [предлагаемый патч] (https://github.com/numpy/numpy/issues/2310), который добавит это к numpy, но патч не был принят. – John1024

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