matlab实现指数平滑(一次/二次/三次)

matlab实现指数平滑(一次/二次/三次)

数据

我们以301X1的矩阵为数据(即代码中的y.mat),(百度云下载点这里提取码2333,积分下载点这里可以的话积分下载支持一下呀),同时也可以视情况导入自己的数据进行指数平滑处理
在这里插入图片描述

一次指数平滑

clc,clear
load y.mat;
data=y;
lenD=length(data);
a=[0.01 0.2 0.3 ]; 
lenA=length(a);
y1(1,1:lenA)=(data(1)+data(2))/2;
for i=2:lenD
y1(i,:)=a*data(i-1)+(1-a).*y1(i-1);
end
y1
next=a*data(lenD)+(1-a).*y1(lenD,:)
%若要预测未来10天则将上文最后两行改为以下这一段即可,预测x天同理
%for i=lenD+1:lenD+10
%    y1(i,:)=a*y1(i-1)+(1-a).*y1(i-1);
%end
%y1
%next=a*y1(lenD+10)+(1-a).*y1(lenD+10,:)

使用一个平滑状态(y1)和一个平滑因子数组(a)。首先初始化了状态,然后在数据集上进行迭代,更新状态。最后,计算预测值next。

二次指数平滑

clc,clear
load y.mat;
data=y;
lenD=length(data);
a=0.3;
st1(1)=data(1);
st2(1)=data(1);

for i=2:lenD
st1(i)=a*data(i)+(1-a).*st1(i-1);
st2(i)=a*st1(i)+(1-a).*st2(i-1);
end
b1=2*st1-st2
b2=a/(1-a)*(st1-st2)
y2=b1+b2
y2=y2'

首先加载 y.mat 的数据文件,然后对这些数据进行二次指数平滑。平滑因子 a 为 0.3。st1 和 st2 是平滑过程中的两个状态,它们都被初始化为数据的第一个值。然后,对于数据中的每个值,更新 st1 和 st2。最后,计算并输出预测值 y2。预测未来第n个时间点的数据yn = b1(lenD) + n*b2(lenD)

三次指数平滑

clc,clear
load y.mat;
data=y;
lenD=length(data);
a=0.3;
st1_0=mean(data(1:3));
st2_0=st1_0;
st3_0=st1_0;
st1(1)=a*data(1)+(1-a)*st1_0;
st2(1)=a*st1(1)+(1-a)*st2_0;
st3(1)=a*st2(1)+(1-a)*st3_0;

for i=2:lenD
st1(i)=a*data(i)+(1-a).*st1(i-1);
st2(i)=a*st1(i)+(1-a).*st2(i-1);
st3(i)=a*st2(i)+(1-a).*st3(i-1);
end
st1=[st1_0,st1];
st2=[st2_0,st2];
st3=[st3_0,st3];
%若要预测未来10天则将上面三行代码改成以下注释的几行即可,预测x天同理
%for i=lenD+1:lenD+10
%    st1(i)=a*st1(i-1)+(1-a).*st1(i-1);
%    st2(i)=a*st1(i)+(1-a).*st2(i-1);
%    st3(i)=a*st2(i)+(1-a).*st3(i-1);
%end

b1=3*st1-3*st2+st3
b2=0.5*a/(1-a)^2*((6-5*a)*st1-2*(5-4*a)*st2+(4-3*a)*st3)
b3=0.5*a/(1-a)^2*(st1-2*st2+st3)
y3=b1+b2+b3;

y3=y3'

使用三个平滑状态(st1, st2, st3)和一个平滑因子(a)。首先初始化了三个状态,然后在数据集上进行迭代,更新每个状态。最后计算出预测值y3。

  • 20
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 41
    评论
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值