Pourquoi NUMPY corrélation et corrcoef retour des valeurs différentes et comment faire pour “normaliser” un corrélat dans “plein” mode?
Je suis en train d'utiliser certaines des Analyses de Séries chronologiques en Python, en utilisant Numpy.
J'ai deux un peu moyennes séries, avec 20k valeurs de chacun et je veux vérifier le glissement de corrélation.
La corrcoef me donne en sortie une Matrice d'auto-corrélation/coefficients de corrélation. Rien d'utile par lui-même, dans mon cas, comme l'un de la série contient un décalage.
Le corrélat de la fonction (en mode="full") renvoie un 40k liste des éléments qui NE ressemblent le genre de résultat je vise (la valeur de crête est que loin du centre de la liste à mesure que le Décalage indiquerait), mais les valeurs sont toutes bizarres - jusqu'à 500, lorsque je m'attendais à quelque chose de -1 à 1.
Je ne peux pas diviser par la valeur max; je sais que le max de corrélation n'est pas 1.
Comment ai-je pu normaliser le "cross-corrélation (corrélation dans le "plein" en mode) de sorte que le retour de valeurs de la corrélation sur chaque gal étape à la place de ces très grandes, étrange valeurs?
OriginalL'auteur John Anderson | 2011-04-12
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la recherche de corrélation croisée normalisée. Cette option n'est pas encore disponible dans Numpy, mais un patch est en attente d'examen qui ne fonctionne tout simplement ce que vous voulez. Il ne devrait pas être trop difficile à appliquer, je pense. La plupart du patch est juste doc chaîne de trucs. Les seules lignes de code que l'on ajoute sont
où a et v sont la saisie des tableaux numpy de qui vous êtes de trouver de la corrélation croisée. Il ne devrait pas être difficile à ajouter dans votre propre distribution de Numpy ou tout simplement faire une copie de la corrélation de la fonction et ajouter les lignes. Je voudrais faire la dernière, personnellement, si j'ai choisi d'aller dans cette voie.
Un autre, tout à fait peut-être mieux, l'alternative est de faire de la normalisation pour les vecteurs en entrée avant de l'envoyer à corréler. C'est à vous de quelle manière vous souhaitez le faire.
Par la manière, ce ne semble pas être le bon la normalisation par la Page Wikipedia sur le cross-corrélation sauf pour les divisant par
len(a)
plutôt que(len(a)-1)
. J'ai l'impression que la différence est semblable à la l'écart type de l'échantillon par rapport à l'échantillon écart-type et vraiment ne fait pas beaucoup de différence à mon avis.Dans le cas où quelqu'un est à la recherche pour elle, le patch (toujours en attente) est maintenant sur github.
Par la manière de... "en divisant par
len(a)
" retourne 1.0 pour autocorrélation (à zero lag) ce qui est correct. En divisant parlen(a)-1
retourne légèrement plus grandes valeurs dans mes tests (avec le bruit gaussien).Juste pour de plus amples référence, la fonction
xcorr
dans MATLAB fait une autre normalisation lors de l'utilisation de la scaleopt='coef', c'est à direxcorr(a, b, 'coeff') = xcorr(a, b) / (norm(a) * norm(b))
. Voir stackoverflow.com/a/39151702/5392420 pour plus de détailsPourquoi avez-vous normaliser
a
en divisant parlen(a)
et de ne pas le faire pourv
?OriginalL'auteur Justin Peel
Selon cette les diapositives, je vous propose de faire de cette façon:
OriginalL'auteur Oli Blum