灰色预测模型

前言

灰色预测模型(Grey Prediction Model)是一种用于处理具有不完整信息、不确定性的系统建模和预测的方法。该模型通过分析序列数据的发展规律,对未来的趋势进行预测。

GM(1,1)模型的数学实现:

以GM(1,1)模型为例,给定一个原始序列 ,GM(1,1)模型的数学实现包括以下步骤:

  1. 累加生成序列 , ,..., :
  2. 近邻均值生成序列 , ,..., :
  3. 建立GM(1,1)模型:

假设GM(1,1)模型的微分方程为 :

求解微分方程得到:

其中 , 为时间变量

模型预测则是在 的基础上,进行 个时间单位的预测,预测公式为:

其中, 为第 个预测值 4. 模型检验:

计算后验差比 :

其中 表示残差(模型拟合值与实际观测值的差异)的方差, 表示原始序列的方差

如果 ,则认为模型精度等级为好

如果 ,则认为模型精度等级为合格

如果 ,则认为模型精度等级为勉强

如果 ,则认为模型精确度等级不合格

后验差比主要用于检验模型的精确性,以确保模型对实际数据的拟合程度符合预期

在灰色预测模型 GM(1,1) 中,有两个关键的参数:发展系数

和灰色作用量

  1. 发展系数 :

发展系数是描述原始序列 在累加生成序列 中的发展趋势的参数

反映了原始序列的发展速度。它越大,表示序列的发展越快;越小,表示序列的发展越慢

在 GM(1,1) 模型中, 是通过对差分方程进行求解得到的

  1. 灰色作用量 :

灰色作用量表示原始序列 的发展中受到的影响或作用

它是在 GM(1,1) 模型中用于调整序列的参数,以更好地拟合实际情况

的值的大小会影响灰色模型的拟合效果,通常通过最小二乘法等方式估计

这两个参数的确定是建立 GM(1,1) 模型的关键步骤,而模型的建立和预测过程就是基于这两个参数进行的。在 GM(1,1) 模型中,发展系数 描述了序列的发展趋势,而灰色作用量 调整了模型,使其更好地适应实际数据。

代码实现


          
import numpy as np
          
import pandas as pd
          
import matplotlib.pyplot as plt
          
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
          
plt.rcParams['axes.unicode_minus'] = False
          

          
data = pd.read_excel('数据.xlsx', index_col = 0) 
          
data.head()
      

picture.image

数据为1994年到2015年国内社会消费品零售总额


          
plt.figure(figsize=(10,5), dpi =300)
          
plt.grid(True)
          
plt.plot(data['社会消费品零售总额'])
          
plt.title('社会消费品零售总额')
          
plt.xlabel('时间')
          
plt.ylabel('社会消费品零售总额')
          
plt.show()
      

picture.image


          
fy = []
          
def GM11 (x,n):
          
    '灰色预测 x:序列,numpy对象 n:需要往后预测对象'
          
    x1 = x.cumsum() #累加
          
    z1 = (x1[:len(x1)-1]+x1[1:])/2 #紧邻均值
          
    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)
          
        print(predict) # 预测值
          
        fy.append(predict)
          
    print('后验差检验')
          
    S2_2 = np.array(e).var() #残差方差
          
    C = S2_2/S1_2 # 后验差比
          
    if C<=0.35:
          
        assess = '后验差比<=0.35,模型精度等级为好'
          
    elif C<=0.5:
          
        assess = '0.35<后验差比<=0.5,模型精度等级为合格'
          
    elif C<=0.65:
          
        assess = '0.5<后验差比<=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)},
          
    }
      

实现灰色预测模型的函数,用于对给定的时间序列数据进行预测。主要步骤包括累加处理、计算紧邻均值、建立灰色预测模型等。函数输出包括发展系数 、灰色作用量 、第 个预测值、后验差比 以及往后预测 个序列的预测结果。后验差比用于评估模型精度,根据其值的不同,模型精度被分为好、合格、勉强和不合格四个等级。最终,预测结果以字典形式返回,包括以上提到的各项指标


        
            

          GM11(data['社会消费品零售总额'].values,2)
        
      

picture.image


          
plt.figure(figsize=(10,5), dpi =300)
          
plt.grid(True)
          
plt.plot(data['社会消费品零售总额'],label = '原始数据')
          
plt.plot(range(1994,2018),fy+[9605.83337569, 11027.20213579],label = '预测数据')
          
plt.title('社会消费品零售总额')
          
plt.xlabel('时间')
          
plt.ylabel('社会消费品零售总额')
          
plt.legend()
          
plt.show()
      

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

0
0
0
0
评论
未登录
暂无评论