国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Arma模型預(yù)測(cè)時(shí)間序列的Matlab實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了Arma模型預(yù)測(cè)時(shí)間序列的Matlab實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??Arma模型預(yù)測(cè)算法在兩年之前有看過,當(dāng)時(shí)沒有太仔細(xì)看沒能理解,最近結(jié)合網(wǎng)上幾篇比較Nice 的關(guān)于ARMA && ARIMA算法的博客,對(duì)該算法有了進(jìn)一步了解,將自己的理解進(jìn)行整理。

1 概述

??Arma模型(自回歸移動(dòng)平均模型)是時(shí)間序列分析中常用的模型之一,它可以用于預(yù)測(cè)未來的時(shí)間序列值。Arma模型的核心思想是將時(shí)間序列看作是自回歸和移動(dòng)平均過程的組合。其中,自回歸過程指的是時(shí)間序列值與其前一時(shí)刻值之間的關(guān)系;移動(dòng)平均過程指的是時(shí)間序列值與其前一時(shí)刻的噪聲誤差之間的關(guān)系。

Arma模型可以表示為ARMA(p, q),其中p表示自回歸項(xiàng)的階數(shù),q表示移動(dòng)平均項(xiàng)的階數(shù)。具體地,Arma模型可以寫成如下形式:

Y t = α 1 Y t ? 1 + α 2 Y t ? 2 + . . . + α p Y t ? p + ? t + β 1 ? t ? 1 + β 2 ? t ? 2 + . . . + β q ? t ? q Y_t=\alpha_1Y_{t-1}+\alpha_2Y_{t-2}+...+\alpha_pY_{t-p}+\epsilon_t+\beta_1\epsilon_{t-1}+\beta_2\epsilon_{t-2}+...+\beta_q\epsilon_{t-q} Yt?=α1?Yt?1?+α2?Yt?2?+...+αp?Yt?p?+?t?+β1??t?1?+β2??t?2?+...+βq??t?q?

??其中, Y t Y_t Yt?表示時(shí)間序列在時(shí)刻t的值, ? t \epsilon_t ?t?表示在時(shí)刻t的噪聲誤差, α 1 \alpha_1 α1? α p \alpha_p αp? β 1 \beta_1 β1? β q \beta_q βq?分別表示自回歸系數(shù)和移動(dòng)平均系數(shù)。

??Arma模型可以用于對(duì)時(shí)間序列進(jìn)行預(yù)測(cè)和模擬,通常使用最小二乘法或極大似然法來估計(jì)模型參數(shù)。同時(shí),Arma模型也可以通過對(duì)模型殘差的分析來檢驗(yàn)?zāi)P偷臄M合程度和合理性。
??更加詳細(xì)的理論可以參考這篇博文

2 算法主要流程 及 測(cè)試方案

??練習(xí)時(shí)沒有使用真實(shí)時(shí)間序列,因?yàn)檎鎸?shí)序列的周期項(xiàng)、趨勢(shì)項(xiàng)中包含隨機(jī)誤差影響不可控,使不能夠直觀準(zhǔn)確反應(yīng)預(yù)測(cè)效果,這里使用模擬的時(shí)間序列進(jìn)行測(cè)試,考慮到一個(gè)完整的序列是由周期項(xiàng)、半周期項(xiàng)、趨勢(shì)項(xiàng)和隨機(jī)誤差組成,所以在模擬的時(shí)候?qū)@些因素都進(jìn)行了考慮;下面簡(jiǎn)單介紹下Arma的流程和測(cè)試的幾種方案下得到的的結(jié)果。

主要流程

  • 加載時(shí)間序列,檢驗(yàn)序列是否平穩(wěn),常見的平穩(wěn)性檢驗(yàn)方法是adf和kpss檢驗(yàn),兩種檢驗(yàn)方法可能對(duì)同一序列有不同檢驗(yàn)結(jié)果;
