导航:首页 > 源码编译 > holtwinters算法

holtwinters算法

发布时间:2022-12-11 17:30:52

㈠ 指数平滑方法简介

指数平滑(Exponential smoothing)是除了 ARIMA 之外的另一种被广泛使用的时间序列预测方法(关于 ARIMA,请参考 时间序列模型简介 )。 指数平滑即指数移动平均(exponential moving average),是以指数式递减加权的移动平均。各数值的权重随时间指数式递减,越近期的数据权重越高。常用的指数平滑方法有一次指数平滑、二次指数平滑和三次指数平滑。

一次指数平滑又叫简单指数平滑(simple exponential smoothing, SES),适合用来预测没有明显趋势和季节性的时间序列。其预测结果是一条水平的直线。模型形如:

其中 是真实值, 为预测值, 为平滑值, 。

定义残差 ,其中 ,则可以通过优化方法得到 和 。

使用 python 的 statsmodels 可以方便地应用该模型:

效果如图:

Holt 扩展了简单指数平滑,使其可以用来预测带有趋势的时间序列。直观地看,就是对平滑值的一阶差分(可以理解为斜率)也作一次平滑。模型的预测结果是一条斜率不为0的直线。模型形如:

其中 , 。

效果如图:

Holt's linear trend method 得到的预测结果是一条直线,即认为未来的趋势是固定的。对于短期有趋势、长期趋于稳定的序列,可以引入一个阻尼系数 ,将模型改写为

为了描述时间序列的季节性,Holt 和 Winters 进一步扩展了 Holt's linear trend method,得到了三次指数平滑模型,也就是通常说的 Holt-Winters’ 模型。我们用 表示“季节”的周期。根据季节部分和非季节部分的组合方式不同,Holt-Winters’ 又可以分为加法模型和乘法模型。

加法模型形如:

其中 , , 。 是 的整数部分。

效果如图:

乘法模型形如:

效果如图:

Holt-Winters’ 模型的趋势部分同样可以引入阻尼系数 ,这里不再赘述。

参数优化的方法是最小化误差平方和或最大化似然函数。模型选择可以根据信息量准则,常用的有 AIC 和 BIC等。

AIC 即 Akaike information criterion, 定义为

其中 是似然函数, 是参数数量。用 AIC 选择模型时要求似然函数大,同时对参数数量作了惩罚,在似然函数相近的情况下选择复杂度低的模型。

BIC 即 Bayesian information criterion,定义为

其中 是样本数量。当 时, ,因此当样本量较大时 BIC 对模型复杂度的惩罚比 AIC 更严厉。

线性的指数平滑方法可以看作是 ARIMA 的特例。例如简单指数平滑等价于 ARIMA(0, 1, 1),Holt's linear trend method 等价于 ARIMA(0, 2, 2),而 Damped trend methods 等价于 ARIMA(1, 1, 2) 等。

我们不妨来验证一下。

可以改写为

亦即

两边同时加上 ,得

而 ARIMA(p, d, q) 可以表示为

其中 是滞后算子(Lag operator), 。
考虑 ARIMA(0, 1, 1)



亦即

令 ,则两者等价。

非线性的指数平滑方法则没有对应的 ARIMA 表示。

[1] Hyndman, Rob J., and George Athanasopoulos. Forecasting: principles and practice. OTexts, 2014.
[2] Exponential smoothing - Wikipedia https://en.wikipedia.org/wiki/Exponential_smoothing
[3] Introction to ARIMA models - Duke https://people.ke.e/~rnau/411arim.htm

㈡ IT运维平台算法背后的两大“神助攻”

智能运维(AIops)是目前 IT 运维领域最火热的词汇,全称是 Algorithmic IT operations platforms,正规翻译是‘基于算法的 IT 运维平台’,直观可见算法是智能运维的核心要素之一。

本文主要谈算法对运维的作用,涉及异常检测和归因分析两方面,围绕运维系统Kale 中 skyline、Oculus 模块、Opprentice 系统、Granger causality(格兰杰因果关系)、FastDTW 算法等细节展开。

一、异常检测

