GM(1,1)灰色预测模型是灰色系统理论的一个基本模型,它是一种一次微分方程的预测模型。灰色系统理论是由中国科学家邓聿文在1982年提出的,用于处理小样本和不确定信息的问题。GM(1,1)模型主要用于处理含有不确定性的序列预测问题,特别适用于数据量小且变化趋势不明显的预测。
GM(1,1)模型的建立过程包括四个主要步骤:
-
累加生成:对原始数据序列进行一次累加生成,得到新的数据序列。
-
灰色微分方程建立:用累加生成的数据序列,建立灰色微分方程。
-
参数估计:利用最小二乘法对灰色微分方程中的参数进行估计。
-
预测:利用估计的参数对未来的值进行预测。
在实际应用中,GM(1,1)模型被广泛应用于经济预测、社会发展预测、资源规划等许多领域。
MATLAB实现代码如下:
clc;close all;clear all;warning off;%清除变量
rand('seed', 100);
randn('seed', 100);
format long g;
% 打开MATLAB
% 然后解压代码压缩文件到桌面的一个文件夹, 然后用MATLAB的open打开主程序(一般是main.m), 然后 点击一个绿色的小三角(或者按F5)运行代码, 弹出的对话框选第一个按钮(中文是"更改文件夹", 英文是"change folder"), 即可开始运行代码
%% data
x00=[9.82206683271661
24.4772574680286
30.2662651563372
42.1184825590432
48.3363698391879
58.3678872307613
64.0806874051135
75.1132177417694
84.8505859178727
96.7975216856215
104.946970240188
108.728826844473
126.392775054738
130.37034498638
137.388186092669
152.243659491764
154.185078081295
169.607312331725
177.098359295213
185.124674642051]';% 行向量
m=6;% 预测期数
M=length(x00);% The total data length
K=M-m;% 训练期数
%% GM(1,1)
[a,u,y_pre_gm_train,y_pre_gm_test,T1,T2]=myGMfun(x00,K);%
figure;
plot(T1,'bo-');
hold on;
plot(y_pre_gm_train,'r*-');
legend({'实际值','gm预测值'},'fontname','宋体');
xlabel('测试样本号','fontname','宋体');
ylabel('目标值','fontname','宋体');
title('gm预测的结果','fontname','宋体');
figure;
plot(T2,'bo-');
hold on;
plot(y_pre_gm_test,'r*-');
legend({'实际值','gm预测值'},'fontname','宋体');
xlabel('测试样本号','fontname','宋体');
ylabel('目标值','fontname','宋体');
title('gm预测的结果','fontname','宋体');
figure;
plot(y_pre_gm_test-T2,'bo-');
legend({'绝对误差'},'fontname','宋体');
xlabel('测试样本号','fontname','宋体');
ylabel('绝对误差','fontname','宋体');
title('gm预测的绝对误差','fontname','宋体');
figure;
plot((y_pre_gm_test-T2)./T2*100,'bo-');
legend({'相对误差'},'fontname','宋体');
xlabel('测试样本号','fontname','宋体');
ylabel('相对误差(%)','fontname','宋体');
title('gm预测的相对误差','fontname','宋体');
y0=T2;
y1=y_pre_gm_test;
[R2_gm,MSE_gm,RMSE_gm,MAPE_gm,MAD_gm]=predictorsfun(y0,y1)
function [a,u,y_GMtrain,y_GMtest,T1,T2]=myGMfun(varargin)
%%
% x00
% K
% Pn
if length(varargin)==2 % 表示训练拟合
x00=varargin{1};
M=length(x00);% 总长度
K=varargin{2};
Pn=M-K;
else% 表示预测
x00=varargin{1};
M=length(x00);% 总长度
K=varargin{2};
Pn=varargin{3};
end
x0=x00(1:K);
x1=cumsum(x0);%%累加原始数据
yreal=x0(2:end);
dx=zeros(1,K-1);
for i=1:K-1
dx(i)=-(x1(i)+x1(i+1))/2;
end
% 初始化区间
B=zeros(K-1,2);
for i=1:K-1
B(i,1)=dx(i);
B(i,2)=1;
end
parm=inv(B'*B)*B'*yreal';%计算最优参数
a=parm(1);
u=parm(2);
Pnumber=K+Pn;%设置预测
xp1=zeros(1,Pnumber);
for t=1:Pnumber
xp1(t)=u/a+exp(-a*t)*(-u+x0(1)*a)/exp(-a)/a;
end
%% 计算xp0
xp0=zeros(1,Pnumber);
xp0(1)=xp1(1);
for i=2:length(xp1)
xp0(i)=xp1(i)-xp1(i-1);
end
if length(varargin)==2 % 表示训练拟合
if M>K
y_GMtrain=xp0(1:K);
y_GMtest=xp0(K+1:end);
T1=x00(1:(end-length(y_GMtest)));
T2=x00((end-length(y_GMtest)+1):end);
else %M==K
y_GMtrain=xp0;
y_GMtest=[];
T1=[];
T2=[];
end
else % 预测的情况
y_GMtrain=xp0(1:M);
y_GMtest=xp0(M+1:end);
end
程序结果如下:
R2_gm =
0.624495971831647
MSE_gm =
4518.54296590766
RMSE_gm =
67.2201083449563
MAPE_gm =
32.7071051108598
MAD_gm =
55.1961360456607
>>
完整代码: https://download.csdn.net/download/corn1949/88809291