灰色预测模型介绍、python代码实现及可视化

灰色预测模型

灰色预测模型(Grey Model, GM)是一种基于灰色系统理论的预测方法,由邓聚龙教授于1982年提出。灰色预测适用于数据不完全、信息不足的情况,特别是在只有少量数据可供分析时。灰色预测的基本思想是通过生成数据(Data Generation),利用已知数据建立微分方程模型,然后求解模型参数,进行预测。

灰色预测的基本步骤:

  1. 数据标准化

    • 将原始数据进行累加或累减生成(AGO),以消除数据的随机波动,使数据呈现某种规律性。
  2. 建立灰色微分方程

    • 根据数据生成的方法,建立相应的微分方程模型。对于AGO,模型通常为一阶线性微分方程:
      Alt
    • 其中,( x(t) ) 是原始数据的AGO,( a ) 是发展系数,( u ) 是灰色作用量。
  3. 数据同化

    • 将数据同化为矩阵形式,以便使用最小二乘法求解模型参数。
  4. 求解模型参数

    • 利用最小二乘法求解微分方程中的参数( a )和( u )。
  5. 建立预测模型

    • 根据求得的参数,建立预测模型,用于预测未来的数据点。
  6. 模型检验

    • 通过后验差检验,计算残差、残差平均值、残差方差等,评估模型的预测精度。
  7. 进行预测

    • 使用建立的预测模型,对未来的数据点进行预测。

灰色预测模型的特点:

  • 适用性广:适用于数据不足、信息不完全的情况。
  • 简单易行:模型结构简单,易于理解和应用。
  • 预测精度较高:在许多情况下,灰色预测的精度可以满足实际应用的需求。

灰色预测模型的局限性:

  • 数据质量依赖性:模型的预测精度在很大程度上依赖于原始数据的质量。
  • 适用范围限制:对于非线性或波动较大的数据,灰色预测可能不够准确。
  • 参数敏感性:模型参数的微小变化可能会对预测结果产生较大影响。

应用领域:

灰色预测模型广泛应用于经济、社会、科技、环境等多个领域,特别是在数据不足的情况下进行趋势预测和决策分析。

灰色预测作为一种实用的预测工具,虽然在理论上可能不如其他一些预测方法完善,但在实际应用中,由于其简单性和有效性,仍然得到了广泛的应用和认可。

灰色预测模型案例分析及代码实现

# -*- coding: utf-8 -*-
import numpy as np
import math

history_data = [724.57,746.62,778.27,800.8,827.75,871.1,912.37,954.28,995.01,1037.2]
n = len(history_data)
X0 = np.array(history_data)

#累加生成
history_data_agg = [sum(history_data[0:i+1]) for i in range(n)]
X1 = np.array(history_data_agg)

#计算数据矩阵B和数据向量Y
B = np.zeros([n-1,2])
Y = np.zeros([n-1,1])
for i in range(0,n-1):
    B[i][0] = -0.5*(X1[i] + X1[i+1])
    B[i][1] = 1
    Y[i][0] = X0[i+1]

#计算GM(1,1)微分方程的参数a和u
A = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
a = A[0][0]
u = A[1][0]

#建立灰色预测模型
XX0 = np.zeros(n)
XX0[0] = X0[0]
for i in range(1,n):
    XX0[i] = (X0[0] - u/a)*(1-math.exp(a))*math.exp(-a*(i))

#模型精度的后验差检验
e = 0      #求残差平均值
for i in range(0,n):
    e += (X0[i] - XX0[i])
e /= n

#求历史数据平均值
aver = 0;     
for i in range(0,n):
    aver += X0[i]
aver /= n

#求历史数据方差
s12 = 0;     
for i in range(0,n):
    s12 += (X0[i]-aver)**2
s12 /= n

#求残差方差
s22 = 0;       
for i in range(0,n):
    s22 += ((X0[i] - XX0[i]) - e)**2
s22 /= n

#求后验差比值
C = s22 / s12   

#求小误差概率
cout = 0
for i in range(0,n):
    if abs((X0[i] - XX0[i]) - e) < 0.6754*math.sqrt(s12):
        cout = cout+1
    else:
        cout = cout
P = cout / n

if (C < 0.35 and P > 0.95):
    #预测精度为一级
    m = 10   #输入需要预测的年数
    print('往后m各年负荷为:')
    f = np.zeros(m)
    for i in range(0,m):
        f[i] = (X0[0] - u/a)*(1-math.exp(a))*math.exp(-a*(i+n))    
        print(f[i])
else:
    print('灰色预测法不适用')