异常检测,是运维工程师们最先可能接触的地方了。毕竟监控告警是所有运维工作的基础。设定告警阈值是一项耗时耗力的工作,需要运维人员在充分了解业务的前提下才能进行,还得考虑业务是不是平稳发展状态,否则一两周改动一次,运维工程师绝对是要发疯的。

如果能将这部分工作交给算法来解决,无疑是推翻一座大山。这件事情,机器学习当然可以做到。但是不用机器学习,基于数学统计的算法,同样可以,而且效果也不差。

异常检测之Skyline异常检测模块

2013年,Etsy 开源了一个内部的运维系统,叫 Kale。其中的 skyline 部分,就是做异常检测的模块, 它提供了 9 种异常检测算法 :

first_hour_average、

simple_stddev_from_moving_average、

stddev_from_moving_average、

mean_subtraction_cumulation、

least_squares

histogram_bins、

grubbs、

median_absolute_deviation、

Kolmogorov-Smirnov_test

简要的概括来说,这9种算法分为两类:

从正态分布入手:假设数据服从高斯分布,可以通过标准差来确定绝大多数数据点的区间;或者根据分布的直方图,落在过少直方里的数据就是异常;或者根据箱体图分析来避免造成长尾影响。

从样本校验入手:采用 Kolmogorov-Smirnov、Shapiro-Wilk、Lilliefor 等非参数校验方法。

这些都是统计学上的算法,而不是机器学习的事情。当然,Etsy 这个 Skyline 项目并不是异常检测的全部。

首先,这里只考虑了一个指标自己的状态,从纵向的时序角度做异常检测。而没有考虑业务的复杂性导致的横向异常。其次,提供了这么多种算法,到底一个指标在哪种算法下判断的更准?这又是一个很难判断的事情。

问题一: 实现上的抉择。同样的样本校验算法,可以用来对比一个指标的当前和历史情况,也可以用来对比多个指标里哪个跟别的指标不一样。

问题二: Skyline 其实自己采用了一种特别朴实和简单的办法来做补充——9 个算法每人一票,投票达到阈值就算数。至于这个阈值,一般算 6 或者 7 这样,即占到大多数即可。

异常检测之Opprentice系统

作为对比,面对相同的问题,网络 SRE 的智能运维是怎么处理的。在去年的 APMcon 上,网络工程师描述 Opprentice 系统的主要思想时,用了这么一张图:

Opprentice 系统的主体流程为:

KPI 数据经过各式 detector 计算得到每个点的诸多 feature;

通过专门的交互工具,由运维人员标记 KPI 数据的异常时间段;

采用随机森林算法做异常分类。

其中 detector 有14种异常检测算法,如下图:

我们可以看到其中很多算法在 Etsy 的 Skyline 里同样存在。不过,为避免给这么多算法调配参数,直接采用的办法是:每个参数的取值范围均等分一下——反正随机森林不要求什么特征工程。如,用 holt-winters 做为一类 detector。holt-winters 有α,β,γ 三个参数,取值范围都是 [0, 1]。那么它就采样为 (0.2, 0.4, 0.6, 0.8),也就是 4 ** 3 = 64 个可能。那么每个点就此得到  64  个特征值。

异常检测之

Opprentice 系统与 Skyline 很相似

Opprentice 系统整个流程跟 skyline 的思想相似之处在于先通过不同的统计学上的算法来尝试发现异常,然后通过一个多数同意的方式/算法来确定最终的判定结果。

只不过这里网络采用了一个随机森林的算法,来更靠谱一点的投票。而 Etsy 呢?在 skyline 开源几个月后,他们内部又实现了新版本,叫 Thyme。利用了小波分解、傅里叶变换、Mann-whitney 检测等等技术。

另外,社区在 Skyline 上同样做了后续更新,Earthgecko 利用 Tsfresh 模块来提取时序数据的特征值,以此做多时序之间的异常检测。我们可以看到,后续发展的两种 Skyline,依然都没有使用机器学习,而是进一步深度挖掘和调整时序相关的统计学算法。

开源社区除了 Etsy,还有诸多巨头也开源过各式其他的时序异常检测算法库,大多是在 2015 年开始的。列举如下:

Yahoo! 在去年开源的 egads 库。(Java)

Twitter 在去年开源的 anomalydetection 库。(R)

Netflix 在 2015 年开源的 Surus 库。(Pig,基于PCA)

