声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3404|回复: 4

[综合讨论] 请教大家这段程序中关于predict函数的问题

[复制链接]
发表于 2011-4-7 20:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
最近接触到了用ARIMA模型进行时间序列预测,其中Xtrain是288个训练数据,Xfor是289个待预测的数据,Xtrain和Xfor的具体数据见附件,其中第一列是Xtrain,第二列是Xfor。程序如下:
SourceData=[Xtrain;Xfor];
nfor=size(Xfor,1); %待预测的数据个数
step=1; %1步预测
TempData=SourceData;
%----------差分,平稳化时间序列---------
[H,PValue,TestStat,CriticalValue] = dfARDTest(TempData,[],0.05,'T');
SaveDiffData=[];
while ~H
    SaveDiffData=[SaveDiffData;TempData(1,1)];%保存去掉的数
  TempData=diff(TempData);%差分,平稳化时间序列
  TempData2=TempData;
    [H,PValue,TestStat,CriticalValue] = dfARDTest(TempData,[],0.05,'T');%adf检验,判断时间序列是否平稳化
end
%------------模型定阶或识别------------
u = iddata(TempData(1:end-nfor));%训练数据
test = [];
for p = 1:10 %自回归对应PACF,给定滞后长度上限p和q
   for q = 1:10 %移动平均对应ACF
      m = armax(u,[p q]);
      AIC = aic(m); %armax(p,q),计算AIC
      test = [test;p q AIC];
   end
end
for k = 1:size(test,1) %没太理解。。。
   if test(k,3) == min(test(:,3)) %选择AIC值最小的模型
      p_test = test(k,1);
            q_test = test(k,2);
            break;
     end
end
%----------------1阶预测-----------------
n=iddata(TempData);
m = armax(u,[p_test q_test]); %armax(p,q),[p_test q_test]对应AIC值最小
P1=predict(m,n,step);
PreR=P1.OutputData;

%----------------还原差分-----------------
if size(SaveDiffData,2)~=0
     for index=size(SaveDiffData,1):-1:1
           PreR=cumsum([SaveDiffData(index);PreR]);
     end
end
tempx=PreR(size(SourceData,1)+1:size(PreR,1));           %最后计算得到的预测值
想请教各位大侠predict函数的原理是什么,我看了matlab help里的解释,还是不明白,这样编程的话结果是不是每次做一步预测的时候都用到了前一步的真实值?因为如果我把待预测的真实值Xfor全部置0的话结果就不一样了,说明predict函数在预报的时候使用到了前一步的真实值,可对于一次性预报后面289个点的情况,这289个点的值都是未知的呀,只能在每次做一步预测的时候使用前一步的预测值,要怎么编呢?matlab有没有实现这一功能的自带函数呢?如果自己编的话,是不是要设一个循环,让数据每次向前滚动一个数,并且每次都要重新用armax函数重新建模,在用predict函数对下一时刻进行预报??我试着这样编了一下,发现效率太低,请问各位大侠这样做对不对,有没有更好的办法?谢谢大家了!!!

1.txt

15.52 KB, 下载次数: 10

回复
分享到:

使用道具 举报

发表于 2011-4-9 01:07 | 显示全部楼层
回复 1 # wy1118 的帖子

好奇问下, Xtrain是288个训练数据,Xfor是289个待预测的数据
可以SourceData=[Xtrain;Xfor]; ??
 楼主| 发表于 2011-4-9 11:33 | 显示全部楼层
回复 2 # ChaChing 的帖子

对不起,我之前搞错了,应该SourceData=Xtrain;我把程序修改了一下,
clear all
clc
close all
a=load('1.dat');
Xtrain=a(1:288);
Xfor=a(289:end);
SourceData=Xtrain;
nfor=size(Xfor,1); %待预测的数据个数
step=1; %1步预测
TempData=SourceData;
%----------差分,平稳化时间序列---------
[H,PValue,TestStat,CriticalValue] = dfARDTest(TempData,[],0.05,'T');
SaveDiffData=[];
while ~H
    SaveDiffData=[SaveDiffData;TempData(1,1)];%保存去掉的数
  TempData2=diff([TempData;Xfor]);%差分,平稳化时间序列
  
  TempData=TempData2(1:end-nfor);
    [H,PValue,TestStat,CriticalValue] = dfARDTest(TempData,[],0.05,'T');%adf检验,判断时间序列是否平稳化
end
%------------模型定阶或识别------------
u = iddata(TempData);%训练数据
test1 =[ ];
for p = 1:10 %自回归对应PACF,给定滞后长度上限p和q
   for q = 1:10 %移动平均对应ACF
      m = armax(u,[p q]);
      AIC = aic(m); %armax(p,q),计算AIC
      test1 = [test1;p q AIC];
   end
end
for k = 1:size(test1,1) %没太理解。。。
   if test1(k,3) == min(test1(:,3)) %选择AIC值最小的模型
      p_test = test1(k,1);
            q_test = test1(k,2);
            break;
     end
end
%----------------1阶预测-----------------
n=iddata(TempData2);
m = armax(u,[p_test q_test]); %armax(p,q),[p_test q_test]对应AIC值最小
P1=predict(m,n,step);
PreR=P1.OutputData;

%----------------还原差分-----------------
if size(SaveDiffData,2)~=0
     for index=size(SaveDiffData,1):-1:1
           PreR=cumsum([SaveDiffData(index);PreR]);
     end
end
tempx=PreR(size(SourceData,1)+1:size(PreR,1));           %最后计算得到的预测值
同样,1.dat文件里有一列数据,前288个是训练数据,后289是待预测的数据真实值,想请问各位,这样编对不对?是不是在每次的一步预测的过程中用到了上一步的真实值?

1.dat

16.08 KB, 下载次数: 9

发表于 2011-4-14 19:45 | 显示全部楼层
回复 3 # wy1118 的帖子

predict函数返回值为iddata对象,他不满足数学加减法,但是可以用plot绘制出值来!我现在对两个数据进行predict,然后想把预测结果加起来,怎么做?
发表于 2011-6-25 15:54 | 显示全部楼层
回复 4 # aishuishou 的帖子

x=predict(...);
y=x.outputdata;
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 10:47 , Processed in 0.054002 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表