python/correlation.php 2015-10-05
Correlation
Everyone seems to have a different opinion on how cross correlation is to be normalized. This is mine:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
def correlate(a, v, mode='valid', ddof=0, norm=True):
""" (normalized) cross correlation """
a = np.array(a)
v = np.array(v)
if len(a)<len(v):
a,v = v,a
if norm:
a = a - a.mean()
v = v - v.mean()
# zero padding of a, c is return vector
if mode=='full': # return len(a) + len(v) -1 values
c = np.empty(len(a)+len(v)-1)
a = np.concatenate((np.zeros(len(v)-1), a, np.zeros(len(v)-1)))
elif mode=='same': # return len(a) values
c = np.empty(len(a))
a = np.concatenate((np.zeros((len(v)-1)//2), a, np.zeros(len(v)-(len(v)-1)//2)))
elif mode=='valid': # return len(a)-len(v)+1 values
c = np.empty(len(a)-len(v)+1)
pass
else:
print("error, do not know mode: {}".format(mode))
# correlate
for i in range(len(c)):
print (a.shape, v.shape, a[i:i+len(v)].shape, c.shape)
c[i] = np.dot(a[i:i+len(v)], v)
if norm:
c[i] /= np.std(a[i:i+len(v)])*np.std(v)*(len(v)-ddof)
return c