MATLAB 时间序列预测算法的实现

最近看了一篇关于时间序列模型的论文 以下是关于matlab代码的部分各个方法都有实现
觉得还是这样用起来方便

%平均移动法
%clc;
%clear all;
%y=[533.8 574.6 606.9 649.8 705.1 772.0 816.4 892.7 963.9 1015.1 
1102.7];
%m=length(y);
%n=[4,5]; % 自定义
%for i=1:length(n)
 %   for j=1:m-n(i)+1
  %       yhat{i}(j)=sum(y(j:j+n(i)-1))/n(i);
   % end
    %y12(i)=yhat{i}(end);
    %s(i)=sqrt(mean((y(n(i)+1:m)-yhat{i}(1:end-1)).^2));
%end
%y12,s


%加权平均
%clc;
%clear all;
%y=[215 197 203 234 194 108 191 241 232 221 196 226 201 219 217 213 203 225 237 188 212 198 219 177 231 199 203];
%w=[1/7;3/7;3/7];%自定义
%m=length(y);n=3;
%for i=1:m-n+1
 %   yhat(i)=y(i:i+n-1)*w;
%end
%yhat;
%err=abs(y(n+1:m)-yhat(1:end-1))./y(n+1:m);
%T_err=1-sum(yhat(1:end-1))/sum(y(n+1:m));
%y1989=yhat(i)/(1-T_err);


%趋势移动平均法
%clc;
%clear all;
%y=[216 199 222 218 217 259 206 230 255 221 214 212 219 224 210 205 186 249 214 228 211 226 219 238 217 205 206];
%m1=length(y);
%n=6;  %n 为移动平均的项数
%for i=1:m1-n+1
 %   yhat1(i)=sum(y(i:i+n-1))/n;
%end
%yhat1;
%m2=length(yhat1);
%for i=1:m2-n+1
 %   yhat2(i)=sum(yhat1(i:i+n-1))/n;
%end
%yhat2;
%plot(1:27,y,'*');
%a21=2*yhat1(end)-yhat2(end);
%b21=2*(yhat1(end)-yhat2(end))/(n-1);
%y1986=a21+b21
%y1987=a21+2*b21


%指数平滑法
%clc,clear all;
%load dianqi.txt %原始数据以列向量的方式存放在纯文本文件中
%yt=dianqi;
%n=length(yt); 
%alpha=[0.2 0.5 0.8];m=length(alpha); 
%yhat(1,1:m)=(yt(1)+yt(2))/2; 
%for i=2:n 
 %yhat(i,:)=alpha*yt(i-1)+(1-alpha).*yhat(i-1,:); 
%end
%yhat;
%y1=yt';
%err=sqrt(mean((repmat(y1,1,m)-yhat).^2));
%xlswrite('yt',yhat) ;
%yhat1988=alpha*yt(n)+(1-alpha).*yhat(n,:)%论文中的预测值

