时间序列
移动平均法
clc,clear
y=[533.8 574.6 606.9 649.8
1102.7];
m=length(y);
n=[4,5];
for i=1:length(n)
%n 为移动平均的项数
705.1 772.0 816.4 892.7 963.9 1015.1
for j=1:m-n(i)+1
%由于 n 的取值不同,下面使用了细胞数组
yhat{i}(j)=sum(y(j:j+n(i)-1))/n(i);
end
y12(i)=yhat{i}(end); %提出第 12 月份的预测值
s(i)=sqrt(mean((y(n(i)+1:end)-yhat{i}(1:end-1)).^2)); %求预测的标准误差
end
y12, s
%分别显示两种方法的预测值和预测的标准误差
指数平滑
一次指数平滑
程序:
clc,clear
yt=load('dianqi.txt');
n=length(yt);
alpha=[0.2 0.5 0.8]; %输入 a 的值
m=length(alpha)
yhat(1,[1:m])=(yt(1)+yt(2))/2; %求第一个预测值 索引
for i=2:n
%读取 dianqi.txt 的数据,
%求 yt 的长度
yhat(i,:)=alpha*yt(i-1)+(1-alpha).*yhat(i-1,:);
end
yhat %求预测值
err=sqrt(mean((repmat(yt,1,m)-yhat).^2)) %求预测的标准误差
xlswrite('dianqi.xls',yhat) %把预测数据写到 Excel 文件,准备在 word 表格中使用
yhat1988=alpha*yt(n)+(1-alpha).*yhat(n,:) %求 1988 的预测值
二次指数平滑
程序
clc,clear
yt=load('c:\Users\asus\Desktop\剑魔\fadian.txt'); %原始发电总量数据以列向量
的方式存放在纯文本文件中
n=length(yt);
alpha=0.3;
st1(1)=yt(1);
st2(1)=yt(1);
for i=2:n
st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1);
st2(i)=alpha*st1(i)+(1-alpha)*st2(i-1);
end
xlswrite('fadian.xls',[st1',st2']) %把数据写入表单 Sheet1 中的前两列
at=2*st1-st2;
bt=alpha/(1-alpha)*(st1-st2);
yhat=at+bt; %最后的一个分量为 1986 年的预测值
xlswrite('fadian.xls',yhat','Sheet1','C2') %把预测值写入第 3 列
str=['C',int2str(n+2)]; %准备写 1987 年预测值位置的字符串
xlswrite('fadian.xls',at(n)+2*bt(n),'Sheet1',str)%把 1987 年预测值写到相应位
置
yt=load('c:\Users\asus\Desktop\剑魔\fadian.txt'); %原始发电总量数据以列向量
的方式存放在纯文本文件中
n=length(yt);
alpha=0.3;
st1(1)=yt(1);
st2(1)=yt(1);
for i=2:n
st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1);
st2(i)=alpha*st1(i)+(1-alpha)*st2(i-1);
end
xlswrite('fadian.xls',[st1',st2']) %把数据写入表单 Sheet1 中的前两列
at=2*st1-st2;
bt=alpha/(1-alpha)*(st1-st2);
yhat=at+bt; %最后的一个分量为 1986 年的预测值
xlswrite('fadian.xls',yhat','Sheet1','C2') %把预测值写入第 3 列
str=['C',int2str(n+2)]; %准备写 1987 年预测值位置的字符串
xlswrite('fadian.xls',at(n)+2*bt(n),'Sheet1',str)%把 1987 年预测值写到相应位
置