参考 S.-J. Kim, K. Koh, S. Boyd, and D. Gorinevsky “l_1 Trend Filtering” SIAM Review, problems and techniques section, 51(2):339–360, May 2009
趋势滤波(Trend Filtering)
假设时间序列y t , t = 1 , … , n y_t,t=1,\dots,nyt,t=1,…,n由缓慢变化的趋势(Trend)x t x_txt和快速变化的噪声v t v_tvt组成。趋势滤波的目的是从时间序列y t y_tyt中估计趋势x t x_txt。趋势滤波(Trend Filtering)可以看作一个具有两个目标的优化问题:我们希望x t x_txt平滑,同时希望v t v_tvt尽可能地小。
l 1 l_1l1趋势滤波
l 1 l_1l1趋势估计问题:
minimize 1 2 ∥ y − x ∥ 2 2 + λ ∥ D x ∥ 1 \text{minimize}~\frac{1}{2}\|y-x\|_2^2+\lambda \|Dx\|_1minimize 21∥y−x∥22+λ∥Dx∥1
其中λ > 0 \lambda >0λ>0是正则参数,控制x t x_txt的平滑度和v t v_tvt的大小之间的折中,D DD是二阶差分矩阵,是一个托普利兹矩阵,第一行是[ 1 − 2 1 0 ⋯ 0 ] [1 ~-2 ~1~0~\cdots~0][1 −2 1 0 ⋯ 0]。
代码如下:
% 加载时间序列数据
y = csvread('snp500.txt'); % 需要在CVX示例库处下载
n = length(y);
% 构造二阶差分矩阵
e = ones(n,1);
D = spdiags([e -2*e e], 0:2, n-2, n);
% 设置正则参数
lambda = 50;
% 求解l1趋势滤波问题、
cvx_begin
variable x(n)
minimize( 0.5*sum_square(y-x)+lambda*norm(D*x,1) )
cvx_end
% 画出估计的趋势和原始信号
figure(1);
plot(1:n,y,'k:','LineWidth',1.0); hold on;
plot(1:n,x,'b-','LineWidth',2.0); hold off;
xlabel('date'); ylabel('log price');

版权声明:本文为qq_32591057原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。