%% matlab自帶
ad1 = adftest(a4); % 1平穩(wěn) 0非平穩(wěn)
ad2 = kpsstest(a4); % 0 平穩(wěn)  1 非平穩(wěn)
  • 如果檢驗(yàn)顯示序列非平穩(wěn),對(duì)序列進(jìn)行差分直至序列達(dá)到平穩(wěn)為止,一般差分1次就能滿足平穩(wěn)性要求;
%% 對(duì)時(shí)間序列進(jìn)行差分,并記錄差分了幾次
	count = 0;
    arr1 = a4; 
    while true
        arr21 = diff(arr1);
        count = count + 1;
        ad1 = adftest(arr21); % 1平穩(wěn) 0非平穩(wěn)
        ad2 = kpsstest(arr21); % 0 平穩(wěn)  1 非平穩(wěn)
        if ad1==1 && ad2 == 0
            break
        end
        arr1 = arr21;
    end
  • 模型定階:定階對(duì)預(yù)測(cè)結(jié)果還是比較重要的。參考博文,一般都是先看自相關(guān)(ACF) 和 偏相關(guān)(PACF)圖,根據(jù)拖尾和截尾可以人工選擇一個(gè)合適的階數(shù);如果人工選擇比較困難,可以根據(jù)AIC、BIC準(zhǔn)則定階,具體理論可參考其他博文;
% 自相關(guān)和偏相關(guān)圖
    figure(2)
    subplot(2,1,1)
    coll1 = autocorr(arr22);   
    stem(coll1)%繪制經(jīng)線圖
    title('自相關(guān)')

    subplot(2,1,2)
    coll2 = parcorr(arr22);   
    stem(coll2)%繪制經(jīng)線圖
    title('偏相關(guān)')

% Aic準(zhǔn)則
	value = aic(AmMode);
  • 序列預(yù)測(cè):在預(yù)測(cè)的時(shí)候要考慮序列是否進(jìn)行過差分(diff),因?yàn)榉瞧椒€(wěn)序列差分后進(jìn)行預(yù)測(cè)的,預(yù)測(cè)結(jié)果也是差分后的結(jié)果,此時(shí)要對(duì)序列還原 才能得到原序列的預(yù)測(cè);
    % 預(yù)測(cè)
    aaa = predict(model, arr2, ntest); %利用arr2去向后預(yù)測(cè)
    % 序列還原
    hhh = cumsum([a4(1);difvalue]);%還原差分

幾種方案
??由于時(shí)間序列是模擬的,所以可以控制生成周期、周期+趨勢(shì)、周期+趨勢(shì)+噪聲、周期+噪聲這幾個(gè)類型的時(shí)間序列,根據(jù)對(duì)不同序列的預(yù)測(cè)效果,可以看到ARMA對(duì)不同序列的適用性;

a. 純周期序列
??對(duì)比發(fā)現(xiàn),周期序列的預(yù)測(cè)效果較好;

arma模型matlab,matlab,開發(fā)語言,算法,數(shù)學(xué)建模,學(xué)習(xí)方法
預(yù)測(cè)結(jié)果

b. 純周期+噪聲
??這種情況下,預(yù)測(cè)效果就沒有特別好了,所以在一些情況下可以對(duì)序列進(jìn)行濾波后再進(jìn)行預(yù)測(cè);

arma模型matlab,matlab,開發(fā)語言,算法,數(shù)學(xué)建模,學(xué)習(xí)方法
預(yù)測(cè)結(jié)果

c. 純周期+趨勢(shì)+噪聲
??這種情況預(yù)測(cè)效果不太好;

arma模型matlab,matlab,開發(fā)語言,算法,數(shù)學(xué)建模,學(xué)習(xí)方法
預(yù)測(cè)結(jié)果

d. 周期+趨勢(shì)
??沒有噪聲時(shí)這個(gè)預(yù)測(cè)結(jié)果也是可以的。

arma模型matlab,matlab,開發(fā)語言,算法,數(shù)學(xué)建模,學(xué)習(xí)方法
預(yù)測(cè)結(jié)果

所以,經(jīng)過對(duì)比能看出,噪聲對(duì)預(yù)測(cè)結(jié)果影響較大,沒有噪聲的情況下,ARMA/ARIMA的預(yù)測(cè)效果大概有一定可信性。