灰色预测是一种对含有不确定因素的系统进行预测的方法,特别适用于信息不完全数据不足的情况下。下面是对上述代码的详细介绍解读:

  1. 导入库

    • numpy:用于数学运算。
    • math:用于数学函数。
  2. 定义历史数据

    • history_data:包含历史数据的列表。
  3. 生成累加生成数据

    • history_data_agg:通过对原始数据进行累加生成,以便于灰色预测模型的建立。
  4. 构建数据矩阵和向量

    • B:数据矩阵,用于灰色预测模型。
    • Y:数据向量,包含原始数据的下一时刻值。
  5. 计算模型参数

    • A:包含模型参数a和u的向量,通过最小二乘法计算得出。
  6. 建立灰色预测模型

    • XX0:预测值列表,根据模型参数a和u计算得出。
  7. 模型精度的后验差检验

    • 计算残差平均值e
    • 计算历史数据平均值aver
    • 计算历史数据方差s12
    • 计算残差方差s22
    • 计算后验差比值C
  8. 求小误差概率

    • 计算小误差概率P,用于评估模型的预测精度。
  9. 模型适用性判断

    • 如果后验差比值C小于0.35且小误差概率P大于0.95,则认为模型预测精度为一级,可以进行后续预测。
    • 否则,认为“灰色预测法不适用”。
  10. 进行预测

    • 如果模型适用,根据需要预测的年数m,计算并打印出未来m年的预测值。

灰色预测模型的关键在于通过最小二乘法确定模型参数,然后利用这些参数来预测未来的数据点。模型的适用性通过后验差比值和误差概率进行评估,以确保预测的可靠性。

需要注意的是,灰色预测法适用于具有一定规律性的数据,如果数据波动较大或者没有明显的规律,灰色预测可能不适用。此外,灰色预测法的精度也受到数据质量和数量的影响。

模型结果可视化

使用matplotlib库来绘制原始数据、预测数据和残差

# 可视化
import matplotlib.pyplot as plt
# 用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
# 用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False 
plt.figure(figsize=(10, 6))
plt.plot(history_data, label='原始数据')
plt.plot(XX0, label='预测数据')
plt.scatter(range(n), XX0, color='red', label='预测点', zorder=5)
plt.scatter(range(n), history_data, color='blue', label='原始点', zorder=5)
plt.title('灰色预测模型可视化')
plt.xlabel('时间')
plt.ylabel('数据值')
plt.legend()
plt.show()
往后m各年负荷为:
1079.3804472397678
1125.6545763553997
1173.9125240874293
1224.2393387420698
1276.7237147322548
1331.4581488899137
1388.5391034795105
1448.0671762001398
1510.1472774757826
1574.8888153461746

Alt

# 可视化原始数据和预测数据
plt.figure(figsize=(10, 6))
plt.plot(range(n), X0, label='原始数据')
plt.plot(range(n, n+m), f, label='未来预测数据', linestyle='--', color='red')
plt.title('灰色预测模型可视化')
plt.xlabel('时间')
plt.ylabel('数据值')
plt.legend()
plt.show()

Alt

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
灰色预测模型是一种基于数学模型的预测方法,用于预测具有一定趋势性但数据量较少的时间序列。下面是一个简单的Python代码示例,用于实现灰色预测模型可视化结果。 首先,我们需要导入所需的库: ``` import numpy as np import matplotlib.pyplot as plt ``` 接下来,定义一个函数来执行灰色预测模型的计算: ``` def grey_predict(data, n): # 累加生成累加数据 accumulative_data = np.cumsum(data) # 计算生成累加生成数 accumulative_generation = np.cumsum(data[:-1]) # 生成数据矩阵 B = np.zeros((n-1, 2)) for i in range(n-1): B[i, 0] = -0.5 * (accumulative_generation[i] + accumulative_generation[i+1]) B[i, 1] = 1 # 计算参数 Y = accumulative_data[1:] m = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y) # 预测 predict = np.zeros(len(data)) for i in range(len(data)): if i == 0: predict[i] = data[0] else: predict[i] = (data[0] - m[0] / m[1]) * np.exp(-m[1] * (i-1)) + m[0] / m[1] return predict ``` 接下来,我们生成一些示例数据,并对其进行灰色预测: ``` # 生成示例数据 data = np.array([22, 24, 25, 28, 29, 33, 35, 39, 40, 42]) # 灰色预测 n = len(data) predict = grey_predict(data, n) ``` 最后,我们使用Matplotlib库来可视化原始数据和预测结果: ``` # 可视化结果 plt.plot(range(n), data, 'bo-', label='原始数据') plt.plot(range(n), predict, 'ro-', label='预测结果') plt.xlabel('时间') plt.ylabel('数值') plt.title('灰色预测模型') plt.legend() plt.show() ``` 这样,我们就完成了灰色预测模型实现和结果可视化。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值