R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

前端魔术师
• 阅读 200

原文链接:http://tecdat.cn/?p=22632 

原文出处:拓端数据部落公众号

 

这篇文章描述了一种对涉及季节性和趋势成分的时间序列的中点进行建模的方法。我们将对一种叫做STL的算法进行研究,STL是 "使用LOESS(局部加权回归)的季节-趋势分解 "的缩写,以及如何将其应用于异常检测。

其基本思想是,如果你有一个有规律的时间序列,你可以通过STL算法运行该序列,并分离出规律的模式。剩下的是 "不规则的",而异常检测相当于判定不规则性是否足够大。

例子:航空乘客,1949-1960

让我们在数据集上运行该算法,该数据集给出了1949-1960年期间每月的航空公司乘客数量。首先,这是未经修改的时间序列。

plot(y)

 

R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

 

 

这里显然有一个规律性的模式,但是在这个序列中没有任何明显的下降,无法在异常检测中显示出来。所以我们将设置一个。\
 

y[40] = 150

R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

 

 

跌幅足够大,我们希望异常检测能发现它,但又不至于大到你只看一眼图就会发现。现在让我们通过STL检查它。 

plot(fit)

R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

 

 

首先,我不是在y上运行STL,而是在log(y)上。

该算法将序列分解为三个部分:季节性、趋势和剩余成分。季节性是周期性成分,趋势是一般的上升/下降,剩余成分是剩下的趋势成分。季节性和趋势共同构成了序列的 "常规 "部分,因此是我们在异常检测过程中要剔除的部分。

剩余部分基本上是原始序列的正常化版本,所以这是我们监测异常情况的部分。剩余序列的下降是很明显的。我们在1952年初设置的异常下降很可能算在内。

我们还可以调整每一时期的观测值数量,负责分离季节性和趋势成分的平滑方法,拟合模型的 "稳健性"(即对异常值不敏感)等等。这些参数中的大多数需要对基础算法的工作原理有一定的了解。

下面是一些显示实际数据与阈值的代码。


data <- merge(df, ba, by.x='x')
ggplot(data) +
  geom(aes(x=x, ymin=ymin, ymax=ymax)) 

R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

 

再次,聪明如你可能会注意到通过exp()进行的逆变换。我们现在讨论这个问题。

为什么要进行对数和逆变换?

并非所有的分解都涉及对数变换,但这个分解却涉及。其原因与分解的性质有关。STL的分解总是加法的。

y = s + t + r

但对于某些时间序列,乘法分解更适合。

y = str

这种情况发生在销售数据中,季节性成分的振幅随着趋势的增加而增加。这实际上是乘法序列的标志,航空旅客序列也表现出这种模式。为了处理这个问题,我们对原始值进行对数转换,这使我们进入加法领域,在那里我们可以进行STL分解。当我们完成后,我们再进行逆变换,回到原始序列。

多重季节性的情况如何?

一些时间序列有一个以上的季节性。例如,在酒店预订时间序列有三个季节性:每日、每周和每年。

虽然有一些程序可以生成具有多个季节性成分的分解,但STL并没有这样做。最高频率的季节性被作为季节性成分,而任何较低频率的季节性都被吸收到趋势中。


R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

最受欢迎的见解

1.在python中使用lstm和pytorch进行时间序列预测

2.python中利用长短期记忆模型lstm进行时间序列预测分析

3.使用r语言进行时间序列(arima,指数平滑)分析

4.r语言多元copula-garch-模型时间序列预测

5.r语言copulas和金融时间序列案例

6.使用r语言随机波动模型sv处理时间序列中的随机波动

7.r语言时间序列tar阈值自回归模型

8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类

9.python3用arima模型进行时间序列预测

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
3个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(