0

J'ai écrit un code Python pour émuler MATLABs fonction xcorr des corrélations croisées:Python normalisant 1D croix corrélation

def xcorr(x, y, scale='none'): 
    # Pad shorter array if signals are different lengths 
    if x.size > y.size: 
     pad_amount = x.size - y.size 
     y = np.append(y, np.repeat(0, pad_amount)) 
    elif y.size > x.size: 
     pad_amount = y.size - x.size 
     x = np.append(x, np.repeat(0, pad_amount)) 

    corr = np.correlate(x, y, mode='full') # scale = 'none' 
    lags = np.arange(-(x.size - 1), x.size) 

    if scale == 'biased': 
     corr = corr/x.size 
    elif scale == 'unbiased': 
     corr /= (x.size - abs(lags)) 
    elif scale == 'coeff': 
     corr /= np.sqrt(np.dot(x, x) * np.dot(y, y)) 

Je reçois les mêmes valeurs lorsque l'on compare les valeurs des différents types d'échelle pour la mise en œuvre de MATLABs, donc cela semble correct

Une chose supplémentaire que je voudrais ajouter est la capacité de normaliser les valeurs de corrélation croisée si les pics ne dépassent pas 1.0, et les vallées DonT descendre en dessous -1.0

coeff est déjà normalisé, donc je ne suis pas inquiet à ce sujet. Cependant, les autres types d'échelle peuvent dépasser les limites -1/1.

J'ai essayé deux choses:

  1. Ajout corr /= max(corr) à la fin de ma fonction de normaliser corr quelle que soit l'option choisie est échelle. Cela permet de maintenir la borne supérieure en échec, mais je ne suis pas sûr que cela gère correctement la limite inférieure
  2. Ajout corr /= np.sqrt(np.dot(x, x) * np.dot(y, y)) à la fin de ma fonction pour toutes les options, mais cela semble écraser mes valeurs loin de 1,0

Quelle est la bonne façon de normaliser none, biased, et unbiased options d'échelle? MATLAB n'a pas la fonctionnalité pour cela, et Google ne donne aucun résultat pour la normalisation des estimations de corrélation croisée biaisée/non biaisée.

Répondre

0

Je suis confus. none implique aucune normalisation, et biased et unbiased impliquent la normalisation appropriée afin que les échantillons de la sortie correspondent aux estimateurs appropriés. Cela n'a pas de sens que "quelle normalisation devrais-je appliquer à une estimation biaisée de la corrélation de sorte qu'elle soit limitée à [-1, 1]", car alors l'estimation ne serait plus une estimation biaisée, ce serait autre chose. Le seul estimateur (parmi ce groupe) qui a cette propriété est le coefficient de corrélation (la variante de traitement de signal de Pearson’s coefficient), qui correspond à coeff.

Cette implémentation est correcte telle quelle. Quiconque recherche des nombres dans l'intervalle [-1, 1] sait qu'il doit demander les coefficients de corrélation via coeff.

0

qui suit devrait faire ce que vous cherchez, mais je ne suis pas sûr si elle est statistiquement valide:

corr /= max(np.abs(corr))