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