当数据有趋势时,简单的指数平滑并不会很好,这很不方便。[1]在这种情况下,以“双指数平滑”或“二阶指数平滑”的名称设计了几种方法,这是指数滤波器的两次递归应用,因此被称为“双指数平滑”。这个术语类似于四重指数平滑,它也引用了它的递归深度。[11]双指数平滑背后的基本思想是引入一个术语来考虑一系列展示某种形式趋势的可能性。这个斜率分量本身是通过指数平滑更新的。
一种方法,有时称为“Holt-Winters双指数平滑” [12],其工作原理如下:[13]
同样,从时间t = 0 开始,观察的原始数据序列由{ x t } 表示。我们用{ s t }表示时间t的平滑值,{ b t }是我们对趋势的最佳估计在时间t。算法的输出现在被写为F t + m,基于时间t以前的原始数据,估计在时间t + m处的x的值(对于m > 0)。双指数平滑由公式给出
并且对于t> 1来说
其中α是数据平滑因子,0 <α<1,β是趋势平滑因子,0 <β<1。
预测超出x t
设置初始值b 0是一个偏好问题。除了上面列出的选项之外的选项对于某些n > 1 是(x n - x 0)/ n。
注意,F 0是未定义的(对于时间0没有估计),并且根据明确定义的定义F 1 = s 0 + b 0,因此可以评估更多的值。
public class TwiceExpSmooth {
public static void main(String[] args) {
double[] real = {3.0, 6.0, 2.0, 2.0, 0.0, 3.0, 0};
double x = getTwiceExpect(real, 1, 0.3,0.3);
System.out.println(x);
}
//指数平滑
public static double getTwiceExpect(double[] arr, double n, double aerf,double beta ) {
if (arr.length < 3 || aerf <= 0 || aerf >= 1 || beta<=0 || beta>=1) {
return 0;
}
double aerf1 = 1 - aerf;
double beta1 = 1 - beta;
double s = arr[0];
double s1=0;
double b = arr[1]-arr[0];
for(int i=2;i<arr.length-1;i++){
s1 = aerf * arr[i] + aerf1 * (s+b);
b = beta * (s1 - s) + beta1 * b;
s = s1;
}
return s1 + b * n;
}
}