用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现

1. 灰色预测的概念

(1)灰色系统、白色系统和黑色系统

白色系统是指一个系统的内部特征是完全已知的,既系统信息是完全充分的。

黑色系统是一个系统的内部信息对外界来说是一无所知的,只能通过它与外界的联系来加以观测研究。

灰色系统介于白色和黑色之间,灰色系统内的一部分信息是已知的,另一部分信息是未知的,系统内各因素间有不确定的关系。

(2)灰色预测法

所以灰色预测就是通过这样的信息前提下做的一种预测分析,即灰色预测法是一种预测灰色系统的预测方法。

灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况,最后得到其发展的模型。

一般表达方式为GM(n,x)模型,其含义是:用n阶微分方程对x个变量建立模型

关联分析实际上是动态过程发展态势的量化比较分析。所谓发展态势比较,也就是系统各时期有关统计数据的集合关系的比较。例如,某地区1977~1983年总收入与养猪、养兔收入资料见下表格。

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第1张图片

2. 灰色生成数列

灰色系统理论认为,尽管客观表象复杂,但总是有整体功能的,因此必然蕴含某种内在规律。关键在于如何选择适当的方式去挖掘和利用它。灰色系统是通过对原始数据的整理来寻求其变化规律的,这是一种就数据寻求数据的现实规律的途径,也就是灰色序列的生产。一切灰色序列都能通过某种生成弱化其随机性,显现其规律性。数据生成的常用方式有累加生成、累减生成和加权累加生成,将灰色系统中的未知因素弱化,强化已知因素的影响程度,最后构建一个以时间为变量的连续微分方程,通过数学方法确定方程中的参数,从而实现预测目的。

(1)累加生成(AGO)

设原始序列为

c28aa792522b3239cac26d1c60731a24.png ,令

f9a6116e7c326cf7e469287cb0fd65c8.png

07af7b16e1488511d7c64e007c4fdb1e.png 为数列

350903cfa623ef6c19802b5bdc75a711.png 的1次累加生成数列。类似的有:

817c2cc98a27740b42aae8ef98529c5d.png 称为

3f439a7ad385b12b4af587a2cae7a1d0.png 的r次累加生成数列

(2)累减生成(IAGO)

如果原始数列为

99b06555edd5c86ba62cf0816694b982.png ,令

c4ddcbe61ca034c6fbe2dcd1e154021f.png ,称

ccd3f2996ad76ade0ab1073d8e6d7311.png 为x1

99b06555edd5c86ba62cf0816694b982.png 的1次累减生成数列。

(3)加权邻值生成:

如果原始数列为

86c4c67c5d9ddb56564a6def0fb5c071.png ,称任意一对相邻元素

4fac6f85348bc3c70b002a65bf20b3fe.png 互为邻值。对于常数

5d3db462fc702f0b472dd65ccecff0e4.png ,令

fe975d3606a980f0e305c02521042df7.png

由此得到的数列称为邻值生成数,权α 也称为生成系数。特别地,当α=0.5 时,则称该数列为均值生成数,也称为等权邻值生成数。

3. 灰色模型GM(1,1)

灰色系统理论是基于关联空间、光滑离散函数等概念定义灰导数与灰微分方程,进而用离散数据列建立微分方程形式的动态模型,即灰色模型是利用离散随机数经过生成变为随机性被显著削弱而且较有规律的生成数,建立起的微分方程形式的模型,这样便于对其变化过程进行研究和描述。

G表示grey(灰色),M表示model(模型)

定义

18c6af7e1be54e5ff53e840d61bfb3cf.png 的灰导数为:

a0a368348f7ffebb1c235ba254b9aaf8.png

cc86d87d3941d6ba338fff70a647d0d9.png 为数列

2534227f580fc4d41d9935ba52917041.png 的邻值生成数列,即

57965e56d4a3cf5160f0822ff594ca8e.png

于是定义GM(1,1,)的灰微分方程模型为:

e90b1a52b651ee5af970eaa3b02d2c4a.png

e90b1a52b651ee5af970eaa3b02d2c4a.png ,其中

c25a326809e257846c057a36fea68dce.png 称为灰导数,

4f0c88653242cada1dc83ec411ab6a8a.png 称为发展系数,

3b25c4179de0bbc72edf71836bee0447.png 称为白化背景值,b称为灰作用量。

将时刻k=2,3,…,n代入上式有

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第2张图片

引入矩阵向量记号:

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第3张图片