其中 Twitter 这个库还被 port 到 Python 社区,有兴趣的读者也可以试试。

二、归因分析

归因分析是运维工作的下一大块内容,就是收到报警以后的排障。对于简单故障,应对方案一般也很简单,采用 service restart engineering~ 但是在大规模 IT 环境下,通常一个故障会触发或导致大面积的告警发生。如果能从大面积的告警中,找到最紧迫最要紧的那个,肯定能大大的缩短故障恢复时间(MTTR)。

这个故障定位的需求,通常被归类为根因分析(RCA,Root Cause Analysis)。当然,RCA 可不止故障定位一个用途,性能优化的过程通常也是 RCA 的一种。

归因分析之 Oculus 模块

和异常检测一样,做 RCA 同样是可以统计学和机器学习方法并行的~我们还是从统计学的角度开始。依然是 Etsy 的 kale 系统,其中除了做异常检测的 skyline 以外,还有另外一部分,叫 Oculus。而且在 Etsy 重构 kale 2.0 的时候,Oculus 被认为是1.0 最成功的部分,完整保留下来了。

Oculus 的思路,用一句话描述,就是:如果一个监控指标的时间趋势图走势,跟另一个监控指标的趋势图长得比较像,那它们很可能是被同一个根因影响的。那么,如果整体 IT 环境内的时间同步是可靠的,且监控指标的颗粒度比较细的情况下,我们就可能近似的推断:跟一个告警比较像的最早的那个监控指标,应该就是需要重点关注的根因了。

Oculus 截图如下:

这部分使用的 计算方式有两种:

欧式距离,就是不同时序数据,在相同时刻做对比。假如0分0秒,a和b相差1000,0分5秒,也相差1000,依次类推。

FastDTW,则加了一层偏移量,0分0秒的a和0分5秒的b相差1000,0分5秒的a和0分10秒的b也相差1000,依次类推。当然,算法在这个简单假设背后,是有很多降低计算复杂度的具体实现的,这里就不谈了。

唯一可惜的是 Etsy 当初实现 Oculus 是基于 ES 的 0.20 版本,后来该版本一直没有更新。现在停留在这么老版本的 ES 用户应该很少了。除了 Oculus,还有很多其他产品,采用不同的统计学原理,达到类似的效果。

归因分析之 Granger causality

Granger causality(格兰杰因果关系)是一种算法,简单来说它通过比较“已知上一时刻所有信息,这一时刻 X 的概率分布情况”和“已知上一时刻除 Y 以外的所有信息,这一时刻 X 的概率分布情况”,来判断 Y 对 X 是否存在因果关系。

可能有了解过一点机器学习信息的读者会很诧异了:不是说机器只能反应相关性,不能反应因果性的么?需要说明一下,这里的因果,是统计学意义上的因果,不是我们通常哲学意义上的因果。

统计学上的因果定义是:‘在宇宙中所有其他事件的发生情况固定不变的条件下,如果一个事件 A 的发生与不发生对于另一个事件 B 的发生的概率有影响,并且这两个事件在时间上有先后顺序(A 前 B 后),那么我们便可以说 A 是 B 的原因。’

归因分析之皮尔逊系数

另一个常用的算法是皮尔逊系数。下图是某 ITOM 软件的实现:

我们可以看到,其主要元素和采用 FastDTW 算法的 Oculus 类似:correlation 表示相关性的评分、lead/lag 表示不同时序数据在时间轴上的偏移量。

皮尔逊系数在 R 语言里可以特别简单的做到。比如我们拿到同时间段的访问量和服务器 CPU 使用率:

然后运行如下命令

acc_count<-scale(acc$acc_count,center=T,scale=T)

cpu<-scale(acc$cpuload5,center=T,scale=T)

cor.test(acc_count,cpu)

可以看到如下结果输出:

对应的可视化图形如下:

这就说明网站数据访问量和 CPU 存在弱相关,同时从散点图上看两者为非线性关系。因此访问量上升不一定会真正影响 CPU 消耗。

