灰色预测及其MATLAB实现——MATLAB在数学建模中的应用

灰色预测及其MATLAB实现

灰色预测是一种常规的预测手段,具有操作简便,所需数据量少等优点,一般只需有4个数据就可以进行预测。

灰色预测是基于灰色系统理论的预测方法。灰色系统由我国著名学者邓聚龙教授在1982年提出,是相对于“白色模型”——完全信息透明的模型,和“黑色模型”——对信息一无所知的模型的模型概念。利用灰色系统解决的问题主要是具有不确定性的问题:

  1. 信息具有模糊性,无法用数学方程精确刻画。
  2. 机理具有不确定性。
  3. 信息贫瘠的不确定性。

灰色系统基本理论

灰色关联度矩阵

灰色关联度分析了向量与向量之间以及矩阵与矩阵之间的关联度,而向量与向量之间的关联度可以看作矩阵与矩阵之间的关联度的一种特殊形式。

计算关联度,一定是计算某个待比较的数列与参照物(亦即参考数列)之间的相关程度。

假设有一组参照数列如下:
xj=(xj(1),xj(2),xj(3),⋯ ,xj(k),⋯ ,xj(n))    j=1,2,3,⋯ ,s x_j=(x_j(1),x_j(2),x_j(3),\cdots,x_j(k),\cdots,x_j(n))\ \ \ \ j=1,2,3,\cdots,s xj=(xj(1),xj(2),xj(3),,xj(k),,xj(n))    j=1,2,3,,s
假设有一组待比较数组如下:
xi=(xi(1),xi(2),xi(3),⋯ ,xi(k),⋯ ,xi(n))    i=1,2,3,⋯ ,t x_i=(x_i(1),x_i(2),x_i(3),\cdots,x_i(k),\cdots,x_i(n))\ \ \ \ i=1,2,3,\cdots,t xi=(xi(1),xi(2),xi(3),,xi(k),,xi(n))    i=1,2,3,,t
则定义关联系数如下:
ξji(k)=mini mink∣xj(k)−xi(k)∣+ρ⋅maxi maxk∣xj(k)−xi(k)∣∣xj(k)−xi(k)∣+ρ⋅maxi maxk∣xj(k)−xi(k)∣ \xi_{ji}(k)=\frac{\underset{i}{min}\ \underset{k}{min}|x_j(k)-x_i(k)|+\rho \cdot\underset{i}{max}\ \underset{k}{max}|x_j(k)-x_i(k)|}{|x_j(k)-x_i(k)|+\rho \cdot\underset{i}{max}\ \underset{k}{max}|x_j(k)-x_i(k)|} ξji(k)=xj(k)xi(k)+ρimax kmaxxj(k)xi(k)imin kminxj(k)xi(k)+ρimax kmaxxj(k)xi(k)
关于该式的说明如下:

  1. 变量ξji(k)\xi_{ji}(k)ξji(k)表示的是第iii个数列与第jjj个参考数列第kkk个样本之间的关联系数。
  2. mini mink∣xj(k)−xi(k)∣\underset{i}{min}\ \underset{k}{min}|x_j(k)-x_i(k)|imin kminxj(k)xi(k)maxi maxk∣xj(k)−xi(k)∣\underset{i}{max}\ \underset{k}{max}|x_j(k)-x_i(k)|imax kmaxxj(k)xi(k)表示参考数列矩阵与比较数列矩阵作差后的最小值和最大值,目的是为了保证ξji(k)\xi_{ji}(k)ξji(k)的值在[0,1]区间内,同时上下对称的结构可以消除量纲不同和数量级悬殊的问题。
  3. ∣xj(k)−xi(k)∣|x_j(k)-x_i(k)|xj(k)xi(k)即为汉明距离(“Hamming distance”),汉明距离的倒数被称为反倒数距离,灰色关联度的本质就是通过反倒数距离的大小来判定关联程度,倒数越大,表示两条曲线之间距离越小,其曲线程度越相似。
  4. ρ\rhoρ的取值约定俗成为[0,1],但实际上ρ\rhoρ的取值范围为(0,+∞)(0,+\infin)(0,+)。但不管ρ\rhoρ如何取值,其只改变ξji(k)\xi_{ji}(k)ξji(k)的绝对大小,而不改变关联度的相对强弱。

