0 结果
预测值: [458056.4 474676.4 491899.5 509747.4 528243. 547409.7 567271.8 587854.5
609184.1]
{'a': {'value': -0.03564103004249024, 'desc': '发展系数'}, 'b': {'value': 363981.09822638164, 'desc': '灰色作用量'}, 'predict': {'value': array([458056.39625066, 474676.41603599, 491899.47304539, 509747.44775184,
528243.01453467, 547409.67048553, 567271.76525949, 587854.53200927,
609184.11944186]), 'desc': '往后预测9个的序列'}, 'C': {'value': 0.3206327936499709, 'desc': '后验差比<=0.35,模型精度等级为好'}}
1 背景
19 世纪天文学者使用微分方程预测了天王星轨道的微分方程 ,随后又成功预测了海王星的出现,而灰色预测便是后面科学家发展出来的一种常微分方程预测 模型。 2002年邓聚龙教授 创立了灰色理论预测方法,该方法是指系统中既含有己知信息(白色),又含有未知信息或非确定信息(灰色或黑色)。灰色理论将随机变量看作是在一定范围内变化的灰色变量,将随机过程看作是在一定范围内变化,且与时间有关的灰色过程。灰色理论对数据的处理方法不再是简单的从数理统计规律出发来对待灰色变量,而使用数据处理的方法,将原始数据整理成规律性数列再进行研究。灰色理论自从产生以来,得到了广泛的应用。 灰色预测GM(1,1) 模型是灰色理论常用的预测模型 。
灰色预测具有操作简单、所需数据量少的优点 ,一般只要 4 个数据便可依据灰色预测序列进行预测。
2 建模
2.1 建模步骤
灰色预测的基本建模步骤如下:
1 )对原始数据进行累加,来达到降噪的目的;
2 )构造累加矩阵 B 与常数向量;
3 )使用微分方程求解灰参数 ;
4 )将参数带入预测模型进行数据预测。
2.2 模型检验
灰色预测模型使用后检差进行模型检验。
后验差的基本计算步骤如下:
1,求出原始数据的标准差 S1 ;
2,求出所有预测数据的残差的标准差 S 2 ;
3,求出 S2/S1 的比值 记为 C,C 即后验差比值 ;
4,将 C 与后验差精度等级表做对比,判断精度等级。
3 代码实现
import numpy as np
# 灰色预测
def GM11(x,n):
'''
灰色预测
x:序列,numpy对象
# test_num = {'10': 351204, '11': 380686, '12': 402811, '01': 427932, '02': 389114, '03': 460390}
# data = np.array(list(cigarette_num.values()))
# x = data # 输入数据
n:需要往后预测的个数
'''
x1 = x.cumsum()#一次累加
z1 = (x1[:len(x1) - 1] + x1[1:])/2.0#紧邻均值
z1 = z1.reshape((len(z1),1))
B = np.append(-z1,np.ones_like(z1),axis=1)
Y = x[1:].reshape((len(x) - 1,1))
#a为发展系数 b为灰色作用量
[[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)#计算参数
result = (x[0]-b/a)*np.exp(-a*(n-1))-(x[0]-b/a)*np.exp(-a*(n-2))
S1_2 = x.var()#原序列方差
e = list()#残差序列
for index in range(1,x.shape[0]+1):
predict = (x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2))
e.append(x[index-1]-predict)
S2_2 = np.array(e).var()#残差方差
C = S2_2/S1_2#后验差比
if C<=0.35:
assess = '后验差比<=0.35,模型精度等级为好'
elif C<=0.5:
assess = '后验差比<=0.5,模型精度等级为合格'
elif C<=0.65:
assess = '后验差比<=0.65,模型精度等级为勉强'
else:
assess = '后验差比>0.65,模型精度等级为不合格'
#预测数据
predict = list()
for index in range(x.shape[0]+1,x.shape[0]+n+1):
predict.append((x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2)))
predict = np.array(predict)
return {
'a':{'value':a,'desc':'发展系数'},
'b':{'value':b,'desc':'灰色作用量'},
'predict':{'value':result,'desc':'第%d个预测值'%n},
'C':{'value':C,'desc':assess},
'predict':{'value':predict,'desc':'往后预测%d个的序列'%(n)},
}