灰色预测(GM)的MATLAB实现

GM简介

1. 灰色系统的定义:

灰色系统指既含有已知信息又含有未知信息的系统。

2. 灰色预测模型的定义:

对灰色系统进行预测的模型。
灰色模型(Grey Model,简称GM模型)一般表达方式为GM(n,x)模型,其含义是:用n阶微分方程对x个变量建立模型。

3. 灰色预测模型的目的:

通过把分散在时间轴上的离散数据看成一组连续变化的序列,采用累加和累减的方式,将灰色系统中的未知因素弱化,强化已知因素的影响程度,最后构建一个以时间为变量的连续微分方程,通过数学方法确定方程中的参数,从而实现预测目的。

4. 灰色预测模型的特点:

无需大量数据样本,短期预测效果好,运算过程简单。
数据必须是线性,要是非线性的话,它也会给你化成线性,就起不到预测的效果,预测出来都是错的。

5. 灰色预测模型的缺点:

对非线性数据样本预测效果差。


GM

1. 数列生成

(1)累加生成
生成列的数据 B(i) = A(1) + A(2) + … + A(i)

一般(90%的情况)做一次累加就可以了,有个别情况需要做多次累加

(2)累减生成
A(0)=0
B(i) = A(i) - A(i-1)
累减是累加的逆运算,累减可将累加生成列还原为非生成列,在建模中获得增量信息

(3)均值生成
紧邻生成数:C(i) = a*B(i) + (1-a)*B(i-1)
紧邻生成均值数:C(i) = [ B(i) + B(i-1) ] / 2

2. GM(1,1) model

(1)灰微分方程模型

A ( i ) + a ∗ C ( i ) = b A(i) + a*C(i) = b A(i)+aC(i)=b

A(i) :原始序列,一般称为灰导数
C(i):一次均值生成序列
a:发展系数
b:灰作用量

(2)白化模型

d x / d t + a x ( t ) = b dx/dt+ax(t)=b dx/dt+ax(t)=b

x(t):一次累加序列

(3)求解

