用MATLAB的灰色預(yù)測GM(1,1)模型
程序如下
%程序中的變量定義;alpha是包含 值的矩陣;ago是預(yù)測后累加值矩陣;var是預(yù)測值矩陣;error是殘差矩陣;c是后驗差比值
function gm1(x); %定義函數(shù)gm1(x)
clc %清屏,以使結(jié)果獨立顯示
format long; %設(shè)置計算精度
if length(x(:,1))==1 %對輸入矩陣進(jìn)行判斷,如不是一維列矩陣,進(jìn)行轉(zhuǎn)置變換
x=x';
end
n=length(x); %取輸入數(shù)據(jù)的樣本量
z=0;
for i=1:n %計算累加值,并將值賦予矩陣be
z=z+x(i,:);
be(i,:)=z;
end
for i=2:n %對原始數(shù)列平行移位
y(i-1,:)=x(i,:);
end
for i=1:n-1 %計算數(shù)據(jù)矩陣B的第一列數(shù)據(jù)
c(i,:)=-0.5*(be(i,:)+be(i+1,:));
end
for j=1:n-1 %計算數(shù)據(jù)矩陣B的第二列數(shù)據(jù)
e(j,:)=1;
end
for i=1:n-1 %構(gòu)造數(shù)據(jù)矩陣B
B(i,1)=c(i,:);
B(i,2)=e(i,:);
end
alpha=inv(B'*B)*B'*y; %計算參數(shù) 矩陣
for i=1:n+1 %計算數(shù)據(jù)估計值的累加數(shù)列,如改為n+1為n+m可預(yù)測后m-1個值
ago(i,:)=(x(1,:)-alpha(2,:)/alpha(1,:))*exp(-alpha(1,:)*(i-1))+alpha(2,:)/alpha(1,:);
end
var(1,:)=ago(1,:)
for i=1:n %如改n為n+m-1,可預(yù)測后m-1個值
var(i+1,:)=ago(i+1,:)-ago(i,:); %估計值的累加數(shù)列的還原,并計算出下一預(yù)測值
end
for i=1:n
error(i,:)=var(i,:)-x(i,:); %計算殘差
end
c=std(error)/std(x); %調(diào)用統(tǒng)計工具箱的標(biāo)準(zhǔn)差函數(shù)計算后驗差的比值c
ago %顯示輸出預(yù)測值的累加數(shù)列
alpha %顯示輸出參數(shù) 數(shù)列
var %顯示輸出預(yù)測值
error %顯示輸出誤差
c %顯示后驗差的比值c
這代碼怎么用?好像有點錯
提問者: 莫寒0312 - 見習(xí)魔法師 二級
最佳答案
樓主,我試了下,沒錯啊,這段代碼你不能全部復(fù)制到matlab的命令窗口中去
首先,你得把矩陣X賦值,X不是你要處理的數(shù)據(jù)么?沒有X程序運行不下去,
然后,將矩陣X賦值后你只需要復(fù)制下面這段代碼就OK了
clc %清屏,以使結(jié)果獨立顯示
format long; %設(shè)置計算精度
if length(x(:,1))==1 %對輸入矩陣進(jìn)行判斷,如不是一維列矩陣,進(jìn)行轉(zhuǎn)置變換
x=x';
end
n=length(x); %取輸入數(shù)據(jù)的樣本量
z=0;
for i=1:n %計算累加值,并將值賦予矩陣be
z=z+x(i,:);
be(i,:)=z;
end
for i=2:n %對原始數(shù)列平行移位
y(i-1,:)=x(i,:);
end
for i=1:n-1 %計算數(shù)據(jù)矩陣B的第一列數(shù)據(jù)
c(i,:)=-0.5*(be(i,:)+be(i+1,:));
end
for j=1:n-1 %計算數(shù)據(jù)矩陣B的第二列數(shù)據(jù)
e(j,:)=1;
end
for i=1:n-1 %構(gòu)造數(shù)據(jù)矩陣B
B(i,1)=c(i,:);
B(i,2)=e(i,:);
end
alpha=inv(B'*B)*B'*y; %計算參數(shù) 矩陣
for i=1:n+1 %計算數(shù)據(jù)估計值的累加數(shù)列,如改為n+1為n+m可預(yù)測后m-1個值
ago(i,:)=(x(1,:)-alpha(2,:)/alpha(1,:))*exp(-alpha(1,:)*(i-1))+alpha(2,:)/alpha(1,:);
end
var(1,:)=ago(1,:)
for i=1:n %如改n為n+m-1,可預(yù)測后m-1個值
var(i+1,:)=ago(i+1,:)-ago(i,:); %估計值的累加數(shù)列的還原,并計算出下一預(yù)測值
end
for i=1:n
error(i,:)=var(i,:)-x(i,:); %計算殘差
end
c=std(error)/std(x) %調(diào)用統(tǒng)計工具箱的標(biāo)準(zhǔn)差函數(shù)計算后驗差的比值c