2012-11-18 9 views
18

Ho due array 1D e voglio vedere le loro interrelazioni. Quale procedura dovrei usare in numpy? Sto usando numpy.corrcoef(arrayA, arrayB) e numpy.correlate(arrayA, arrayB) ed entrambi stanno dando dei risultati che non sono in grado di comprendere o capire. Qualcuno può per favore chiarire come interpretare e interpretare quei risultati numerici (preferibilmente usando un esempio)? Grazie.come interpretare i valori di numpy.correlate e numpy.corrcoef?

risposta

10

numpy.correlate restituisce semplicemente la correlazione incrociata di due vettori.

se è necessario comprendere la correlazione incrociata, quindi iniziare con http://en.wikipedia.org/wiki/Cross-correlation.

Un buon esempio potrebbe essere visto guardando la funzione di autocorrelazione (un vettore trasversale correlata con se stesso):

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

Ciò restituirà una funzione pettine/Shah con un massimo quando entrambi i set di dati si sovrappongono. Poiché si tratta di una autocorrelazione, non vi sarà alcun "ritardo" tra i due segnali di ingresso. Il massimo della correlazione è quindi vector.size-1.

se si desidera solo il valore della correlazione per i dati che si sovrappongono, è possibile utilizzare mode='valid'.

+1

è un vecchio, ma poiché ho la stessa domanda, non riesco a capire come vengo alla conclusione. Ho o non ho autocorrelazione sul rapporto? Come posso tradurre l'output? – hephestos

3

Al momento posso solo commentare numpy.correlate. È uno strumento potente. L'ho usato per due scopi. Il primo è quello di trovare un modello all'interno di un altro modello:

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 ! 

Il secondo uso L'ho usato per la (e come interpretare il risultato) è per il rilevamento della frequenza:

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

Trova l'indice dei secondi picchi. Da questo puoi tornare indietro per trovare la frequenza.

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