最小二乘法
c = [ a , b ] ′ c = [a,b]' c=[a,b]
c = ( B ′ ∗ B ) − 1 ∗ B ′ ∗ Y c=(B'*B)^{-1}*B'*Y c=(BB)1BY

3. MATLAB实现及步骤

这个预测用的是拟合函数,但是。。。我没推出来。。。

%建立符号变量a(发展系数)和b(灰作用量)
syms a b;
c = [a b]';

%原始数列 A
A = [174, 179, 183, 189, 207, 234, 220.5, 256, 270, 285];
n = length(A);

%对原始数列 A 做累加得到数列 B
B = cumsum(A);

%对数列 B 做紧邻均值生成 C(2--n)
for i = 2:n
    C(i) = (B(i) + B(i - 1))/2; 
end
C(1) = [];

%构造数据矩阵 
B = [-C;ones(1,n-1)];
Y = A; Y(1) = []; Y = Y';

%使用最小二乘法计算参数 a(发展系数)和 b(灰作用量)
c = inv(B*B')*B*Y;  %inv:矩阵求逆
c = c';
a = c(1); b = c(2);

%预测后续数据,10 years later
F = []; F(1) = A(1);
for i = 2:(n+10)
    F(i) = (A(1)-b/a)/exp(a*(i-1))+ b/a;    %formula
end

%对数列 F 累减还原,得到预测出的数据
G = []; G(1) = A(1);
for i = 2:(n+10)
    G(i) = F(i) - F(i-1); %得到预测出来的数据
end

disp('预测数据为:');
G

%模型检验

H = G(1:10);
%计算残差序列
epsilon = A - H;

%法一:相对残差Q检验
%计算相对误差序列
delta = abs(epsilon./A);
%计算相对误差Q
disp('相对残差Q检验:')
Q = mean(delta)

%法二:方差比C检验
disp('方差比C检验:')
C = std(epsilon, 1)/std(A, 1)

%法三:小误差概率P检验
S1 = std(A, 1);
tmp = find(abs(epsilon - mean(epsilon))< 0.6745 * S1);
disp('小误差概率P检验:')
P = length(tmp)/n

%绘制曲线图
t1 = 1995:2004;
t2 = 1995:2014;

plot(t1, A,'ro'); hold on;
plot(t2, G, 'g-o');
xlabel('year'); ylabel('water/one hundred billion ton');
legend('real water output','forecast water output');
title('changjiang water output increase route');
grid on;

灰色预测(GM)的MATLAB实现_第1张图片


代码2:(后续预测不同)

推导过程:

A ( i ) = b − a C ( i ) A(i)=b-aC(i) A(i)=baC(i)
F ( 1 ) = A ( 1 ) F(1)=A(1) F(1)=A(1)
C ( 2 ) = A ( 1 ) + A ( 2 ) / 2 C(2)=A(1)+A(2)/2 C(2)=A(1)+A(2)/2
C ( 3 ) = A ( 1 ) + A ( 2 ) + A ( 3 ) / 2 C(3)=A(1)+A(2)+A(3)/2 C(3)=A(1)+A(2)+A(3)/2
此 时 , a , b , A ( 1 ) = F ( 1 ) 已 知 , 推 算 F , 认 为 : [ 未 知 ] : A ( 2... n ) = F ( 2... n ) 此时,a , b , A(1)=F(1) 已知,推算F,认为:[未知]:A(2...n)=F(2...n) a,b,A(1)=F(1)F[]A(2...n)=F(2...n)

F ( i ) = b − a C ( i ) , i = 2... n F(i)=b-aC(i),i=2...n F(i)=baC(i),i=2...n
C C C 代入 , F ( 1 ) = A ( 1 ) F(1)=A(1) F(1)=A(1)

( 1 + a / 2 ) F ( 2 ) = b − a F ( 1 ) (1+a/2)F(2)=b-aF(1) (1+a/2)F(2)=baF(1)
( 1 + a / 2 ) F ( 3 ) = b − a [ F ( 1 ) + F ( 2 ) ] (1+a/2)F(3)=b-a[F(1)+F(2)] (1+a/2)F(3)=ba[F(1)+F(2)]
令: k = 1 + a / 2 k=1+a/2 k=1+a/2
N ( i ) = a [ F ( 1 ) + . . . + F ( i ) ] , i = 1... ( n − 1 ) N(i)=a[F(1)+...+F(i)],i=1 ... (n-1) N(i)=a[F(1)+...+F(i)],i=1...(n1)
==> k F ( i ) = b − N ( i − 1 ) , i = 2... n kF(i)=b-N(i-1),i=2...n kF(i)=bN(i1),i=2...n

%建立符号变量a(发展系数)和b(灰作用量)
syms a b;
c = [a b]';

%原始数列 A
A = [174, 179, 183, 189, 207, 234, 220.5, 256, 270, 285];
n = length(A);

%对原始数列 A 做累加得到数列 B
B = cumsum(A);

%对数列 B 做紧邻均值生成 C(2--n)
for i = 2:n
    C(i) = (B(i) + B(i - 1))/2; 
end
C(1) = [];

%构造数据矩阵 
B = [-C;ones(1,n-1)];
Y = A; Y(1) = []; Y = Y';

%使用最小二乘法计算参数 a(发展系数)和 b(灰作用量)
c = inv(B*B')*B*Y;  %inv:矩阵求逆
c = c';
a = c(1); b = c(2);

%预测后续数据,10 years later
F = []; F(1) = A(1);
k = 1 + a/2;
N = [];
for i = 1:(n+9)
    N(i) = a*(sum(F));
    F(i+1) = (b - N(i))/k;
end

disp('预测数据为:');
F

%模型检验

H = F(1:10);
%计算残差序列
epsilon = A - H;

%法一:相对残差Q检验
%计算相对误差序列
delta = abs(epsilon./A);
%计算相对误差Q
disp('相对残差Q检验:')
Q = mean(delta)

%法二:方差比C检验
disp('方差比C检验:')
C = std(epsilon, 1)/std(A, 1)

%法三:小误差概率P检验
S1 = std(A, 1);
tmp = find(abs(epsilon - mean(epsilon))< 0.6745 * S1);
disp('小误差概率P检验:')
P = length(tmp)/n

%绘制曲线图
t1 = 1995:2004;
t2 = 1995:2014;

plot(t1, A,'ro'); hold on;
plot(t2, F, 'g-o');
xlabel('year'); ylabel('water/one hundred billion ton');
legend('real water output','forecast water output');
title('changjiang water output increase route');
grid on;

% gm1_2
% 预测数据为: 
% F = 
%   1 至 15 列
% 
%   174.0000  172.8668  184.0008  195.8520  208.4664  221.8933  236.1850  251.3972  267.5892  284.8240  303.1690  322.6955  343.4796  365.6025  389.1502
% 
%   16 至 20 列
% 
%   414.2146  440.8933  469.2903  499.5164  531.6892
% 
% 相对残差Q检验:
% Q = 0.0233
% 
% 方差比C检验: 
% C = 0.1870

% 小误差概率P检验: 
% P = 1

灰色预测(GM)的MATLAB实现_第2张图片

4. 最小二乘法

灰色预测(GM)的MATLAB实现_第3张图片

这个主要是理论:
https://blog.csdn.net/fengzhimohan/article/details/77540011

https://blog.csdn.net/lan1109449054/article/details/81134335

这个主要是例子:
https://blog.csdn.net/WuchangI/article/details/79214882

整体感觉和 线性回归方程 很像

最小二乘法:
https://wenku.baidu.com/view/03af45f9770bf78a65295488?fromShare=1

你可能感兴趣的:(MATLAB,灰度预测)