Интерпретация (и сравнение) вывода из numpy.correlate

Я просмотрел этот вопрос, но он не т действительно дал мне какие-либо ответы.

По сути, как я могу определить, существует ли сильная корреляция или нет, используя np.correlate? Я ожидаю того же результата, что и от xcorr в Matlab с опцией 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])

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


person JakeCowton    schedule 07.05.2016    source источник
comment
Из того, что я прочитал о xcorr, вывод также не нормализуется до [0,1]. Кажется, он ведет себя так же, как numpy.correlate.   -  person Jan Christoph Terasa    schedule 08.05.2016
comment
@ChristophTerasa извините, я имел в виду xcorr с опцией coeff. Вопрос исправлен.   -  person JakeCowton    schedule 08.05.2016


Ответы (1)


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 позиции.

person John1024    schedule 07.05.2016
comment
Но, учитывая максимальную корреляцию 6 в первом примере и 5 во втором, как узнать, являются ли эти корреляции сильными? Я знаю, что вы можете сказать, что это точка отставания, в которой они наиболее коррелированы, и я знаю, что корреляция 6 сильнее, чем корреляция 5, но является ли корреляция 6 сильной? Является ли корреляция 5 сильной? - person JakeCowton; 08.05.2016
comment
Для этого вам понадобится нормализованная взаимная корреляция< /а>. Существует предложенный патч, который добавит это в numpy, но патч не был действовал. - person John1024; 08.05.2016