1.概念理解
G(grey)、M(Model)、(1,1)表示只含有一个变量的一阶微分方程模型。
灰色是介于白色和黑色之间的,部分已知,部分未知。以GDP为例,我们有往年的数据和一定的理论基础,但是无法精确计算下一年的值。
2.适用场景
数列预测:定时求量。已知xx年到xx年的数据,请预测下一年的数据。比如GDP、人口数量、耕地面积、粮食产量等问题。
灾变预测:定量求时。已知xx年到xx年的数据和某灾变的阈值,预测下一次灾变发生的时间。比如洪涝灾害、虫灾等问题。
拓扑预测:对数据波形进行预测,等于求解多个灾变预测,以虫灾为例,将虫灾分为"轻微"、“中度”、“重度”,也就是有三个阈值,然后我们去预测分别到达这三个阈值的年份。
3.建模步骤
- 根据原始数据,通过累加等方式削弱随机性、获得有规律的新序列
- 建立相应的微分方程模型,得到离散点处的解
- 再通过累减求得原始数据的估计值,从而对原始数据预测
4.优缺点分析
灰色预测模型在建模过程中所需要的数据量比较少,预测比较准确,精度较高。以及预测模型的样本分布不需要有规律性,计算简便,检验方便。但是灰色预测模型只适用于中长期预测,不适用与短期分析。
时间序列模型的优点,主要是可以从时间序列中找出变量变化的特征、趋势以及发展规律,从而对变量的未来变化进行有效地预测。而时间序列模型的缺点,主要是时间序列预测法因突出时间序列暂不考虑外界因素影响,因而存在着预测误差的缺陷,当遇到外界发生较大变化,往往会有较大偏差,时间序列预测法对于中短期预测的效果要比长期预测的效果好。
5.代码参数
#!/usr/bin/env python
# coding: utf-8
# In[ ]:
# GM模型,预测
def GM11(x0): #自定义灰色预测函数
import numpy as np
x1 = x0.cumsum() #1-AGO序列
x1 = pd.DataFrame(x1)
z1 = (x1 + x1.shift())/2.0 #紧邻均值(MEAN)生成序列
z1 = z1[1:].values.reshape((len(z1)-1,1)) # 转成矩阵
B = np.append(-z1, np.ones_like(z1), axis = 1) # 列合并-z1和形状同z1的1值矩阵 19X2
Yn = x0[1:].reshape((len(x0)-1, 1)) # 转成矩阵 19
[[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Yn) #计算参数,基于矩阵运算,np.dot矩阵相乘,np.linalg.inv矩阵求逆
f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) #还原值
delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0)+1)])) # 残差绝对值序列
C = delta.std()/x0.std()
P = 1.0*(np.abs(delta - delta.mean()) < 0.6745*x0.std()).sum()/len(x0)
return f, a, b, x0[0], C, P #返回灰色预测函数、a、b、首项、方差比、小残差概率