于是GM(1,1模型可表示为Y=Bu

那么现在的问题就是求a和b的值,我们可以用一元线性回归,也就是最小二乘法求它们的估计值:

f3efc56db34be246b2f98fe5324e538b.png

对于GM(1,1)的灰微分方程,如果将时刻k=2,3,…,n视为连续变量t,则之前的

0728255845b1c2b0154578da3bd43bae.png 视为时间t函数,于是灰导数

19cd2dfed9cd3b5f0ae7fe42270b12cf.png 变为连续函数的导数e0247d4c958623d477fe66164eb38d4f.png ,白化背景值

b77a8bf09ba17a5948e26c525a90ac08.png 对应于导数

3f232efbdbe44366aedc7e2597b9e41c.png ,于是GM(1,1)的灰微分方程对应于的白微分方程为:b61888734ef99ae5a684cf4029b7b24a.png

4. GM(1,1)灰色预测的步骤

(1)数据的检验与处理

为了保证GM(1,1)建模方法的可行性,需要对已知数据做必要的检验处理。设原始数据列为

8aab580d9355411b1afa1cdcc60866b4.png ,首先计算数列的级比:

8aab580d9355411b1afa1cdcc60866b4.png

如果所有的级比都落在可容覆盖区间

742b5c8f80b8f3e1965bc74b8c6fe976.png 内,则数列

7db4585b54ed8d8b76d32a1fbe7e80a3.png 可以建立GM(1,1)模型且可以进行灰色预测。否则,对数据做适当的变换处理,如平移变换:

4892f5c5349c70005fdc987f06b372ce.png ,取c使得数据列的级比都落在可容覆盖内。

(2)建立GM(1,1)模型

不妨设

af4054b853157d9889beb1a44a06b628.png 满足上面的要求,以它为数据列建立GM(1,1)模型

8a0992af3ea82cd5e64f5ba850de1cd0.png ,用回归分析求得a,b的估计值,于是相应的白化模型为:45c7161e97abbbbcab562c805dcdd749.png ,解为

ac479b5c11582b9e16a675912ef5dec4.png

于是得到预测值:

7dbb6823e7674af0da83793c43859d76.png

从而相应地得到预测值:

02213f3f6d87f33b5cca22f8b1bbfbbe.png

5. 检验预测值

(1)残差检验:计算相对残差:4636bb4b7860ea848c405024117dda17.png ,如果对所有的|ε(k)|<0.1,则认为到达较高的要求;否则,若对所有的|ε(k)|<0.2,则认为达到一般要求。

(2)级比偏差值检验:计算:669b32ccf2473c64afa284c1c2abb1d7.png 。如果对所有的

a0de350e82b7933765aa39547d8de180.png ,则认为达到较高的要求;否则,对于所有的

da0f2581304a96247cb789fe415e3ab9.png ,则认为达到一般要求。

6. 计算实例

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第4张图片

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第5张图片

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第6张图片

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第7张图片

用python建立gm(1、1)模型_灰色预测模型GM(1,1)的全面讲解及python实现_第8张图片

Python完整代码:

importpandasaspd

importnumpyasnp

defstep_ratio(x0):

n =len(x0)

ratio = [x0[i]/x0[i+1]foriinrange(len(x0)-1)]print(f"级比:{ratio}")

min_la, max_la =min(ratio),max(ratio)

thred_la = [np.exp(-2/(n+2)), np.exp(2/(n+2))]ifmin_la < thred_la[0]ormax_la > thred_la[-1]:print("级比超过灰色模型的范围")else:print("级比满足要求,可用GM(1,1)模型")returnratio, thred_la

defpredict(x0):

n =len(x0)

x1 = np.cumsum(x0)

z = np.zeros(n-1)foriinrange(n-1):

z[i] =0.5*(x1[i]+x1[i+1])

B = [-z, [1]*(n-1)]

Y = x0[1:]

u = np.dot(np.linalg.inv(np.dot(B, np.transpose(B))),np.dot(B, Y))

x1_solve = np.zeros(n)

x0_solve = np.zeros(n)

x1_solve[0] = x0_solve[0] = x0[0]foriinrange(1, n):

x1_solve[i] = (x0[0]-u[1]/u[0])*np.exp(-u[0]*i)+u[1]/u[0]foriinrange(1, n):

x0_solve[i] = x1_solve[i] - x1_solve[i-1]returnx0_solve, x1_solve, u

defaccuracy(x0, x0_solve, ratio, u):

epsilon = x0 - x0_solve

delta =abs(epsilon / x0)print(f"相对误差:{delta}")# Q = np.mean(delta)

# C = np.std(epsilon)/np.std(x0)S1 = np.std(x0)

S1_new = S1*0.6745temp_P = epsilon[abs(epsilon-np.mean(epsilon)) < S1_new]

P =len(temp_P)/len(x0)print(f"预测准确率:{P*100}%")

ratio_solve = [x0_solve[i]/x0_solve[i+1]foriinrange(len(x0_solve)-1)]

rho = [1-(1-0.5*u[0]/u[1])/(1+0.5*u[0]/u[1])*(ratio[i]/ratio_solve[i])foriinrange(len(ratio))]print(f"级比偏差:{rho}")returnepsilon, delta, rho, P

if__name__ =='__main__':

data=pd.DataFrame(data={"year":[1986,1987,1988,1989,1990,1991,1992],"eqL":[71.1,72.4,72.4,72.1,71.4,72.0,71.6]})

x0 = np.array(data.iloc[:,1])

ratio, thred_la = step_ratio(x0)

x0_solve, x1_solve, u = predict(x0)

epsilon, delta, rho, P = accuracy(x0, x0_solve, ratio, u)

7. 优缺点:

灰色系统预测模型的特点:无需大量数据样本,短期预测效果好,运算过程简单。

灰色系统预测模型的不足:对非线性数据样本预测效果差。

8. GM(1,n)模型

GM(1,n)模型的预测原理与GM(1,1)类似,不同在于输入数据变量为N个。即:

f302ce5f400ea29d92f1ba46105f3a1f.png ,其它特征数据序列分别为:

b432a1ab00027e24c308d256d58fe7be.png

……

c60baed0834a085e7f6621e53f650688.png

这样,只需每个变量对应数据列建立GM(1,1)模型即可,即

9b61364289619670e402bcc9e6ffb0eb.png

参考地址:https://blog.csdn.net/qq547276542/article/details/77865341

你可能感兴趣的:(用python建立gm(1,1)模型)