其实 R 语言不太适合嵌入到现有的运维系统中。那这时候使用 Elasticsearch 的工程师就有福了。ES 在大家常用的 metric aggregation、bucket aggregation、pipeline aggregation 之外,还提供了一种 matrix aggregation,目前唯一支持的 matrix_stats 就是采用了皮尔逊系数的计算,接口文档见:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-matrix-stats-aggregation.html

唯一需要注意的就是,要求计算相关性的两个字段必须同时存在于一个 event 里。所以没法直接从现成的 ES 数据中请求不同的 date_histogram,然后计算,需要自己手动整理一遍,转储回 ES 再计算。

饶琛琳,目前就职日志易,有十年运维工作经验。在微博担任系统架构师期间,负责带领11人的SRE团队。着有《网站运维技术与实践》、《ELKstack权威指南》,合译有《Puppet 3 Cookbook》、《Learning Puppet 4》。在众多技术大会上分享过自动化运维与数据分析相关主题。

㈢ r里的holtwinters 是怎么算出参数的

在r中看函数源代码: 在R中,代码可以分为如下几个级别: 首先,是你输入了函数对象名称,你可以直接看到代码的,如要获得函数对象fivenum的代码,就只需要在Console中键入函数对象名称fivenum就可以得到如下结果: function (x, na.rm = TRUE) 。

㈣ 三次指数平滑(holt-winter)

我现在深深的发现我老公就是个杠精,我说啥他都要杠,不杠就活不了了。
生气。
这里不多说指数平滑的原理,直接给一个结论。

请王越不要在跟我抬杠,千恩万谢。
一次指数平滑预测值恒为常数,所以最好只做1期预测。
最近我司又让我做时间序列了,就目前我的水平而言,做出来的效果最好的是xgboost算法。
出于兴趣,自己研究了holt-winter的使用方法。

from statsmodels.tsa.holtwinters import ExponentialSmoothing

数据样式如下,一小时一个点,逗号前面是时间,后面是数值。

1、先拿到数据,一小时一个点,去除时间标记,拿到数值,按照时间顺序,存入数组y3中。
2、设置模型的参数
看一下源码里怎么说的

参数:
第一个endog,当然是时间序列的数据了,array-like的形式。
第二个trend是趋势,有三种可选项,就是加法趋势和乘法趋势还有None。
第三个damped是衰减,Boolean,是否对趋势进行衰减。
第四个seasonal是季节性(周期),也是三种选项,加法、乘法还有None。
第五个seasonal_periods,季节性周期,int型,holt-winter要考虑的季节的数量。简单来说,多少点是一个周期?你可以设定为一天,一星期,一个月,一年等等
参数比较简单,一目了然。
我这边设置的趋势和季节都是加性的。因为数据是一小时一个点的,所以周期我给的是24,即一天为一个周期。
3、拟合模型
4、预测

看这个效果还不错是吧,那是因为前面都在训练集里面,真正展现实力的是后面分叉的部分。效果很差。
如果只是把后面的部分截出来看,是不是对比更明显一点。

下图是我用同样的数据,holt-winter和xgboost预测效果以及真实值的对比效果

㈤ 时序检测算法--指数平滑法

http://www.dataguru.cn/article-3235-1.html
所有移动平均法都存在很多问题。
它们都太难计算了。每个点的计算都让你绞尽脑汁。而且也不能通过之前的计算结果推算出加权移动平均值。
移动平均值永远不可能应用于现有的数据集边缘的数据,因为它们的窗口宽度是有限的。这是一个大问题,因为数据集边缘的变动形态一般都是我们最感兴趣的部分。
类似地,移动平均法也不能应用于现有数据集的范围之外。其结果是,它们对预测毫无用处。
幸运的是,有一种很简单的计算方案能够避免所有这些问题。它叫指数平滑法(exponential smoothing)或Holt-Winters法。指数平滑法有几种不同形式:一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但 没有季节性的序列。 术语“Holt-Winters法”有时特指三次指数平滑法。
所有的指数平滑法都要更新上一时间步长的计算结果,并使用当前时间步长的数据中包含的新信息。它们通过“混合”新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的拌和参数来控制。各种方法的不同之处在于它们跟踪的量的个数和对应的拌和参数的个数。

㈥ 时间序列 Holt-Winters 方法要求序列平稳吗

Why stationary?(为何要平稳?)
Why weak stationary?(为何弱平稳?)

