STL:A Seasonal-Trend Decompositi
-
STL要处理的问题:如何将复杂时间序列的周期和趋势分解出来?
image.png -
STL的算法:
框架:给定一个周期内包含的点数,首先将周期回归出来,然后再将原始序列和周期分量做一次减法,得到去周期的分量(包含余项噪声),最后对该分量利用平滑进行去噪,得到趋势分量。余项分量则是用原始序列-周期分量-趋势分量。
学术版本:在实际设计算法的时候,为了追求精准、鲁棒,设计了多次循环的算法来计算得到更准确的周期分量、趋势分量、余项分量。
2.1 LOESS回归:
STL主要依赖LOESS方法来做回归,本小节首先介绍一下该非参数回归方法。
LOESS为局部加权非参数回归,做数学和算法相关工作的同学都知道“局部”的意思,它就是当你想回归一个点时,在该点的周围画一个圆,将邻居样本圈进来,之后利用邻居样本的加权求和得到目标点的回归值。更重要的是,回归每一个目标点的时候,对邻居样本的权重都不相同,这个就是局部的意思,每个点都不一样。那么非参数呢?它指的是没有假设数据样本应该服从什么样的关系,例如一般我们做回归会假设y=3x2这样的因变量-自变量关系,但是在非参数回归中,是没有这个的,它“局部”的回归得到目标点的回归值,不存在一个参数(如y=3x2中的3)应用全部的情况。
具体的,LOESS是怎么做的呢?首先假设有一个序列x1,x2,...xn,回归一个值x6时,
(1)以x6为中心确定一个区间,宽度q可灵活掌握;
(2)定义区间内邻居的权重,权重由权数函数确定;
(3)区间内的散点拟合直线或曲线,具体取决于参数d(d=1意味着直线,d=2意味着二阶)
(4)拟合之后得到目标点的值。
对序列中的每一个点都做这样的拟合,拟合后的数据就是loess回归的结果。
2.2 STL分解:
(1)首先展示STL的算法:
image.png
image.png
(2)然后解释其中的变量值:
image.png
整体上以上这些参数设置的时候,要理解STL能做周期和趋势分解的一个本质逻辑:之所以能做周期拟合,是因为其中做了子序列平滑,就是说把周期中每一个位置的点拿出来,因为是规律性的,所以原则上每一个子序列都应该是越平滑越好,那怎么才能尽可能得到一个平滑的回归线呢?那就是窗口取大一点,这样受局部影响才小。而做趋势拟合的时候就不一样了,窗口取太大会导致趋势被抑制,取太小会将周期和余项的分量回归进来,所以要取得“合适”,也参考以上的公式。至于除了这两个主要步骤之外,为什么做那么多次loess回归,也就是通过多次平滑、回归,能越来越精确的将趋势分量和周期分量区分开,而不至于混淆。
原文请参考论文:A Seasonal-Trend Decomposition procedure Based on Loess