Python实现灰色预测模型————在极少数据量的条件下进行数据预测

本文介绍了灰色预测GM(1,1)模型,包括其背景、建模步骤(累加、构造矩阵、求解参数和预测)以及模型检验(后验差比法)。提供了一个Python代码实现,展示了如何使用该模型进行预测并评估其精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)},
            }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星蓝雨

如果觉得文章不错,可以请喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值