Why stationary?(为何要平稳?)
每一个统计学问题,我们都需要对其先做一些基本假设。如在一元线性回归中(),我们要假设:①不相关且非随机(是固定值或当做已知)②独立同分布服从正态分布(均值为0,方差恒定)。

在时间序列分析中,我们考虑了很多合理且可以简化问题的假设。而其中最重要的假设就是平稳。
The basic idea of stationarity is that the probability laws that govern the behavior of the process do not change over time.
平稳的基本思想是:时间序列的行为并不随时间改变。
正因此,我们定义了两种平稳:
Strict stationarity: A time series {} is said to be strictly stationary if the joint distribution of ,, · · ·, is the same as that of,, · · · ,for all choices of natural number n, all choices of time points ,, · · · , and all choices of time lag k.
强平稳过程:对于所有可能的n,所有可能的,, · · · , 和所有可能的k,当,, · · ·,的联合分布与,, · · · ,相同时,我们称其强平稳。
Weak stationarity: A time series {} is said to be weakly (second-order, or co-variance) stationary if:
① the mean function is constant over time, and
② γ(t, t − k) = γ(0, k) for all times t and lags k.
弱平稳过程:当①均值函数是常数函数且②协方差函数仅与时间差相关,我们才称其为弱平稳。
此时我们转到第二个问题:Why weak stationary?(为何弱平稳?)
我们先来说说两种平稳的差别:

两种平稳过程并没有包含关系,即弱平稳不一定是强平稳,强平稳也不一定是弱平稳。
一方面,虽然看上去强平稳的要求好像比弱平稳强,但强平稳并不一定是弱平稳,因为其矩不一定存在。
例子:{}独立服从柯西分布。{}是强平稳,但由于柯西分布期望与方差不存在,所以不是弱平稳。(之所以不存在是因为其并非绝对可积。)
另一方面,弱平稳也不一定是强平稳,因为二阶矩性质并不能确定分布的性质。
例子:,,互相独立。这是弱平稳却不是强平稳。

知道了这些造成差别的根本原因后,我们也可以写出两者的一些联系:

一阶矩和二阶矩存在时,强平稳过程是弱平稳过程。(条件可简化为二阶矩存在,因为)
当联合分布服从多元正态分布时,两平稳过程等价。(多元正态分布的二阶矩可确定分布性质)

而为什么用弱平稳而非强平稳,主要原因是:强平稳条件太强,无论是从理论上还是实际上。
理论上,证明一个时间序列是强平稳的一般很难。正如定义所说,我们要比较,对于所有可能的n,所有可能的,, · · · , 和所有可能的k,当,, · · ·,的联合分布与,, · · · ,相同。当分布很复杂的时候,不仅很难比较所有可能性,也可能很难写出其联合分布函数。
实际上,对于数据,我们也只能估算出它们均值和二阶矩,我们没法知道它们的分布。所以我们在以后的模型构建和预测上都是在用ACF,这些性质都和弱项和性质有关。而且,教我时间序列教授说过:"General linear process(weak stationarity, linearity, causality) covers about 10% of the real data." ,如果考虑的是强平稳,我觉得可能连5%都没有了。

对第二个问题:
教授有天在审本科毕业论文,看到一个写金融的,用平稳时间序列去估计股票走势(真不知这老兄怎么想的)。当时教授就说:“金融领域很多东西之所以难以估计,就是因为其经常突变,根本就不是平稳的。”
果不其然,论文最后实践阶段,对于股票选择的正确率在40%。连期望50%都不到(任意一点以后要么涨要么跌)。

㈦ Holt Winter 指数平滑模型

移动平均模型在解决时间序列问题上简单有效,但它们的计算比较难,因为不能通过之前的计算结果推算出加权移动平均值。此外,移动平均法不能很好的处理数据集边缘的数据变化,也不能应用于现有数据集的范围之外。因此,移动平均法的预测效果相对较差。

指数平滑法(exponential smoothing)是一种简单的计算方案,可以有效的避免上述问题。按照模型参数的不同,指数平滑的形式可以分为一次指数平滑法、二次指数平滑法、三次指数平滑法。其中一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但是没有季节特性的时间序列,三次指数平滑法则可以预测具有趋势和季节性的时间序列。术语“Holt-Winter”指的是三次指数平滑。