%二次指数平滑法
clc,clear 
load fadian.txt %原始数据以列向量的方式存放在纯文本文件中
yt=fadian; 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']) 
a=2*st1-st2 
b=alpha/(1-alpha)*(st1-st2) 
yhat=a+b; 
xlswrite('fadian.xls',yhat','Sheet1','C2') 
str=char(['C',int2str(n+2)]); 
xlswrite('fadian.xls',a(n)+2*b(n),'Sheet1',str)



%三次指数平滑法
%clc,clear;
%yt=[20.04 20.06 25.72 34.61 51.77 55.92 80.65 131.11 148.58 162.67 232.26];
%n=length(yt); 
%alpha=0.3; st1_0=mean(yt(1:3)); st2_0=st1_0;st3_0=st1_0; 
%st1(1)=alpha*yt(1)+(1-alpha)*st1_0; 
%st2(1)=alpha*st1(1)+(1-alpha)*st2_0; 
%st3(1)=alpha*st2(1)+(1-alpha)*st3_0; 
%for i=2:n 
% st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1); 
% st2(i)=alpha*st1(i)+(1-alpha)*st2(i-1); 
% st3(i)=alpha*st2(i)+(1-alpha)*st3(i-1); 
%end 
%xlswrite('touzi.xls',[st1',st2',st3']) 
%st1=[st1_0,st1];st2=[st2_0,st2];st3=[st3_0,st3]; 
%a=3*st1-3*st2+st3; 
%b=0.5*alpha/(1-alpha)^2*((6-5*alpha)*st1-2*(5-4*alpha)*st2+(4-3*alpha)*st3); 
%c=0.5*alpha^2/(1-alpha)^2*(st1-2*st2+st3); 
%yhat=a+b+c; 
%xlswrite('touzi.xls',yhat','Sheet1','D1') 
%plot(1:n,yt,'*',1:n,yhat(1:n),'O') 
%legend('实际值','预测值') 
%xishu=[c(n+1),b(n+1),a(n+1)]; 
%yhat1990=polyval(xishu,2)


%自适应滤波法
%clc,clear;
%yt=[217 207.5 215 223 222 221.5 209 213 217 213 217 215];
%m=length(yt);k=0.083;
%N=12;Terr=10000;
%w=ones(1,N)/N;
%while abs(Terr)>0.00001
 %   Terr=[];
  %  for j=N+1;m-1
     %    yhat(j)=w*yt(j-1:-1:j-N)';
      %   err=yt(j)-yhat(j);
        % Terr=[Terr,abs(err)];
        % w=w+2*k*err*yt(j-1:-1:j-N);
    % end
   %  Terr=max(Terr);
 %end
 %w,yhat
%趋势外推预测法-指数曲线法这个简单就直接算就行
 
%趋势外推预测法——修正指数曲线法(以下三种类似,选S标准误差小的模型)
%function chanliang
%clc,clear;
%global a b k
%load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中
%yt=xsh;
%n=length(yt);m=n/3;
%%值得注意的是,并不是任何一组数据都可以用修正指数曲线拟合。采用前应对数据进行检验,检验方法是看给定数据的逐期增长量的比率是否接近某一常数b
%cf=diff(yt);
%for i=1:n-2
 %   bzh(i)=cf(i+1)/cf(i)
%end
%range=minmax(bzh)     %b的范围
%s1=sum(yt(1:m)),s2=sum(yt(m+1:2*m)),s3=sum(yt(2*m+1:end))
%b=((s3-s2)/(s2-s1))^(1/m)
%a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
%k=(s1-a*b*(b^m-1)/(b-1))/m
%y=yuce(1:18)
%定义预测函数
%function y=yuce(t)
%global a b k
%y=k+a*b.^t;

%Compertz 曲线:  初期增长缓慢,以后逐渐加快。当达到一定程度后,增长率又逐渐下降。
%clc,clear
%global a b k 
%load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中
%yt=log(y);n=length(yt);m=n/3;
%s1=sum(yt(1:m)),s2=sum(yt(m+1:2*m)),s3=sum(yt(2*m+1:end))
%b=((s3-s2)/(s2-s1))^(1/m)
%a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
%k=(s1-a*b*(b^m-1)/(b-1))/m
%a=exp(a)
%k=exp(k)
%y=yuce(1:18)
%************************************ 
%定义预测函数
%************************************ 
%function y=yuce(t); 
%global a b k 
%y=k*a.^(b.^t);

%Logistic 曲线(生长曲线)
%clc,clear
global a b k 
load xsh.txt %原始数据存放在纯文本文件 xsh.txt 中
%yt=1./xsh;n=length(yt);m=n/3;
%s1=sum(yt(1:m)),s2=sum(yt(m+1:2*m)),s3=sum(yt(2*m+1:end))
%b=((s3-s2)/(s2-s1))^(1/m)
%a=(s2-s1)*(b-1)/(b*(b^m-1)^2)
%k=(s1-a*b*(b^m-1)/(b-1))/m
%y=yuce(1:18) 
%************************************ 
%定义预测函数
%************************************ 
%function y=yuce(t); 
%global a b k 
%y=1./(k+a*b.^t);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值