由于ξji(k)\xi_{ji}(k)ξji(k)只能反映处点与点之间的相关性,相关性信息分散,不方便刻画数列之间的相关性,需要把ξji(k)\xi_{ji}(k)ξji(k)整合起来,定义:
rji=Σk=1nξji(k)n r_{ji}=\frac{\overset{n}{\underset{k=1}{\Sigma}}\xi_{ji}(k)}{n} rji=nk=1Σnξji(k)
变量rjir_{ji}rji即为相关度,结合实际背景,有正面作用的即为正相关,反之则为负相关;rjir_{ji}rji大于0.7称为强相关,小于0.3称为弱相关。

xix_ixixjx_jxj之间的相关度写为矩阵形式:
R=[r11r12⋯r1tr21r22⋯r2t⋮⋮⋱⋮rs1rs2⋯rst] R= \begin{bmatrix} r_{11}&r_{12}&\cdots&r_{1t}\\ r_{21}&r_{22}&\cdots&r_{2t}\\ \vdots&\vdots&\ddots&\vdots\\ r_{s1}&r_{s2}&\cdots&r_{st}\\ \end{bmatrix} R=r11r21rs1r12r22rs2r1tr2trst
则通过观察某一列数值明显大于其他列数值,则称该列为优势子因素;假如某一行数值明显大于其他行数值,则称该行为优势母因素,优势母因素易受子因素的驱动影响。

经典灰色模型GM(1,1)

灰色模型是基于常微分方程的基础上发展起来的。灰色模型记号是GM(M,N)GM(M,N)GM(M,N),前面的NNN表示变量个数,后面的MMM表示常微分方程的阶数,一般情况下GM(1,1)GM(1,1)GM(1,1)最为常见。

