數學建模中的ARMA模型和ARIMA模型的使用例項(含程式碼)

數學建模中的ARMA模型和ARIMA模型的使用例項(含程式碼)

數學建模中的ARMA模型和ARIMA模型的使用例項(含程式碼)

原文地址:http://blog.csdn.net/qq_34861102/article/details/77659399


對於較少時間段的時間預測,因為資料量較少,所以直接使用神經網路是不現實的,這裡用的比較多的是時間序列模型預測和灰色預測,這裡介紹一下時間序列中ARMA模型和ARIMA模型使用的實際例子


提供的一種誤差檢驗:
http://blog.csdn.net/qq_34861102/article/details/77930339

演算法流程圖:

這裡寫圖片描述


1. 原始資料

這裡寫圖片描述

這裡是前九天的資料流量,一共有216個記錄點

2. 尋找平穩時間序列

這裡使用的是消除季節性和消除趨勢以達到平穩時間序列的目的:

這裡是實現差分後的圖的表示:

這裡寫圖片描述

這裡我們使用的是消除季節性之後再消除趨勢之後的影象作為輸入的平穩時間序列

這裡不是用Matlab中金融工具箱中的平穩性檢驗的函式,給大家推薦一個可以直接使用的平穩性函式的檢驗adftest 檢驗序列得到的結果是1可以證明是平穩時間序列。

3. 選定差分序列之後定階層

這裡確定了ARMA模型的輸入的平穩時間序列之後選擇定階層。
這裡直接使用雙重for迴圈來找合適的階層

這裡選擇檢視不同的aic和bic來確定

當然可以使用自相關圖偏自相關圖進行判斷和檢驗
這裡有Matlab自帶的函式:

這裡寫圖片描述

4. 使用得到的ARMA模型之後反推ARIMA模型的引數估計

最後結果預測一天的示意圖:

這裡寫圖片描述

和之前的資料做比較之後,可以看到實驗的預測結果是擬合較好的


– 程式碼示例:

實現最佳階層的選擇:

s = 24; %週期是24
x = xixi';%初始資料的錄入
n = 24; %預報的個數
m1 = length(x); %原始的資料的個數
for i = s 1:m1;
y(i-s) = x(i) - x(i-s);%進行週期差分變換
end
w = diff(y); %消除趨勢性的差分運算
m2 = length(2);
for i = 0:6
for j = 0:6
if i == 0 & j == 0
continue
elseif i == 0
ToEstMd = arima('MALags',1:j,'Constant',0); %指定模型的結構
elseif j == 0
ToEstMd = arima('ARLags',1:i,'Constant',0); %指定模型的結構
else
ToEstMd = arima('ARLags',1:i,'MALags',1:j,'Constant',0); %指定模型的結構
end
k = k   1;
R(k) = i;
M(k) = j;
[EstMd,EstParamCov,LogL,info] = estimate(ToEstMd,w');%模型擬合
numParams = sum(any(EstParamCov));%計算擬合引數的個數
[aic(k),bic(k)] = aicbic(LogL,numParams,m2);
end
end
fprintf('R,M,AIC,BIC的對應值如下\n%f');%顯示計算結果
check  = [R',M',aic',bic']

開始用選定的階層進行預測(p = 5 q = 2):

x = xixi';
ToEstMd = arima('ARLags',1:5,'MALags',1:2,'Constant',0);%指定模型的結構
[EstMd,EstParamCov,LogL,info] = estimate(ToEstMd,w');%模型擬合 
w_Forecast = forecast(EstMd,n,'Y0',w');
yhat = y(end)   cumsum(w_Forecast); %一階差分的還原值
for j = 1:n
x(m1   j) = yhat(j)   x(m1 j-s); %x的預測值
end
x(m1 1:end)