灰色预测GM(1,1)Matlab实现

一、介绍:灰色预测是指利用 GM 模型对系统行为特征的发展变化规律进行估计预测。
二、灰色预测的步骤:
1.数据的检验与处理:
首先为了保证使用灰色预测模型的可行性,需要先做级比检验。
原 始 数 据 为 : x ( 0 ) = ( x ( 0 ) ( 1 ) , x ( 0 ) ( 2 ) , . . . , x ( 0 ) ( n ) ) 数 列 的 级 比 为 : λ ( k ) = x ( 0 ) ( k − 1 ) x ( 0 ) ( k ) , k = 2 , 3 , . . . n . 原始数据为: x^{(0)}=(x^{(0)}(1),x^{(0)}(2),...,x^{(0)}(n))\\ \\ 数列的级比为: \lambda(k)=\frac{x^{(0)}(k-1)}{x^{(0)}(k)}, k=2,3,...n. x(0)=(x(0)(1),x(0)(2),...,x(0)(n))λ(k)=x(0)(k)x(0)(k1),k=2,3,...n.
如果所有的级比λ(k)满足以下公式,则数列x(0)可以作为模型进行灰色预测。
e − 2 n + 1 < λ ( k ) < e 2 n + 1 e^{-\frac{2}{n+1}}<\lambda(k)<e^{\frac{2}{n+1}} en+12<λ(k)<en+12
若不满足条件,需要进行平移变换:
y ( 0 ) ( k ) = x ( 0 ) ( k ) + c , k = 1 , 2 , . . . , n y^{(0)}(k)=x^{(0)}(k)+c,k=1,2,...,n y(0)(k)=x(0)(k)+c,k=1,2,...,n
使平移后新数列的级比在条件。

2.建立模型:
建立模型GM(1,1),则可以得到预测值:
x ^ ( 1 ) ( k + 1 ) = ( x ( 0 ) ( 1 ) − b a ) e − a k + b a , k = 1 , 2 , . . . , n − 1 \hat{x}^{(1)}(k+1)=(x^{(0)}(1)-\frac{b}{a})e^{-ak}+\frac{b}{a},k=1,2,...,n-1 x^(1)(k+1)=(x(0)(1)ab)eak+ab,k=1,2,...,n1
而且
x ^ ( 0 ) ( k + 1 ) = x ^ ( 1 ) ( k + 1 ) − x ^ ( 1 ) ( k ) , k = 1 , 2 , . . . , n − 1 \hat{x}^{(0)}(k+1)=\hat{x}^{(1)}(k+1)-\hat{x}^{(1)}(k),k=1,2,...,n-1 x^(0)(k+1)=x^(1)(k+1)x^(1)(k),k=1,2,...,n1

3.检测预测值:
(1)残差检验:令残差为ε(k),计算:
ε ( k ) = x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) x ( 0 ) ( k ) , k = 1 , 2 , . . . , n − 1 \varepsilon(k)=\frac{x^{(0)}(k)-\hat{x}^{(0)}(k)}{x^{(0)}(k)},k=1,2,...,n-1 ε(k)=x(0)(k)x(0)(k)x^(0)(k),k=1,2,...,n1
如果ε(k)<0.2,则可认为达到一般要求;如果ε(k)<0.1,则认为达到较高要求;
(2)级比偏差值检验:由级比数据λ(k)和发展系数a计算得到:
ρ ( k ) = 1 − 1 − 0.5 a 1 + 0.5 a λ ( k ) \rho(k)=1-\frac{1-0.5a}{1+0.5a}\lambda(k) ρ(k)=11+0.5a10.5aλ(k)
如果ρ(k)<0.2,则可认为达到一般要求;如果ρ(k)<0.1,则认为达到较高要求。

Matlab代码:
1.GM1_1函数:

function y = GM1_1(x0,num)
% @brief,GM(1,1)灰色预测模型
% @param,x为待预测的数据
% @param,num为待预测值的数目
% @return,y为[原结果,预测结果]

n = length(x0);
y = zeros(1,n+num);

%% 1.级比检验
% 求级比
lambda = x0(1:n-1)./x0(2:n);

% 级比判断,这里注意需要在后面减去c
minL = exp(-2/(n+1));
maxL = exp(2/(n+1));
c = 0;
while min(lambda) < minL && max(lambda) > maxL
    c = c + 0.1;
    x0 = x0 + c;
    lambda = x0(1:n-1)./x0(2:n);
    if c > 10
        error('无法通过级比检验');
    end
end
%% 2.GM(1,1)建模
% 对原始数据作一次累加
x1 = cumsum(x0);

