HP滤波

目的

HP 滤波是一种分解信号的低频趋势与高频部分的滤波方法:$y_t = g_t + c_t$,其中$y$代表初始信号,$g$代表信号的低频趋势,$c$代表高频的周期或噪声

优化函数

$min_g\sum_i^N(y_i-g_i)^2+\lambda\sum_i^{N-2}((g_{i+2}-g_{i+1})-(g_{i+1}-g_i))^2$

$\lambda$被称为光滑函数,取0时,该方法退化成最小二乘法,趋近于无限时,趋势接近线性函数,即越大越光滑

函数的前半部分刻画了对原序列的跟踪程度,后半部分刻画了所求趋势的光滑程度

后半部分可看做一个二阶差分方程,即可以用矩阵来表示信号的差分

pPZtCi8.png

简单记为$\nabla^2g=Dg$

由此可将问题转化为矩阵形式$min_g||y-g||_2^2+\lambda||Dg||_2^2$

求梯度,得$g=(I+\lambda D^TD)^{-1}y$

Python实现

1
2
3
4
5
6
7
8
9
10
11
12
13
def HP(self, y, lamb=100):
def D_matrix(N):
D = np.zeros((N - 1, N))
D[:, 1:] = np.eye(N - 1)
D[:, :-1] -= np.eye(N - 1)
return D

N = len(y)
D1 = D_matrix(N)
D2 = D_matrix(N - 1)
D = np.matmul(D2, D1)
g = np.matmul(np.linalg.inv((np.eye(N)+lamb*np.matmul(D.T, D))), y)
return g

使用评价

处理完全成周期的数据还不错,但一旦有多余未成一个周期的几项,该方法无法将其识别为一个不完整的周期,对曲线的方向造成影响

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023 J-sycamore