其中: c 是常數項;




clc
clear
close all
data_year = load('C:\TW_population_year.txt');
data_people = load('C:\TW_population_people.txt');
data_year_95 = data_year(1:61) % 提高難度,由95年預測105年
x = data_people(1:61)
x_avg = mean(x)
% 標準差
mystd = sqrt ( ( sum( (x - mean(x)).^2 ) )/ length(x) )
Mstd = std(x)
% 變異數
myvar = ( sum( (x - mean(x)).^2 ) )/ length(x)
Mvar = var(x)
%% === AR Model 預測台灣歷年人口 ===
N = length(x)
for n=1:25
Y=x;
Y(1:n)=[];
m=N-n;
X=[];
for i=1:m
for j=1:n
X(i,j)=x(n+i-j);
end
end
%待估計AR係數(利用最小二乘法求出ar model的係數,順便檢定)
fai=inv(X'*X)*(X'*Y)
%方差
Delta(n)=(Y-X*fai)'*(Y-X*fai)/(N-n);
%FPE準則
criterion(n,1)=(N+n)*Delta(1,n)/(N-n);
%AIC準則
criterion(n,2)=N*log(Delta(1,n))+2*n;
%BIC準則
criterion(n,3)=N*log(Delta(1,n))+n*log(log(N));
end
% 檢定結果
figure(1)
DELTA = plot(Delta')
hold on
FPE = plot(criterion(1:n,1))
legend('delta','FPE')
figure(2)
hold on
AIC = plot(criterion(1:n,2)) % 基本上看AIC與BIC,且以AIC為主,越低表示fitting越好
BIC = plot(criterion(1:n,3))
legend('AIC','BIC')
%% 運用AR Model預測(最小二乘法)
figure(3)
data = iddata(x,[]);
plot(data,'o')
hold on
arsys1 = [1;-fai(1:25)]'
arsys = idpoly([arsys1],[]);
predict_period = 10
y_pre = forecast(arsys,data,predict_period);
yh = y_pre.OutputData
yh = [data_people(1:61);yh]
plot(yh,'r'), legend('original','forecasted')
title('最小二乘法')
%% 預測(Levinson-Durbin遞推算法)
figure(4)
data = iddata(x,[]);
plot(data,'o')
hold on
arsys1 = aryule(x,25);
arsys = idpoly([arsys1],[]);
predict_period = 10
y_pre = forecast(arsys,data,predict_period);
yh = y_pre.OutputData;
yh = [data_people(1:61);yh]
plot(yh,'r'), legend('original','forecasted')
title('Levinson-Durbin遞推算法')
%% 預測(burg法)
figure(5)
data = iddata(x,[]);
plot(data,'o')
hold on
arsys1 = arburg(x,25);
arsys = idpoly([arsys1],[]);
predict_period = 10
y_pre = forecast(arsys,data,predict_period);
yh = y_pre.OutputData;
yh = [data_people(1:61);yh]
plot(yh,'r'), legend('original','forecasted')
title('Burg法')
由檢定結果可以看出,選用AR(25)應該會得到較好的fitting效果。比較了三種不同的AR建模法後發現,Burg法看似較為可信,遞推法基本上已經被我推到地下室去了 ..
沒想到Burg法預測十年後的人口數準確度可以到1%以內的誤差,不過這也可能是因為人口變動數據本身就不劇烈所以較好預測。 總之結果還算滿意! 重點是搞懂了該如何用 Matlab 實做AR Model了
補充說明:
有鑒於對於 AR Model 的數學式子沒有很明白的交待,在此我使用 Matlab help 中的 arburg 函數來輔助我們更了解 AR Model。 以下內容部分截錄至 help 文件中
Use a vector of polynomial coefficients to generate an AR(4) process by filtering 1024 samples of white noise. Reset the random number generator for reproducible results. Use Burg's method to estimate the coefficients.
淺見:建立一個 white noise 並且我們利用一個全極點的濾波器來進行濾波,再來利用 Burg's method 來逆推出這個全極點的濾波器參數為何。
剛開始看到這個範例時一直摸不著頭緒,究竟這樣的用處為何,後來我換個角度思考。假設我們手邊具有一個訊號,並且我們想利用 AR Model 來對這個訊號進行數學建模,但考量到訊號在量測時通常會參雜著 white noise ,以至於我們沒辦法觀測到原始訊號長什麼樣子,此時就可以利用Burg's method 對原始信號進行建模,消去 white noise。
以下為Matlab 裡面的範例
由此處我們可以發現,利用 filter 函數建立一個無零點,極點為 A 係數組成的轉移函式對 0.2*randn(1024,1) 進行濾波。再來利用 arburg 對 y 進行四階擬合,回傳的 arcoeffs 可以看出來與 A 基本上是相符的。
個人註記:
使用 AR model 進行 power spectrum 估計。
%%利用Yule--Walker方法進行功率譜估計
A = [1 -2.7607 3.8106 -2.6535 0.9238];
figure(7)
x = randn(1000,1);
y = filter(1,A,x);
[Pxx,F] = pyulear(y,4,1024,1); %% AR power spectrum 估計
%% [Pxx,w] = pyulear(y,4); plot(w*fs/2/pi,Pxx) % 若使用具有normalized
hold on
plot(F,10*log10(Pxx))
AR_par = aryule(data_people,4)
[Pxx,F] = pyulear(y,15,1024,1); %% AR power spectrum 估計
plot(F,10*log10(Pxx))
AR_par = aryule(data_people,15)
[H,F] = freqz(1,A,[],1);
plot(F,20*log10(abs(H)))
xlabel('Frequency (Hz)')
ylabel('PSD (dB/Hz)')
legend('pyulear PSD Estimate(4)','pyulear PSD Estimate(15)','True Power Spectral Density')
參考連結於Matlab應用:不專業的統計基礎札記下方