Python 中的归一化互相关

Normalized Cross-Correlation in Python

最近几天我一直在努力计算两对向量(x 和 y)的自由度,参考 Chelton (1983) 是:

degrees of freedom according to Chelton(1983)

而且我找不到使用 np.correlate 计算归一化互相关函数的正确方法, 我总是得到一个不在 -1、1 之间的输出。

有什么简单的方法可以将互相关函数归一化以计算两个向量的自由度吗?

好问题。没有直接的方法,但你可以在使用 np.correlate 之前 "normalize" 输入向量,这样合理的值将在 [-1,1]:

的范围内返回

这里我定义了信号处理教科书中一般定义的相关性。

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

代码:如果 a 和 b 是向量:

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

参考文献:

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

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

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

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

c = b/a

这是我的想法:但它会将其归一化为 0-1

函数numpy.corrcoef直接执行此操作,即计算 x 和 y 的协方差矩阵,然后通过 x 的标准差和 y 的标准差对其进行归一化。

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

这是 Pearson 相关系数,范围为 +/-1。

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

MATLAB 标准化 cross-correlation 在 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')