灰色系统指既含有已知信息又含有未知信息的系统。
对灰色系统进行预测的模型。
灰色模型(Grey Model,简称GM模型)一般表达方式为GM(n,x)模型,其含义是:用n阶微分方程对x个变量建立模型。
通过把分散在时间轴上的离散数据看成一组连续变化的序列,采用累加和累减的方式,将灰色系统中的未知因素弱化,强化已知因素的影响程度,最后构建一个以时间为变量的连续微分方程,通过数学方法确定方程中的参数,从而实现预测目的。
无需大量数据样本,短期预测效果好,运算过程简单。
数据必须是线性,要是非线性的话,它也会给你化成线性,就起不到预测的效果,预测出来都是错的。
对非线性数据样本预测效果差。
(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
(1)灰微分方程模型
A ( i ) + a ∗ C ( i ) = b A(i) + a*C(i) = b A(i)+a∗C(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=(B′∗B)−1∗B′∗Y
这个预测用的是拟合函数,但是。。。我没推出来。。。
%建立符号变量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;
代码2:(后续预测不同)
推导过程:
A ( i ) = b − a C ( i ) A(i)=b-aC(i) A(i)=b−aC(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)=b−aC(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)=b−aF(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)=b−a[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...(n−1)
==> k F ( i ) = b − N ( i − 1 ) , i = 2... n kF(i)=b-N(i-1),i=2...n kF(i)=b−N(i−1),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
这个主要是理论:
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