灰色预测模型
灰色预测模型(Grey Model, GM)是一种基于灰色系统理论的预测方法,由邓聚龙教授于1982年提出。灰色预测适用于数据不完全、信息不足的情况,特别是在只有少量数据可供分析时。灰色预测的基本思想是通过生成数据(Data Generation),利用已知数据建立微分方程模型,然后求解模型参数,进行预测。
灰色预测的基本步骤:
-
数据标准化:
- 将原始数据进行累加或累减生成(AGO),以消除数据的随机波动,使数据呈现某种规律性。
-
建立灰色微分方程:
- 根据数据生成的方法,建立相应的微分方程模型。对于AGO,模型通常为一阶线性微分方程:
- 其中,( x(t) ) 是原始数据的AGO,( a ) 是发展系数,( u ) 是灰色作用量。
- 根据数据生成的方法,建立相应的微分方程模型。对于AGO,模型通常为一阶线性微分方程:
-
数据同化:
- 将数据同化为矩阵形式,以便使用最小二乘法求解模型参数。
-
求解模型参数:
- 利用最小二乘法求解微分方程中的参数( a )和( u )。
-
建立预测模型:
- 根据求得的参数,建立预测模型,用于预测未来的数据点。
-
模型检验:
- 通过后验差检验,计算残差、残差平均值、残差方差等,评估模型的预测精度。
-
进行预测:
- 使用建立的预测模型,对未来的数据点进行预测。
灰色预测模型的特点:
- 适用性广:适用于数据不足、信息不完全的情况。
- 简单易行:模型结构简单,易于理解和应用。
- 预测精度较高:在许多情况下,灰色预测的精度可以满足实际应用的需求。
灰色预测模型的局限性:
- 数据质量依赖性:模型的预测精度在很大程度上依赖于原始数据的质量。
- 适用范围限制:对于非线性或波动较大的数据,灰色预测可能不够准确。
- 参数敏感性:模型参数的微小变化可能会对预测结果产生较大影响。
应用领域:
灰色预测模型广泛应用于经济、社会、科技、环境等多个领域,特别是在数据不足的情况下进行趋势预测和决策分析。
灰色预测作为一种实用的预测工具,虽然在理论上可能不如其他一些预测方法完善,但在实际应用中,由于其简单性和有效性,仍然得到了广泛的应用和认可。
灰色预测模型案例分析及代码实现
# -*- 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('灰色预测法不适用')
灰色预测是一种对含有不确定因素的系统进行预测的方法,特别适用于信息不完全、数据不足的情况下。下面是对上述代码的详细介绍解读:
-
导入库:
numpy
:用于数学运算。math
:用于数学函数。
-
定义历史数据:
history_data
:包含历史数据的列表。
-
生成累加生成数据:
history_data_agg
:通过对原始数据进行累加生成,以便于灰色预测模型的建立。
-
构建数据矩阵和向量:
B
:数据矩阵,用于灰色预测模型。Y
:数据向量,包含原始数据的下一时刻值。
-
计算模型参数:
A
:包含模型参数a和u的向量,通过最小二乘法计算得出。
-
建立灰色预测模型:
XX0
:预测值列表,根据模型参数a和u计算得出。
-
模型精度的后验差检验:
- 计算残差平均值
e
。 - 计算历史数据平均值
aver
。 - 计算历史数据方差
s12
。 - 计算残差方差
s22
。 - 计算后验差比值
C
。
- 计算残差平均值
-
求小误差概率:
- 计算小误差概率
P
,用于评估模型的预测精度。
- 计算小误差概率
-
模型适用性判断:
- 如果后验差比值
C
小于0.35且小误差概率P
大于0.95,则认为模型预测精度为一级,可以进行后续预测。 - 否则,认为“灰色预测法不适用”。
- 如果后验差比值
-
进行预测:
- 如果模型适用,根据需要预测的年数
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
# 可视化原始数据和预测数据
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()