3 Matlab代碼運(yùn)行程序

%% 主程序
%% 1 生成模擬信號(hào)
clear;
n = 132; % 模擬11年的數(shù)據(jù),用10年的數(shù)據(jù)作為訓(xùn)練值
ntest = 12;  %用最后1年數(shù)據(jù)作為預(yù)測(cè)比對(duì)值
x = 1:n;

% 周期信號(hào)
a1 = cos(2*pi*x/12) + 0.6 * sin(2*pi*x/24);
figure(1)
subplot(2,2,1)
plot(x,a1); 
title('a1 周期信號(hào)')

% 趨勢(shì)信號(hào)
subplot(2,2,2);
x2=0.14;
a2 = mapminmax(x2 * x,0,1);
plot(x,a2);
title('a2 趨勢(shì)信號(hào)')

% 隨機(jī)信號(hào)(0-1的隨機(jī)值)
subplot(2,2,3)
a3 = rand(1,n);
plot(x,a3);
title('a3 隨機(jī)信號(hào)')

% 三種信號(hào)疊加 生成模擬信號(hào)
subplot(2,2,4) % 
%a41 = 2 .* a1; % 1 只有周期項(xiàng)
%a41 = 2 .* a1 + 3.2 * a3; % 2 周期 + 隨機(jī)
%a41 = 2 .* a1 + 5 * a2 + 3.2 * a3; % 3 周期 + 趨勢(shì) + 隨機(jī)
a41= 2 .* a1 + 5 * a2;
plot(x,a41);
title('a4 疊加序列')

%% 平穩(wěn)檢驗(yàn)
a4 = a41(1:n-ntest);
ad1 = adftest(a4); % 1平穩(wěn) 0非平穩(wěn)
ad2 = kpsstest(a4); % 0 平穩(wěn)  1 非平穩(wěn)

if (ad1 == 1 && ad2 == 0)
   % 平穩(wěn)
   type = 3;
else
    % 非平穩(wěn)
    type = 4;
end
 
%% type 可以自行輸入
switch type
    case 1
        datas = 0;
    case 2
        datas = 0;
    case 3 % 平穩(wěn)序列 arma
        datas = function_arma(a4,ntest);
        %% 繪圖
        figure(3)
        plot(1:n,a41,'--','LineWidth',1)
        hold on
        plot((n-ntest)+1:n,datas((n-ntest)+1:n),'--','LineWidth',1.5)
        hold on
        xlabel('time')
        ylabel('value')
        legend('真實(shí)值','預(yù)測(cè)值')
    case 4 % 非平穩(wěn)序列 arima
        [Y,lower,upper] = function_arima(a4,ntest);
        
        figure(3);
        plot(1:n,a41,'--','LineWidth',1)
        hold on;
        plot( (n - ntest+1 : n), Y, 'g', 'LineWidth', 1);
