2012-11-18 35 views
18

私は2つの1D配列を持っており、それらの相互関係を見たいと思います。 numpyで使用する手順は?私はnumpy.corrcoef(arrayA, arrayB)numpy.correlate(arrayA, arrayB)を使用していますが、どちらも私が理解できない、または理解できない結果を示しています。誰かが数値的な結果を理解し、解釈する方法を説明してもらえますか?ありがとう。numpy.correlateとnumpy.corrcoefの値を解釈する方法は?

答えて

10

numpy.correlateは、単に2つのベクトルの相互相関を返します。

相互相関を理解する必要がある場合は、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

これはときに最大と櫛/シャー関数が返され両方のデータセットが重複しています。これは自己相関であるため、2つの入力信号の間に「遅れ」はありません。したがって、相関の最大値はvector.size-1です。

重複するデータの相関値のみを使用する場合は、mode='valid'を使用できます。

+1

私は同じ質問があるので、私は結論にどのように来るのか理解できません。レポートに自己相関があるかどうか出力をどのように変換するのですか? – hephestos

3

私はただちにnumpy.correlateにコメントできます。それは強力なツールです。私は2つの目的のためにそれを使用しました。最初は別のパターン内側のパターンを見つけることである:

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

three hz and two hz with autocorrelation show beneath

2番目のピークのインデックスを検索します。これから、周波数を見つけるために作業することができます。

first_min_index = np.argmin(hz_a_autocorrelation) 
second_max_index = np.argmax(hz_a_autocorrelation[first_min_index:]) 
frequency = 1/second_max_index 
関連する問題