Normalized Cross-Correlation in Python

I have been struggling the last days trying to compute the degrees of freedom of two pair of vectors (x and y) following reference of Chelton (1983) which is:

degrees of freedom according to Chelton(1983)

and I can't find a proper way to calculate the normalized cross correlation function using np.correlate, I always get an output that it isn't in between -1, 1.

Is there any easy way to get the cross correlation function normalized in order to compute the degrees of freedom of two vectors?

Upvotes: 27

Views: 56109

Answers (4)

Dan Boschen
Dan Boschen

Reputation: 302

If you are interested in the normalized correlation when the sequences are aligned (not the correlation function of the correlation versus time offsets), the function numpy.corrcoef does this directly, as computing the covariance matrix of x and y and then normalizing it by the standard deviation of x and the standard deviation of y.

https://numpy.org/doc/stable/reference/generated/numpy.corrcoef.html#numpy.corrcoef

This is the Pearson correlation coefficient and will have a range of +/-1.

Upvotes: 1

Enes Zeybek
Enes Zeybek

Reputation: 91

MATLAB ➜ xcorr(a, b, 'normalized');

MATLAB normalized cross-correlation implementation in Python.

import numpy as np
a = [1, 2, 3, 4]
b = [2, 4, 6, 8]
norm_a = np.linalg.norm(a)
a = a / norm_a
norm_b = np.linalg.norm(b)
b = b / norm_b
c = np.correlate(a, b, mode = 'full')

Upvotes: 9

DropKickCombo
DropKickCombo

Reputation: 11

a = np.dot(abs(var1),abs(var2),'full')

b = np.correlate(var1,var2,'full')

c = b/a

This is my idea: but it will normalize it 0-1

Upvotes: -1

seralouk
seralouk

Reputation: 33147

Nice Question. There is no direct way but you can "normalize" the input vectors before using np.correlate like this and reasonable values will be returned within a range of [-1,1]:

Here i define the correlation as generally defined in signal processing textbooks.

c'_{ab}[k] = sum_n a[n] conj(b[n+k])

CODE: If a and b are the vectors:

a = (a - np.mean(a)) / (np.std(a) * len(a))
b = (b - np.mean(b)) / (np.std(b))
c = np.correlate(a, b, 'full')

References:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.correlate.html

https://en.wikipedia.org/wiki/Cross-correlation

enter image description here

Upvotes: 23

Related Questions