Python 正则化 1D 互相关

4

我写了一些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的范围。

我尝试了几种方法:

  1. 在函数末尾添加corr /= max(corr)来规范化corr,无论选择哪种比例选项都可以。这样就可以控制上限,但我不确定是否正确处理下限
  2. 为所有选项在函数末尾添加corr /= np.sqrt(np.dot(x, x) * np.dot(y, y)),但这似乎将我的值压缩得远离1.0

什么是规范化nonebiasedunbiased比例选项的正确方法?MATLAB没有这个功能,谷歌也没有找到任何关于偏斜/非偏斜交叉相关估计规范化的结果。

2个回答

0

以下代码应该能实现你想要的功能,但我不确定它是否在统计上是有效的:

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

0

我有些困惑。 none 表示不进行标准化,而 biasedunbiased 则表示适当的标准化,以便输出样本对应于适当的估计量。问“我应该对偏相关估计应用什么标准化,使其限制在[-1, 1]之间”是没有意义的,因为那么估计就不再是偏估计了,它会变成其他东西。这些中唯一具有此属性的估计量是相关系数(Pearson's coefficient 的信号处理变体),这就是 coeff 对应的内容。

这个实现已经很好了。任何希望得到[-1, 1]区间内数字的人都知道他们应该通过 np.corrcoef() 来获取相关系数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接