% 构造数据矩阵B及数据向量Y
alpha = 0.5;
B = [-(alpha*x1(1:end-1)+(1-alpha)*x1(2:end))',ones(n-1,1)];
Y = x0(2:end)';

% 计算u
u = B\Y;
a = u(1);
b = u(2);

% 建立模型
% --------------------方式一:直接解微分方程--------------------
% symbol1 = dsolve('Dx+a*x=b','x(0)=x0');
% symbol1 = subs(symbol1,{'a','b','x0'},{u(1),u(2),x1(1)});
% digits(6),symbol2 = vpa(symbol1);% 为了提高精度,先计算预测值,再显示微分方程的解
% y = subs(symbol2,'t',0:n+num);

% --------------------方式二:采用近似得到的公式--------------------
tmp = b/a;
y(2:n+num) = (x0(1)-tmp).*exp(-a*(1:n+num-1))+tmp;
y(1) = x1(1);

y = [y(1),y(2:end)-y(1:end-1)];
y = y - c;

%% 3.模型检验
% 计算残差
epsilon = (x0 - y(1:n))./x0;
val = max(abs(epsilon));
if val < 0.1
    fprintf("残差检验结果为%.4f,达到较高的要求。\n",val);
elseif val < 0.2
    fprintf("残差检验结果为%.4f,达到一般要求。\n",val);
else 
    fprintf("残差检验结果为%4.f,无法达到要求\n",val);
end

% 级比偏差检验
rho = 1 - (1-0.5*a)/(1+0.5*a)*lambda;
val = max(abs(rho));
if val < 0.1
    fprintf("级比偏差值检验结果为%.4f,达到较高的要求。\n",val);
elseif val < 0.2
    fprintf("级比偏差值检验结果为%.4f,达到一般要求。\n",val);
else 
    fprintf("级比偏差值检验结果为%4.f,无法达到要求\n",val);
end

% 计算百分绝对误差
det = mean(abs(y(2:n)-x0(2:n)));
fprintf("百分绝对误差为%.4f%%\n",det);

% 相对残差Q检验
% 计算相对误差序列
delta = abs(epsilon./x0);
% 计算相对误差Q
Q = mean(delta);
fprintf('相对残差Q检验为%.4f\n',Q);

% 方差比C检验
C = std(epsilon, 1)/std(x0, 1);
fprintf('方差比C检验为%.4f\n',C);

% 小误差概率P检验
S1 = std(x0, 1);
tmp = find(abs(epsilon - mean(epsilon))< 0.6745 * S1);
P = length(tmp)/n;
fprintf('小误差概率P检验为%.4f\n',P);

2.主函数:

clc;
clear;

x0 = [71.1 72.4 72.4 72.1 71.4 72.0 71.6];
n = length(x0);
num = 1;
y = round(GM1_1(x0,1),num);
plot(1986:1992,x0,'^r',1986:1993,y,'*b');
xlabel("年份");ylabel("道路交通噪声平均声级数据");
title("北方某城市道路交通噪声平均声级数据");

3.运行结果:
在这里插入图片描述

  • 4
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
灰色GM(1,N)模型是一种用于描述多个变量之间关系和发展的预测模型。该模型以自变量的发展动态为基础,将因变量表现为自变量的函数,以达到预测观察对象的目的。在MATLAB中,可以通过以下步骤实现该模型的预测: 1. 读取数据:使用xlsread函数读取数据文件,将需要预测的因变量存储为A,自变量存储为x0。 2. 紧邻均值生成序列:根据原始数据计算紧邻均值生成序列Z,其中Z(i)为xi(1)的紧邻均值。 3. 原始数据累加:使用双重循环将原始数据一次累加,得到xi(1)的值。 4. 构建GM(1,N)模型:根据公式建立GM(1,N)模型,其中a为常数项,b为参数向量。 5. 预测值计算:使用模型参数计算预测值F,其中F(k)为第k年的预测值。 6. 还原原序列:将预测值与前一年的预测值做差,得到还原原序列的预测数据G。 7. 绘制图表:使用plot函数将真实值和预测值绘制成曲线图,以展示预测结果。 下面是MATLAB代码示例: ```matlab clc; clear all; [num] = xlsread('C:\Users\Administrator\Desktop\G(1,n)\2011-2018 年地铁运营事故原因因素数据.xlsx')'; A = num(:, 1)'; x0 = num(:, 2:10)'; [n, m] = size(x0); AGO = cumsum(A); T = 1; x1 = zeros(n, m, T); for k = 2:m Z(k) = (AGO(k) - AGO(k-1)) / 2; end for i = 1:n for j = 1:m for k = 1:j x1(i, j) = x1(i, j) * x0(i, k); end end end x11 = x1(:, 1:m); X = x1(:, 2:m)'; Yn = A; Yn(1) = []; Yn = Yn'; Z = Z(:, 2:m); B = [-Z', X]; C = ((B' * B) \ (B' * Yn))'; a = C(1); b = C(:, 2:n-1); F = []; F(1) = A(1); u = zeros(1, m); for i = 1:m for j = 1:n u(i) = u(i) + (b(j) * x11(j, i)); end end for k = 2:m F(k) = (A(1) - u(k) / a) * exp(-a * (k-1)) + u(k) / a; end G = []; G(1) = A(1); for k = 2:m G(k) = F(k) - F(k-1); end t1 = 2011:2011+m-1; t2 = 2011:2011+m-1; plot(t1, A, 'bo--'); hold on; plot(t2, G, 'r*-'); title('G(1,N)预测结果'); xlabel('年份'); ylabel('事故数量'); legend('真实值', '预测值'); ``` 如果需要使用灰色GM(1,N)模型进行预测,可以按照上述步骤将数据导入MATLAB并运行代码即可。需要注意的是,根据具体需求,你可以根据自己的数据进行调整,以获得更准确的预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值