卷積(convolution)
Contents
卷積(convolution),又稱疊積、褶積或旋積,可以將函數 $f$ 與 $g$ 進行運算產生新函數。
Mathematical Definition
對於連續(continuous)函數: $$ (f \star g)(t) = \int_{-\infty}^{\infty} f(\tau) g(t - \tau) d\tau $$ 對於離散(discrete)函數: $$ (f \star g)[n] = \sum_{m=-\infty}^{\infty} f[m] g[n - m] $$ 其中 $t, n$ 稱為移位(displacement)或滯後(lag),若 $t, n=0$ 則 $(f * g)(0)$ 等於$f$與X軸反轉的 $g$ 的相乘積分或相乘加總,可以用一個簡單的 python 展示 $n=0$ 時的離散函數卷積:
|
|
Info
展示卷積運算的酷酷網站,phiresky.github.io/convolution-demo
做單次運算會得到一個值(value),但卷積並不只運算一次,還必須考量 $n\neq0$ 的其他情況。假設 $n=1$,則 $g(1-m)=g(-m+1)$,代表 $g$ 不僅對X軸反轉,還要向右移動一格:
|
|
但在上述例子中,一旦 $\left|n\right|>3$ 便沒有意義,因為$g$被平移超過三格後所對應到的$f$都會是0:
|
|
因此我們可以計算出 $\left|n\right|>3$ 情況下的新卷積函數:
|
|
Numpy
事實上 Python 的 Numpy 本身自帶convolve函式,可以計算$\left|n\right|\leq3$時的離散函數卷積:
|
|
Scipy
若希望提升計算速度,可以改用 Scipy,其fftconvolve函式利用快速傅立葉轉換將卷積運算複雜度由 $O(n^2)$ 降低至 $O(nlog(n))$,在資料量龐大時尤其明顯:
|
|
References
- 3Blue1Brown, But what is a convolution?
- 3Blue1Brown, Convolutions | Why X+Y in probability is a beautiful mess