correlations python numpy scipy correlation

matrix of correlations in python



¿Cómo interpretar los valores de numpy.correlate y numpy.corrcoef? (2)

Tengo dos matrices 1D y quiero ver sus interrelaciones. ¿Qué procedimiento debo usar en Numpy? Estoy usando numpy.corrcoef(arrayA, arrayB) y numpy.correlate(arrayA, arrayB) y ambos están dando algunos resultados que no puedo comprender ni comprender. ¿Puede alguien arrojar luz sobre cómo entender e interpretar esos resultados numéricos (preferiblemente usando un ejemplo)? Gracias.


numpy.correlate simplemente devuelve la correlación cruzada de dos vectores.

si necesita comprender la correlación cruzada, comience con http://en.wikipedia.org/wiki/Cross-correlation .

Un buen ejemplo podría verse al observar la función de autocorrelación (un vector correlacionado cruzado consigo mismo):

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

Esto devolverá una función comb / shah con un máximo cuando ambos conjuntos de datos se superponen. Como esto es una autocorrelación, no habrá "retraso" entre las dos señales de entrada. El máximo de la correlación es, por tanto, vector.size-1.

si solo desea el valor de la correlación para la superposición de datos, puede usar mode=''valid'' .


Solo puedo comentar sobre numpy.correlate en este momento. Es una herramienta poderosa. Lo he usado para dos propósitos. El primero es encontrar un patrón dentro de otro patrón:

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 !

El segundo uso que he usado (y cómo interpretar el resultado) es para la detección de frecuencia:

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

Encuentra el índice de los segundos picos. A partir de esto, puede volver atrás para encontrar la frecuencia.

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