Contents

互相關(cross correlation)

在瞭解卷積(convolution),就可以來談互相關(cross correlation)的概念了。首先,我們知道卷積是一種運算方式,可以把函式 $f$ 與 $g$ 翻轉、相乘並積分,那麼這種運算方式可以告訴我們什麼呢?目前最常見的卷積運算用於機器學習,也就是卷積神經網絡(Convolutional Neural Network,CNN),利用核(Kernel,特徵矩陣)提取出圖片的邊緣、模糊處理等。然而,互相關卻是另外一種運算方式。

Mathematical Definition

對於連續(continuous)函數: $$ (f * g)(t) = \int_{-\infty}^{\infty} f(\tau) \overline{g(t + \tau)} d\tau $$ 對於離散(discrete)函數: $$ (f * g)[n] = \sum_{m=-\infty}^{\infty} f[m] g^*[n + m] $$

其中 $t, n$ 稱為移位(displacement)或滯後(lag),而 $\overline{g}$ 與 $g^*$ 則是 $g$ 的負共軛,若: $$ g(t)\in \mathbb{R},\quad \forall t\in \mathbb{R} $$ $$ g[n]\in \mathbb{R},\quad \forall n\in \mathbb{Z} $$

也就是 $g$ 只有實部的話,則 $\overline{g}, g^*=g$。足以看見,互相關與卷積相比只差了一個負號,也就是取消了翻轉 $g$ 的步驟!下面以 Python 展示離散函數的互相關運算:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np
from scipy import signal

f = np.array([1, 2, 3, 4, 5])
g = np.array([1, 2, 3, 4, 5])

correlation = signal.correlate(f, g, mode='full')
lags = signal.correlation_lags(len(f), len(g))

print("Corr:", correlation)
print("Lags:", lags)
>>> Corr: [ 5 14 26 40 55 40 26 14  5]
>>> Lags: [-4 -3 -2 -1  0  1  2  3  4]

可以發現,當lag=0,也就是 $f$ 與 $g$ 完全對齊的時候, $f$ 與 $g$ 的互相關最大。因此互相關就是比較兩個函數並計算出他們的相似程度,在最相似的點其互相關值最高。

References