end 
%% 平穩(wěn)平穩(wěn) arma預(yù)測(cè)
%% a4訓(xùn)練數(shù)據(jù) ntest預(yù)測(cè)長度
function data = function_arma(a4,ntest)
    %自相關(guān)、偏自相關(guān)
    figure(2)
    subplot(2,1,1)
    coll1 = autocorr(a4);   
    stem(coll1)%繪制經(jīng)線圖
    title('自相關(guān)')

    subplot(2,1,2)
    coll2 = parcorr(a4);   
    stem(coll2)%繪制經(jīng)線圖
    title('偏相關(guān)')
    
    %
    count2 = length(a4);
    limvalue = round(count2 / 10);
    if(limvalue > 10)
        limvalue = 10;
    end
    % 計(jì)算最佳的p 和 q
    [bestp,bestq] = Select_Order_arma(a4, limvalue, limvalue);
    
    % 得到最佳模型
    xa4 = iddata(a4');
    model = armax(xa4,[bestp,bestq]);
    
    % 開始預(yù)測(cè),獲取預(yù)測(cè)數(shù)據(jù)
    arr1 = [a4';zeros(ntest,1)];
    arr2 = iddata(arr1);
    arr3=predict(model, arr2, ntest); %利用arr2去向后預(yù)測(cè)
    arr4 = get(arr3);
    dataPre = arr4.OutputData{1,1}(length(a4)+1:length(a4)+ntest);
    data=[a4';dataPre]; % 獲取訓(xùn)練結(jié)果加預(yù)測(cè)結(jié)果
end 

%% Arma找最優(yōu)階數(shù)
function [p1,p2] = Select_Order_arma(x2, limp, limq)
    array = zeros(limp, limq);
    x = iddata(x2');
    for i =1:limp
        for j = 1:limq 
            AmMode = armax(x,[i,j]);
            value = aic(AmMode);
            array(i,j) = value;
        end
    end
    
    [p1,p2]=find(array==min(min(array)));
end 

%% ARIMA
%% 非平穩(wěn)序列
function [preData,LLL,UUU] = function_arima(a4,ntest)
    % 差分
    count = 0;
    arr1 = a4; 
    while true
        arr21 = diff(arr1);
        count = count + 1;
        ad1 = adftest(arr21); % 1平穩(wěn) 0非平穩(wěn)
        ad2 = kpsstest(arr21); % 0 平穩(wěn)  1 非平穩(wěn)
        if ad1==1 && ad2 == 0
            break
        end
        arr1 = arr21;
    end
    
    arr22 = arr21';
    % 自相關(guān)
    figure(2)
    subplot(2,1,1)
    coll1 = autocorr(arr22);   
    stem(coll1)%繪制經(jīng)線圖
    title('自相關(guān)')

    subplot(2,1,2)
    coll2 = parcorr(arr22);   
    stem(coll2)%繪制經(jīng)線圖
    title('偏相關(guān)')
    
    % 此時(shí)是平穩(wěn)的
    count2 = length(arr22);
    limvalue = round(count2 / 10);
    if(limvalue > 3)
        limvalue = 3;
    end
    % 計(jì)算最佳的p 和 q
    [bestp,bestq] = Select_Order_arima(arr22, limvalue, limvalue, count);
    
    modelo = arima(bestp,count,bestq);
    md1 = estimate(modelo, arr22);
    [Y, YMSE] = forecast(md1, ntest, 'Y0', arr22);
    
    lower = Y - 1.96*sqrt(YMSE); %95置信區(qū)間下限
    upper = Y + 1.96*sqrt(YMSE); 
    
    difvalue = [arr22;Y]; %差分序列
    difvalueL = [arr22;lower];
    difvalueU = [arr22;upper];
    count2 = length(a4);
    if(count >=1)
        hhh = cumsum([a4(1);difvalue]);%還原差分值  
        LLL1 = cumsum([a4(count2);difvalueL]);
        UUU1 = cumsum([a4(count2);difvalueU]);
    end  
    preData = hhh(length(a4)+1 : (length(a4) + ntest));    
    LLL = LLL1(length(a4)+1 : (length(a4) + ntest));
    UUU = UUU1(length(a4)+1 : (length(a4) + ntest));
end 

%% Arima找最優(yōu)階數(shù)
function [best_p,best_q] = Select_Order_arima(data, pmax, qmax, d)
    min_aic = Inf;
    min_bic = Inf;
    best_p = 0;
    best_q = 0;
    for p=0:pmax
        for q=0:qmax
            model = arima(p,d,q);
            try
                [fit,~,logL]=estimate(model,data);
                [aic, bic] = aicbic(logL, p + q + 1, length(data));
            catch
                continue
            end
            
            if aic < min_aic
                min_aic = aic;
                min_bic = bic;
                best_p = p;
                best_q = q;
            end
            
        end
    end
end 

4 總結(jié)

??通過此次練習(xí),對(duì)ARMA的預(yù)測(cè)過程基本了解,寫Matlab程序的時(shí)候參考了一些博文的邏輯,如有錯(cuò)誤可以進(jìn)行探討。文章來源地址http://www.zghlxwxcb.cn/news/detail-763804.html

到了這里,關(guān)于Arma模型預(yù)測(cè)時(shí)間序列的Matlab實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包