Подтвердить что ты не робот

Как интерпретировать значения numpy.correlate и numpy.corrcoef?

У меня есть два массива 1D, и я хочу видеть их взаимосвязи. Какую процедуру следует использовать в numpy? Я использую numpy.corrcoef(arrayA, arrayB) и numpy.correlate(arrayA, arrayB), и оба дают некоторые результаты, которые я не могу понять или понять. Может ли кто-нибудь пролить свет на то, как понимать и интерпретировать эти численные результаты (предпочтительно, используя пример)? Спасибо.

4b9b3361

Ответ 1

numpy.correlate просто возвращает взаимную корреляцию двух векторов.

если вам нужно понять кросс-корреляцию, тогда начните с http://en.wikipedia.org/wiki/Cross-correlation.

Хороший пример можно увидеть, посмотрев на функцию автокорреляции (вектор, перекрестно коррелированный с самим собой):

import numpy as np

# create a vector
vector = np.random.normal(0,1,size=1000) 

# insert a signal into vector
vector[::50]+=10

# perform cross-correlation for all data points
output = np.correlate(vector,vector,mode='full')

Code graph

Это вернет функцию гребня/шаха с максимальным значением, когда оба набора данных перекрываются. Поскольку это автокорреляция, между двумя входными сигналами не будет "отставания". Таким образом, максимум корреляции является vector.size-1.

если вам нужно только значение корреляции для перекрывающихся данных, вы можете использовать mode='valid'.

Ответ 2

Я могу только прокомментировать numpy.correlate на данный момент. Это мощный инструмент. Я использовал его для двух целей. Первый - найти шаблон внутри другого шаблона:

import numpy as np
import matplotlib.pyplot as plt

some_data = np.random.uniform(0,1,size=100)
subset = some_data[42:50]

mean = np.mean(some_data)
some_data_normalised = some_data - mean
subset_normalised = subset - mean

correlated = np.correlate(some_data_normalised, subset_normalised)
max_index = np.argmax(correlated)  # 42 !

Второе использование, которое я использовал для (и как интерпретировать результат), используется для определения частоты:

hz_a = np.cos(np.linspace(0,np.pi*6,100))
hz_b = np.cos(np.linspace(0,np.pi*4,100))

f, axarr = plt.subplots(2, sharex=True)

axarr[0].plot(hz_a)
axarr[0].plot(hz_b)
axarr[0].grid(True)

hz_a_autocorrelation = np.correlate(hz_a,hz_a,'same')[round(len(hz_a)/2):]
hz_b_autocorrelation = np.correlate(hz_b,hz_b,'same')[round(len(hz_b)/2):]

axarr[1].plot(hz_a_autocorrelation)
axarr[1].plot(hz_b_autocorrelation)
axarr[1].grid(True)

plt.show()

три hz и два hz с автокорреляцией показывают ниже

Найдите индекс вторых пиков. Из этого вы можете вернуться назад, чтобы найти частоту.

first_min_index = np.argmin(hz_a_autocorrelation)
second_max_index = np.argmax(hz_a_autocorrelation[first_min_index:])
frequency = 1/second_max_index