MATLAB语言实现灰色预测(附完整代码和数据)

GM(1,1)灰色预测模型是灰色系统理论的一个基本模型,它是一种一次微分方程的预测模型。灰色系统理论是由中国科学家邓聿文在1982年提出的,用于处理小样本和不确定信息的问题。GM(1,1)模型主要用于处理含有不确定性的序列预测问题,特别适用于数据量小且变化趋势不明显的预测。

GM(1,1)模型的建立过程包括四个主要步骤:

  1. 累加生成:对原始数据序列进行一次累加生成,得到新的数据序列。

  2. 灰色微分方程建立:用累加生成的数据序列,建立灰色微分方程。

  3. 参数估计:利用最小二乘法对灰色微分方程中的参数进行估计。

  4. 预测:利用估计的参数对未来的值进行预测。

在实际应用中,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