下面是GM(1,1)GM(1,1)GM(1,1)模型组建过程:

  1. 数据累加:降低数据噪声,加强数学规律的显露。

    设有原始数列:x(0)=(x(0)(1),x(0)(2),⋯ ,x(0)(n))x^{(0)}=(x^{(0)}(1),x^{(0)}(2),\cdots,x^{(0)}(n))x(0)=(x(0)(1),x(0)(2),,x(0)(n))

    现对x(0)x^{(0)}x(0)进行累加得到新数列x(1)x^{(1)}x(1):
    x(1)=(x(1)(1),x(1)(2),⋯ ,x(1)(n))=(x(0)(1),x(0)(1)+x(0)(2),x(0)(1)+x(0)(2)+x(0)(3)⋯ ) \begin{aligned} x^{(1)}&=(x^{(1)}(1),x^{(1)}(2),\cdots,x^{(1)}(n))\\ &=(x^{(0)}(1),x^{(0)}(1)+x^{(0)}(2),x^{(0)}(1)+x^{(0)}(2)+x^{(0)}(3)\cdots) \end{aligned} x(1)=(x(1)(1),x(1)(2),,x(1)(n))=(x(0)(1),x(0)(1)+x(0)(2),x(0)(1)+x(0)(2)+x(0)(3))

  2. 计算数列x(1)x^{(1)}x(1)的灰导数方程

    假设一个连续函数C=f(t)C=f(t)C=f(t),取横坐标tk−2,tk−1,tk,tk+1,⋯{t_{k-2},t_{k-1},t_{k},t_{k+1},\cdots}tk2,tk1,tk,tk+1,,各相邻点间距为hhhhhh可以是相等的,也可以不相等。当h→0h\rightarrow0h0时,有:
    (dCdt)k=Ck−Ck−1h (\frac{dC}{dt})_k=\frac{C_k-C_{k-1}}{h} (dtdC)k=hCkCk1
    由于hhh是相邻数值之间的距离也就是差值,则上式变为:
    (dCdt)k=Ck−Ck−1h=x(1)(k)−x(1)(k−1)k−(k−1)=x(1)(k)−x(1)(k−1)=x(0)(k)=d(k) (\frac{dC}{dt})_k=\frac{C_k-C_{k-1}}{h}=\frac{x^{(1)}(k)-x^{(1)(k-1)}}{k-(k-1)}=x^{(1)}(k)-x^{(1)}(k-1)=x^{(0)}(k)=d(k) (dtdC)k=hCkCk1=k(k1)x(1)(k)x(1)(k1)=x(1)(k)x(1)(k1)=x(0)(k)=d(k)
    这一步需要x(1)x^{(1)}x(1)数列的值变化比较平滑,如果出现突变的数据序列,需要将突变提取出来后建立灰色模型。

  3. 定义数列x(1)x^{(1)}x(1)的紧邻均值
    z(1)(k)=x(1)(k)+x(1)(k−1)2 z^{(1)}(k)=\frac{x^{(1)(k)+x^{(1)}(k-1)}}{2} z(1)(k)=2x(1)(k)+x(1)(k1)
    则称z(1)(k)=(z(1)(2),z(1)(3),z(1)(4),⋯ ,z(1)(n))z^{(1)}(k)=(z^{(1)}(2),z^{(1)}(3),z^{(1)}(4),\cdots,z^{(1)}(n))z(1)(k)=(z(1)(2),z(1)(3),z(1)(4),,z(1)(n))x(1){x^{(1)}}x(1)的紧邻均值数列,紧邻均值数列用于防止原始数据自身存在突变的奇异数据,平滑数列的阶跃性。

  4. 定义GM(1,1)灰微分方程

    定义GM(1,1)灰微分方程为一阶线性方程
    d(k)+az(1)(k)=b d(k)+az^{(1)}(k)=b d(k)+az(1)(k)=b
    可以得到:
    x(0)(k)+az(1)(k)=b x^{(0)}(k)+az^{(1)}(k)=b x(0)(k)+az(1)(k)=b
    该式中,a,ba,ba,b是待辨识的参数,aaa被称为“发展系数”,bbb被称为“灰作用量”。将k=2,3,⋯ ,nk=2,3,\cdots,nk=2,3,,n代入,用最小二乘法可以得到a,ba,ba,b的值。

  5. 白化GM(1,1)模型

    原来的方程x(0)(k)+az(1)(k)=b{x^{(0)}(k)+az^{(1)}(k)=b}x(0)(k)+az(1)(k)=b是一个离散变量的方程,将其白化为对应的连续方程,这样就可以化解成我们最终需要的灰色模型形式。
    x(0)(k)+az(1)(k)=bx^{(0)}(k)+az^{(1)}(k)=bx(0)(k)+az(1)(k)=b白化后可以得到:
    dx(1)dk+ax(1)=b \frac{dx^{(1)}}{dk}+ax^{(1)}=b dkdx(1)+ax(1)=b
    对该微分方程求解易得:
    x (1)(k+1)=ba+(x(0)(1)−ba)e−ak \overset{~}{x}^{(1)}(k+1)=\frac{b}{a}+(x^{(0)}(1)-\frac{b}{a})e^{-ak} x (1)(k+1)=ab+(x(0)(1)ab)eak
    最后累减还原获得最终序列

  6. 模型检验

    这里介绍了三种常用的检验模型精度的方式:

    1. 相对残差QQQ检验

      原始数列为 x(0)=(x(0)(1),x(0)(2),⋯ ,x(0)(n))x^{(0)}=(x^{(0)}(1),x^{(0)}(2),\cdots,x^{(0)}(n))x(0)=(x(0)(1),x(0)(2),,x(0)(n))

      对应灰色模型预测得出的序列:
      x(0)′=(x(0)′(1),x(0)′(2),⋯ ,x(0)′(n)) x^{(0)'}=(x^{(0)'}(1),x^{(0)'}(2),\cdots,x^{(0)'}(n)) x(0)=(x(0)(1),x(0)(2),,x(0)(n))
      残差序列为:
      ϵ(0)=(ϵ1,ϵ2,ϵ3,⋯ ,ϵn)={x(0)−x(0)′∣x(0)(1)−x(0)′(1),x(0)(2)−x(0)′(2),⋯ ,x(0)(n)−x(0)′(n)} \begin{aligned} \epsilon^{(0)}&=(\epsilon_1,\epsilon_2,\epsilon_3,\cdots,\epsilon_n)\\ &=\{x^{(0)}-x^{(0)'}|x^{(0)}(1)-x^{(0)'}(1),x^{(0)}(2)-x^{(0)'}(2),\cdots,x^{(0)}(n)-x^{(0)'}(n)\} \end{aligned} ϵ(0)=(ϵ1,ϵ2,ϵ3,,ϵn)={x(0)x(0)x(0)(1)x(0)(1),x(0)(2)x(0)(2),,x(0)(n)x(0)(n)}
      相对误差序列为:
      Δ=(Δ1,Δ2,Δ3,⋯ ,Δn)=(ϵ1x(0)(1),ϵ2x(0)(2),ϵ3x(0)(3),⋯ ,ϵnx(0)(n)) \begin{aligned} \Delta&=(\Delta_1,\Delta_2,\Delta_3,\cdots,\Delta_n)\\ &=(\frac{\epsilon_1}{x^{(0)}(1)},\frac{\epsilon_2}{x^{(0)}(2)},\frac{\epsilon_3}{x^{(0)}(3)},\cdots,\frac{\epsilon_n}{x^{(0)}(n)}) \end{aligned} Δ=(Δ1,Δ2,Δ3,,Δn)=(x(0)(1)ϵ1,x(0)(2)ϵ2,x(0)(3)ϵ3,,x(0)(n)ϵn)
      所以相对误差Q=1nΣk=1ΔknQ=\frac{1}{n}\overset{n}{\underset{k=1}{\Sigma}\Delta_k}Q=n1k=1ΣΔkn,QQQ越小越好,表明模型越精确,根据QQQ的大小来划分模型的精度等级。

    2. 方差比CCC的检验

      x(0)x^{(0)}x(0)是原始数列,x(0)′x^{(0)'}x(0)是模型预测数列,ϵ(0)\epsilon^{(0)}ϵ(0)是残差序列。
      则各自的序列和方差为:
      {x‾=1nΣk=1nx(0)(k)S12=1nΣk=1n(x(0)−x‾)2ϵ‾=1nΣk=1nϵ(0)S22=1nΣk=1n(ϵ(0)−ϵ‾) \left\{ \begin{aligned} \overline{x}&=\frac{1}{n}\overset{n}{\underset{k=1}{\Sigma}}x^{(0)}(k)\\ S^2_1&=\frac{1}{n}\overset{n}{\underset{k=1}{\Sigma}}(x^{(0)}-\overline{x})^2\\ \overline{\epsilon}&=\frac{1}{n}\overset{n}{\underset{k=1}{\Sigma}}\epsilon^{(0)}\\ S^2_2&=\frac{1}{n}\overset{n}{\underset{k=1}{\Sigma}}(\epsilon^{(0)}-\overline{\epsilon})\\ \end{aligned} \right. xS12ϵS22=n1k=1Σnx(0)(k)=n1k=1Σn(x(0)x)2=n1k=1Σnϵ(0)=n1k=1Σn(ϵ(0)ϵ)
      C=S2S1C=\frac{S_2}{S_1}C=S1S2,CCC越小,可信度越高。

    3. 小概率误差PPP的检验

      p=P{∣ϵ−x‾∣0.6745S1} p=P\{|\epsilon-\overline{x}|0.6745S_1\} p=P{ϵx∣0.6745S1}
      这里的置信水平取0.5,所以置信区间半长取0.6745,其意义是误差摆动∣ϵk−ϵ‾∣|\epsilon_k-\overline{\epsilon}|ϵkϵ位于指定数值范围内的概率,此指标可以反映误差摆动幅度落在指定区间的数量。因此ppp越大,表示吻合精度越好。

    灰色模型精度检验对照表

    等级相对误差QQQ方差比CCC小误差概率ppp
    一级<0.01<0.01<0.01<0.35<0.35<0.35>0.95>0.95>0.95
    二级<0.05<0.05<0.05<0.50<0.50<0.50<0.80<0.80<0.80
    三级<0.10<0.10<0.10<0.65<0.65<0.65<0.70<0.70<0.70
    四级>0.20>0.20>0.20>0.80>0.80>0.80<0.60<0.60<0.60

灰色系统的程序设计

灰色关联度矩阵的程序设计

19791980198119821983
固定资产投资308.58310295346367
工业投资195.4189.9187.2205222.7
农业投资24.62112.215.114.57
科技投资2025.623.329.230
交通投资18.981922.323.527.655
国民收入170174197216.4235.8
工业收入57.5570.7476.880.789.85
农业收入88.567085.3899.83103.4
商业收入11.1913.2816.8218.922.8
交通收入4.034.264.345.065.78
建筑业收入13.715.613.7711.9813.95
function [R]=GrayConnect(X,Y)
[xa,xb]=size(X);
[ya,yb]=size(Y);
if (xb==yb)
else
    return ;
end
R=zeros(ya,xa);
q=0.5;
for i = 1:ya
    k=zeros(xa,xb);
    for j=1:xa
        k(j,:)=abs(X(j,:)-Y(i,:));
    end
    temp1=min(min(k));
    temp2=q*max(max(k));
    for j=1:xa
        sum=0;
        for t=1:xb
        sum=sum+(temp1+temp2)/(abs(X(j,t)-Y(i,t))+temp2);
        end
        R(i,j)=sum/xb;
    end
end
end

将数据导入MATLAB,

A=xlsread('Grey.xlsx','B1:F11');

将数据标准化,

for i=1:11
    A(i,:)=A(i,:)/A(i,1);
end

将母因素和子因素分割为X和Y,并使用函数GrayConnect,

X=A(1:5,:);
Y=A(6:11,:);
[R]=GrayConnect(X,Y)

得到结果如下:
R=[0.80160.76110.55700.81020.93550.68870.66580.52870.88540.80040.89100.85810.57860.57730.67490.67760.66340.56750.78000.73070.81130.77420.56480.80380.92050.74320.76630.56160.60650.6319] R= \begin{bmatrix} 0.8016&0.7611&0.5570&0.8102&0.9355\\ 0.6887&0.6658&0.5287&0.8854&0.8004\\ 0.8910&0.8581&0.5786&0.5773&0.6749\\ 0.6776&0.6634&0.5675&0.7800&0.7307\\ 0.8113&0.7742&0.5648&0.8038&0.9205\\ 0.7432&0.7663&0.5616&0.6065&0.6319\\ \end{bmatrix} R=0.80160.68870.89100.67760.81130.74320.76110.66580.85810.66340.77420.76630.55700.52870.57860.56750.56480.56160.81020.88540.57730.78000.80380.60650.93550.80040.67490.73070.92050.6319

GM(1,1)的程序设计

银行有各种理财产品,客户可以根据自己的资金实力和投资偏好来选择。有一款理财产品,有十天的“10天犹豫期”,在这10天里如果对自己购得的理财产品不放心或者不满意,可以自由退买,不需要支付手续费。有如下八天顾客保有量:
[92.81097.66098.80099.28199.53799.817100.000] \begin{bmatrix} 92.810&97.660&98.800&99.281&99.537&99.817&100.000 \end{bmatrix} [92.81097.66098.80099.28199.53799.817100.000]

function [XR]=GM1_1(x0)
[a,b]=size(x0);
x1=zeros(a,b);
z1=zeros(a,b-1);
for i =1:b %建立数列x1
    for j = 1:i
        x1(1,i)=x1(1,i)+x0(1,j);
    end
end
for i=2:b
    z1(1,i-1)=(x1(1,i)+x1(1,i-1))/2;
end
B=[-1.*z1',ones(b-1,1)];
Y=x0(1,2:b)';
U=(B.'*B)^(-1)*B.'*Y;
p=U(1,1);
q=U(2,1);
m=q/p;
XR=zeros(a,b);
for i =1:b+1
    XR(1,i)=m+(x0(1,1)-m)*exp(-p*(i-1));
end
for i=1:b
    XR(1,b+2-i)=XR(1,b+2-i)-XR(1,b+1-i);
end
end

根据上式可以预测之后的结果:
XR=[92.810098.115898.540098.966099.393899.8235100.2550100.6885] XR=\begin{bmatrix} 92.8100 & 98.1158 & 98.5400 & 98.9660 & 99.3938 & 99.8235 & 100.2550 &100.6885 \end{bmatrix} XR=[92.810098.115898.540098.966099.393899.8235100.2550100.6885]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值