У меня есть два массива 1D, и я хочу видеть их взаимосвязи. Какую процедуру следует использовать в numpy? Я использую numpy.corrcoef(arrayA, arrayB)
и numpy.correlate(arrayA, arrayB)
, и оба дают некоторые результаты, которые я не могу понять или понять. Может ли кто-нибудь пролить свет на то, как понимать и интерпретировать эти численные результаты (предпочтительно, используя пример)? Спасибо.
Как интерпретировать значения numpy.correlate и numpy.corrcoef?
Ответ 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')
Это вернет функцию гребня/шаха с максимальным значением, когда оба набора данных перекрываются. Поскольку это автокорреляция, между двумя входными сигналами не будет "отставания". Таким образом, максимум корреляции является 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()
Найдите индекс вторых пиков. Из этого вы можете вернуться назад, чтобы найти частоту.
first_min_index = np.argmin(hz_a_autocorrelation)
second_max_index = np.argmax(hz_a_autocorrelation[first_min_index:])
frequency = 1/second_max_index