Python 归一化一维互相关
Python normalizing 1D cross correlation
我已经编写了一些 Python 代码来模拟 MATLAB xcorr
互相关函数:
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))
将不同标度类型的值与 MATLAB 实现进行比较时,我得到了相同的值,所以这似乎是正确的
我想补充的另一件事是能够对互相关值进行归一化,因此峰值不会超过 1.0
,并且谷值不会低于 -1.0
coeff
已经标准化,所以我不担心。但是,其他比例类型可以超过 -1/1 范围。
我已经尝试了几件事:
- 在我的函数末尾添加
corr /= max(corr)
以规范化 corr
,无论选择哪个比例选项。这样可以检查上限,但我不确定这是否正确处理了下限
- 将
corr /= np.sqrt(np.dot(x, x) * np.dot(y, y))
添加到所有选项的函数末尾,但这似乎使我的值远离 1.0
标准化 none
、biased
和 unbiased
比例选项的正确方法是什么? MATLAB 没有这方面的功能,并且 Google 没有为 biased/unbiased 互相关估计的归一化提供任何结果。
以下内容应该符合您的要求,但我不确定它是否具有统计意义:
corr /= max(np.abs(corr))
我很困惑。 none
表示没有归一化,biased
和 unbiased
表示适当的归一化,因此输出样本对应于适当的估计量。 “我应该将什么归一化应用于相关性的有偏估计以使其限制为 [-1, 1]” 是没有意义的,因为这样估计就不再是有偏估计了,它会是别的东西。唯一具有此 属性 的估计器(在这群人中)是相关系数(Pearson’s coefficient 的信号处理变体),这就是 coeff
对应的。
这个实现就这样很好。任何在 [-1, 1] 区间内寻找数字的人都知道他们应该通过 np.corrcoef()
.
询问相关系数
我已经编写了一些 Python 代码来模拟 MATLAB xcorr
互相关函数:
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))
将不同标度类型的值与 MATLAB 实现进行比较时,我得到了相同的值,所以这似乎是正确的
我想补充的另一件事是能够对互相关值进行归一化,因此峰值不会超过 1.0
,并且谷值不会低于 -1.0
coeff
已经标准化,所以我不担心。但是,其他比例类型可以超过 -1/1 范围。
我已经尝试了几件事:
- 在我的函数末尾添加
corr /= max(corr)
以规范化corr
,无论选择哪个比例选项。这样可以检查上限,但我不确定这是否正确处理了下限 - 将
corr /= np.sqrt(np.dot(x, x) * np.dot(y, y))
添加到所有选项的函数末尾,但这似乎使我的值远离 1.0
标准化 none
、biased
和 unbiased
比例选项的正确方法是什么? MATLAB 没有这方面的功能,并且 Google 没有为 biased/unbiased 互相关估计的归一化提供任何结果。
以下内容应该符合您的要求,但我不确定它是否具有统计意义:
corr /= max(np.abs(corr))
我很困惑。 none
表示没有归一化,biased
和 unbiased
表示适当的归一化,因此输出样本对应于适当的估计量。 “我应该将什么归一化应用于相关性的有偏估计以使其限制为 [-1, 1]” 是没有意义的,因为这样估计就不再是有偏估计了,它会是别的东西。唯一具有此 属性 的估计器(在这群人中)是相关系数(Pearson’s coefficient 的信号处理变体),这就是 coeff
对应的。
这个实现就这样很好。任何在 [-1, 1] 区间内寻找数字的人都知道他们应该通过 np.corrcoef()
.