2012-11-18 1 views
18

두 개의 1D 어레이가 있고 그것들의 상호 관계를보고 싶습니다. numpy에서 어떤 절차를 사용해야합니까? numpy.corrcoef(arrayA, arrayB)numpy.correlate(arrayA, arrayB)을 사용하고 있으며 두 가지 모두 내가 이해하거나 이해할 수없는 결과를 제공하고 있습니다. 누군가가 수치 결과를 이해하고 해석하는 방법에 대해 알려줄 수 있습니까? 감사.numpy.correlate 및 numpy.corrcoef 값을 해석하는 방법은 무엇입니까?

답변

10

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'을 사용할 수 있습니다.

+1

나는 오래되었지만 동일한 질문이 있기 때문에 결론에 도달하는 방법을 이해할 수 없습니다. 보고서에 자기 상관이 있습니까? 출력을 어떻게 변환합니까? – hephestos

3

지금은 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 ! 

I는 그것을 사용한 초 사용 (및 결과의 해석 방법) 주파수 검출이다

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() 

three hz and two hz with autocorrelation show beneath

두 번째 봉우리의 색인을 찾습니다. 이것으로 주파수를 찾기 위해 다시 일할 수 있습니다.

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