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
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')
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'
.
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()
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
è 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