Wang Haihua
🍈 🍉🍊 🍋 🍌
灰色系统理论是研究解决灰色系统分析、建模、预测、决策和控制的理论,是一般系统论、信息论、控制论的观点和方法在社会、经济、生态等抽象系统中的延伸,是运用经典数学知识解决信息不完备系统的理论和方法。灰色系统是指部分信息已知部分信息未知的信息不完备系统。
灰色系统理论(grey system theory)的创立源于20世纪80年代。邓聚龙教授在1981年上海中—美控制系统学术会议上所作的“含未知数系统的控制问题”的学术报告中首次使用了“灰色系统”一词。1982年,邓聚龙发表了“参数不完全系统的最小信息正定”、“灰色系统的控制问题”等系列论文,奠定了灰色系统理论的基础,他的论文在国际上引起了高度的重视,美国哈佛大学教授、《系统与控制通信》杂志主编布罗克特(Brockett)给予灰色系统理论高度评价,因此,众多的中青年学者加入到灰色系统理论的研究行列,积极探索灰色系统理论及其应用研究。
事实上,灰色系统的概念是由英国科学家艾什比(W. R. Ashby)所提出的“黑箱”(black box)概念发展演进而来,是自动控制和运筹学相结合的产物。艾什比利用黑箱来描述那些内部结构、特性、参数全部未知而只能从对象外部和对象运动的因果关系及输出输入关系来研究的一类事物。邓聚龙系统理论则主张从事物内部,从系统内部结构及参数去研究系统,以消除“黑箱”理论从外部研究事物而使已知信息不能充分发挥作用的弊端,因此,被认为是比“黑箱”理论更为准确的系统研究方法。
所谓灰色系统是指部分信息已知而部分信息未知的系统,灰色系统理论所要考察和研究的是对信息不完备的系统,通过已知信息来研究和预测未知领域从而达到了解整个系统的目的。灰色系统理论与概率论、模糊数学一起并称为研究不确定性系统的三种常用方法,具有能够利用“少数据”建模寻求现实规律的良好特性,克服了资料不足或系统周期短的矛盾。
灰色预测的主要特点是模型使用的不是原始数据序列,而是生成的数据序列,即对原始数据作累加生成(或其它方法生成)得到近似的指数规律再进行建模的方法。
优点是
缺点是只适用于中短期的预测,只适合指数增长的预测。
在一些实际问题中, 往往会遇到随机干扰, 导致一些数据具有很大的波动性。为处理这些问题, 提出数据累加和累减的概念。 设原始数据列 $x^{(0)}=\left(x^{(0)}(1), x^{(0)}(2), \cdots, x^{(0)}(n)\right)$, 令 $$ x^{(1)}(k)=\sum_{i=1}^{k} x^{(0)}(i), \quad k=1,2, \cdots, n, $$
得到 $x^{(1)}=\left(x^{(1)}(1), x^{(1)}(2), \cdots, x^{(1)}(n)\right)$, 称 $x^{(1)}$ 为 $x^{(0)}$ 的一次累加生成数列。相应地, 自然有 $x^{(0)}$ 的 $r$ 次累加生成数列 $$ x^{(r)}=\left(x^{(r)}(1), x^{(r)}(2), \cdots, x^{(r)}(n)\right) ; \quad x^{(r)}(k)=\sum_{i=1}^{k} x^{(r-1)}(i) . $$ 与累加生成对应的运算是累减, 它主要用于对累加生成的数据列进行还原。
设 $x^{(1)}=\left(x^{(1)}(1), x^{(1)}(2), \cdots, x^{(1)}(n)\right)$, 称 $$ x^{(0)}=\left(x^{(0)}(1), x^{(0)}(2), \cdots, x^{(0)}(n)\right) \text { 为 } x^{(1)} $$ 的一次累减,其中 $$ x^{(0)}(1)=x^{(1)}(1) ; \quad x^{(0)}(k)=x^{(1)}(k)-x^{(1)}(k-1), k=2,3, \cdots, n . $$ 同理可定义 $r$ 次累减运算。
已知某商品年度销售数据序列为 $$ x^{(0)}=(5.081,4.611,5.1177,9.3775,11.0574,11.0524) $$
如果直接应用最小二乘法进行线性拟合, 得到直线方程 $y=1.5273 k+2.3706$, 拟合直线如图所示。
由上图可以看出, 所有数据点中, 原始数据与拟合直线有一定的差距, 最大相对误差为 35.85%, 也就是说拟合效果不理想。
对 $x^{(0)}$ 进行一次累加, 得到 $$ x^{(1)}=(5.081,9.692,14.8097,24.1872,35.2446,46.297), $$ 对 $x^{(1)}$ 进行拟合, 得到 $$ x^{(1)}(k+1)=15.3915 e^{0.2311 k}-14.7620 . $$
由图可以看到, 拟合曲线与累加后的数据非常接近, 最大相对 误差为 $24.15 \%$, 检验时需要进行累减还原, 得 $$ \hat{\boldsymbol{x}}^{(0)}=(4.6313,5.0423,6.3534,8.0053,10.0867,12.7093) $$ 比直接线性拟合的最大相对误差减少很多。
代码
import numpy as np
from matplotlib.pyplot import plot,show,rc,legend,subplot
from scipy.optimize import curve_fit
rc('font',size=15);rc('font',family='SimHei');t0=np.arange(1,7)
x0=np.array([5.081, 4.611, 5.1177, 9.3775, 11.0574, 11.0524])
xt=np.polyfit(t0,x0,1); xh1=np.polyval(xt,t0) #计算预测值
delta1=abs((xh1-x0))/x0 #计算相对误差
x1=np.cumsum(x0)
xh2=lambda t,a,b,c: a*np.exp(b*t)+c
para, cov=curve_fit(xh2, t0, x1)
xh21=xh2(t0,*para) #计算累加数列的预测值
xh22=np.r_[xh21[0],np.diff(xh21)] #计算预测值
delta2=np.abs((xh22-x0)/x0) #计算相对误差
print("拟合的参数值为:", para); subplot(121)
plot(t0,x0,'s'); plot(t0,xh1,'*-')
legend(('原始数据点','线性拟合'),loc='upper left')
subplot(122); plot(t0,x1,'o'); plot(t0,xh21,'p-')
legend(('累加数据点','累加后拟合')); show()
定义1 级比 $\lambda(k)=\frac{x^{(0)}(k-1)}{x^{(0)}(k)}(k=2,3, \cdots, n)$, 若 $\lambda(k)$ 落入区间 $\left(e^{-\frac{2}{n+1}}, e^{\frac{2}{n+1}}\right)$, 则称数据列满足指数形式增长。
累加的主要目的是把非负的波动数列转化成具有一定规律性(例如,指数形式单调增加)的数列。
如果实际问题中出现负数(如温度数列),累加生成就不一定是好的处理办法,因为会出现正负抵消现象,这个时候会削弱原始数据的规律性。因此,此时应首先化为非负数列。具体做法是数列中每个数据同时减去原始数列中最小的元素值,得到非负数列后再进行累加运算。当然,在进行误差计算或预测时,应进行相应的逆运算。
import numpy as np
from matplotlib.pyplot import plot,show,rc,legend,subplot, savefig
%matplotlib inline
from scipy.optimize import curve_fit
rc('font',size=15);rc('font',family='SimHei');t0=np.arange(1,7)
x0=np.array([5.081, 4.611, 5.1177, 9.3775, 11.0574, 11.0524])
xt=np.polyfit(t0,x0,1); xh1=np.polyval(xt,t0) #计算预测值
delta1=abs((xh1-x0))/x0 #计算相对误差
x1=np.cumsum(x0)
xh2=lambda t,a,b,c: a*np.exp(b*t)+c
para, cov=curve_fit(xh2, t0, x1)
xh21=xh2(t0,*para) #计算累加数列的预测值
xh22=np.r_[xh21[0],np.diff(xh21)] #计算预测值
delta2=np.abs((xh22-x0)/x0) #计算相对误差
print("拟合的参数值为:", para); subplot(121)
plot(t0,x0,'s'); plot(t0,xh1,'*-')
legend(('原始数据点','线性拟合'),loc='upper left')
subplot(122); plot(t0,x1,'o'); plot(t0,xh21,'p-')
legend(('累加数据点','累加后拟合'));
savefig('images/pre1201.png')
show()
拟合的参数值为: [ 15.3914543 0.23111521 -14.76199989]