Holt-Winter指数平滑法按照季节性分量的计算方式不同,可以分为累加式季节性分量和累乘式季节性分量。两种不同的分量对应的时间序列计算等式和预测公式均不同,稍后我们会详细介绍。

指数平滑法是一种结合当前信息和过去信息的方法,新旧信息的权重由一个可调整的参数控制,各种变形的区别之处在于其“混合”的过去信息量的多少和参数的个数。

常见的有单指数平滑、双指数平滑。它们都只有一个加权因子,但是双指数平滑使用相同的参数将但指数平滑进行两次,适用于有线性趋势的序列。单指数平滑实质上就是自适应预期模型,适用于序列值在一个常数均值上下随机波动的情况,无趋势及季节要素的情况,单指数平滑的预测对所有未来的观测值都是常数。

一次指数平滑的递推关系公式:

其中,s_i是第i步经过平滑的值,x_i是这个时间的实际数据。alpha是加权因子,取值范围为[0,1],它控制着新旧信息之间的权重平衡。当alpha接近1时,我们就只保留当前数据点(即完全没有对序列做平滑操作),当alpha接近0时,我们只保留前面的平滑值,整个曲线是一条水平的直线。在该方法中,越早的平滑值作用越小,从这个角度看,指数平滑法像拥有无限记忆且权值呈指数级递减的移动平均法。 

一次指数平滑法的预测公式为:

因此,一次指数平滑法得到的预测结果在任何时候都是一条直线。并不适合于具有总体趋势的时间序列,如果用来处理有总体趋势的序列,平滑值将滞后于原始数据,除非alpha的值非常接近1,但这样使得序列不够平滑。

二次指数平滑法保留了平滑信息和趋势信息,使得模型可以预测具有趋势的时间序列。二次指数平滑法有两个等式和两个参数:

t_i代表平滑后的趋势,当前趋势的未平滑值是当前平滑值s_i和上一个平滑值s_{i-1}的差。s_i为当前平滑值,是在一次指数平滑基础上加入了上一步的趋势信息t_{i-1}。利用这种方法做预测,就取最后的平滑值,然后每增加一个时间步长,就在该平滑值上增加一个t_{i}:

在计算的形式上这种方法与三次指数平滑法类似,因此,二次指数平滑法也被称为无季节性的Holt-Winter平滑法。

三次指数平滑法相比二次指数平滑,增加了第三个量来描述季节性。累加式季节性对应的等式为:

累乘式季节性对应的等式为:

其中p_i为周期性的分量,代表周期的长度。x_{i+h}为模型预测的等式。

参考文献:

[1] 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters). http://www.dataguru.cn/article-3235-1.html.

[2] R语言与数据分析之九:时间内序列--HoltWinters指数平滑法 . http://blog.csdn.net/howardge/article/details/42076781.

[3] Holt-Winters原理和初始值的确定 . http://www.cnblogs.com/xuanlvshu/p/5451974.html.

㈧ HoltWinters模型为什么有两个版本

Holt-Winters分为加法模型和乘法模型。该方法与二次指数平滑法类似,但它可以同时修正时间序列数据的季节性和倾向性,因此,它可以用于对既有倾向性变动趋势又有季节性变动的时间序列进行预测。

阅读全文

与holtwinters算法相关的资料

热点内容
单片机高电平驱动 浏览:115
ios多选文件夹 浏览:907
加强行车调度命令管理 浏览:241
服务器已禁用什么意思 浏览:148
部队命令回复 浏览:753
神奇宝贝服务器地图怎么设置 浏览:380
加密算法输出固定长度 浏览:862
程序员去重庆还是武汉 浏览:121
服务器如何撤销网页登录限制 浏览:980
微信公众平台php开发视频教程 浏览:628
怎么看苹果授权绑定的app 浏览:255
压缩机单级压缩比 浏览:380
linux测试php 浏览:971
什么时候梁旁边需要加密箍筋 浏览:40
微信清粉软件源码 浏览:717
matlabdoc命令 浏览:550
如何去ping服务器 浏览:75
ecshop安装php55 浏览:817
javaword库 浏览:958
php图片路径数据库中 浏览:488