Понимание результатов 1D np.correlate

Я пытаюсь определить сходство между двумя временными рядами 1D, используя numpy.correlate.

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

Код:

import numpy as np
import matplotlib.pyplot as plt

#sample arrays to correlate
arr_1 = np.arange(1, 101) #[1, 2, 3, ..... 100]
arr_2 = np.concatenate([np.zeros(50), np.arange(50, 101)]) #[0, 0, ... 50, 51 ... 100]

cross_corr = np.correlate(arr_1, arr_2, "same")

plt.plot(list(cross_corr))

введите здесь описание изображения

Этот график вызывает у меня пару вопросов. Насколько я понимаю, взаимная корреляция зависит от операции свертки (по сути, интеграл внутреннего произведения двух сигналов с учетом некоторого отставания).

  1. Почему сигнал корреляции (выше) неуклонно увеличивается от (0, 50), если arr_2 заполнен нулями от индекса 0 до 50?
  2. Как я могу установить задержку для операции свертки. Из numpy docs я не могу найти параметр, который позволяет мне настроить отставание.
  3. Пик на 50 связан с тем, что оба сигнала выстраиваются по индексу 50, но почему тогда корреляция неуклонно снижается после этого? Если два сигнала совпадают, то не должна ли корреляция увеличиваться?
  4. Корреляция значима только в том случае, если ее значение больше 2/sqrt(n - abs(k)). Где n — количество выборок, а k — задержка. Как значимость корреляции может повлиять на график, показанный выше?

person Sreehari R    schedule 10.06.2019    source источник


Ответы (1)


Кажется, вы запутались в том, что именно выводится. Документации немного не хватает, если честно. На выходе вычисляется корреляция между двумя вашими массивами для каждой задержки. Средняя точка — это место, где отставание составляет 0 и где корреляция самая высокая.

К вашему сведению, ваши два массива имеют разный размер. arr_1 имеет длину 100, а arr_2 имеет длину 101. Не уверен, что это было сделано намеренно.

person busybear    schedule 10.06.2019
comment
Спасибо за быстрый ответ. Разве средняя точка не соответствует x = 50, так что тогда задержка не будет равна 50, а не 0 на пике? - person Sreehari R; 10.06.2019
comment
Идея состоит в том, что вы сдвигаете -50 на 50. Таким образом, 0 запаздывания находится посередине. - person busybear; 10.06.2019