web-dev-qa-db-fra.com

comment interpréter les valeurs numpy.correlate et numpy.corrcoef?

J'ai deux tableaux 1D et je veux voir leurs relations réciproques. Quelle procédure dois-je utiliser dans numpy? J'utilise numpy.corrcoef(arrayA, arrayB) et numpy.correlate(arrayA, arrayB) et les deux donnent des résultats que je ne suis pas en mesure de comprendre ou de comprendre. Quelqu'un peut-il, s'il vous plaît, nous expliquer comment comprendre et interpréter ces résultats numériques (de préférence à l'aide d'un exemple)? Merci.

23
khan

numpy.correlate renvoie simplement la corrélation croisée de deux vecteurs. 

si vous avez besoin de comprendre la corrélation croisée, commencez par http://en.wikipedia.org/wiki/Cross-correlation .

Un bon exemple peut être vu en regardant la fonction d’autocorrélation (un vecteur corrélé de manière croisée avec elle-même):

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

Cela retournera une fonction comb/shah avec un maximum lorsque les deux ensembles de données se chevauchent. Comme il s'agit d'une autocorrélation, il n'y aura pas de "retard" entre les deux signaux d'entrée. Le maximum de la corrélation est donc vector.size-1. 

si vous voulez uniquement la valeur de la corrélation pour les données qui se chevauchent, vous pouvez utiliser mode='valid'.

11
ebarr

Je peux seulement commenter sur numpy.correlate pour le moment. C'est un outil puissant. Je l'ai utilisé à deux fins. La première consiste à trouver un motif dans un autre motif:

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 !

La deuxième utilisation pour laquelle je l'ai utilisé (et comment interpréter le résultat) est pour la détection de fréquence:

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

Trouvez l'index des deuxièmes sommets. À partir de cela, vous pouvez revenir en arrière pour trouver la fréquence.

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

Si vous êtes perplexe sur le résultat de np.correlate of int vecteur, cela peut être dû à overflow :

>>> a = np.array([4,3,2,1,0,0,0,0,10000,0,0,0], dtype='int16')
>>> np.correlate(a,a[:4])
array([    30,     20,     11,      4,      0,  10000,  20000,  30000,
   -25536], dtype=int16)

Cet exemple explique également comment fonctionne le corrélat:

30 = 4 * 4 + 3 * 3 + 2 * 2 + 1 * 1
20 = 4 * 3 + 3 * 2 + 2 * 1 + 1 * 0
11 = 4 * 2 + 3 * 1 + 2 * 0 + 1 * 0
...
40000 = 4 * 10000 + 3 * 0 + 2 * 0 + 1 * 0
.__ apparaît comme 40000 - 2 ** 16 = -25536

0
Rainald62