灰色预测模型的详细内容及代码示例

总体概述

灰色预测模型(Grey Prediction Model) 是一种基于灰色系统理论的预测模型,主要用于处理具有少量数据、缺乏规律性和不确定性的时间序列数据。

什么是灰色系统:如果某一系统的全部信息已知为白色系统;全部信息未知为黑箱系统;部分信息已知,部分信息未知,那么这一系统就是灰色系统。

灰色预测模型的基本思想是通过建立灰度微分方程,对原始数据进行处理,从而实现数据序列的规律性揭示和未来趋势的预测。主要应用于具有短期数据、少样本和不完整信息的情况。其特点、优点和缺点如下:

特点:

  1. 适用于具有不完整信息和少样本数据的情况,可以处理一些不确定性问题。
  2. 在短期预测和小样本预测方面表现良好,尤其适用于时间序列数据。
  3. 基于少量历史数据进行预测,不需要假设数据之间的具体关系,因此具有一定的灵活性。
  4. 可以较好地处理非线性和非平稳的数据序列,适用于一些复杂的实际问题。

优点:

  • 不需要对数据进行严格的统计假设,因此可以更加灵活地适应不同的预测需求。
  • 可以在数据量较少或者数据不完整的情况下进行预测,具有较强的鲁棒性。
  • 在短期预测方面效果较好,能够有效地处理一些具有较强周期性或季节性的数据。

缺点:

  • 在长期预测方面的准确性可能不如一些其他预测模型,尤其是当数据量较少或者数据变化较为复杂时。
  • 该模型在处理非线性和非平稳数据时存在一定的局限性,对于某些复杂的数据序列可能预测效果不佳。
  • 建模过程相对较为复杂,需要进行参数的选择和模型的优化,不够直观和简单。
  • 该模型对数据的质量要求较高,需要确保数据的准确性和完整性,否则容易导致预测结果的不准确性。

步骤

灰色预测模型通常包括以下几个步骤:

  1. 建立灰度微分方程: 对原始数据进行初步处理,得到灰度微分方程,用以描述数据的变化规律。
  2. 建立GM(1,1)模型: 根据灰度微分方程建立GM(1,1)模型,对数据进行拟合和预测。
  3. 模型检验与优化: 对预测结果进行检验,评估模型的准确性,并根据需要对模型进行调整和优化。
  4. 预测未来趋势: 利用已建立的灰色预测模型进行未来数据的预测,并提供相应的预测结果。

需要注意的是,灰色预测模型对数据的要求相对较低,适用于一些缺乏充分历史数据或者不规律的时间序列。但同时也存在一些局限性,如对数据质量和稳定性要求高、对系统结构和变化规律的假设等。

原理

设2022,2023,2024这三年的数据分别为 X1(0)=200 , X2(0)=100 , X3(0)=300 , 是无序的一组序列,做一次累加生成新的序列,得到 X1(1)=200 , X2(1)=300 , X3(1)=600 一组递增的序列,公式如下:

在这里插入图片描述

之后生成均值序列:在这里插入图片描述
注意:式中 0≤α≤1 为权重,通常当α取0.5的时候叫均值序列,由此建立灰微分方程:

在这里插入图片描述

相应的白化微分方程为:

在这里插入图片描述

将灰微分方程移项得到:

在这里插入图片描述

a,b 为待定参数,上式可以写成矩阵的形式有:

在这里插入图片描述

即 Xβ = Y ,由最小二乘法可以确定参数矩阵 β 的估计值:

在这里插入图片描述

由此得到参数点 a,b 的估计值,带入白化方程得到序列xk(1)的通解:

在这里插入图片描述

还原到原始数列即得到预测函数:

在这里插入图片描述

模型检验

灰色预测模型的检验一般根据后验差比(C)的大小来评估模型的拟合效果,常见的评价级别如下:

  • 一级:后验差比(C)小于等于0.35,表示模型拟合效果非常好。
  • 二级:后验差比(C)在0.35到0.5之间,表示模型拟合效果合格。
  • 三级:后验差比(C)在0.5到0.65之间,表示模型拟合效果勉强。
  • 四级:后验差比(C)大于0.65,表示模型拟合效果不合格。

这些级别的划分通常是根据经验和实际情况而定,旨在提供一种简单的方式来评估模型的拟合效果。级别越低表示模型的拟合效果越差,级别越高表示模型的拟合效果越好。在实际应用中,可以根据具体情况调整评价标准。

具体使用方法请见后续代码

代码示例

import numpy as np
import matplotlib.pyplot as plt

data = np.array([25, 42, 68, 128, 246])  # 噪音数据
lens = len(data)

# 构建灰色模型GM(1,1)
data_add = data.cumsum()    #计算原始数据的累加和,得到累加数据
ds = data[1:]   #去除原始数据的第一个元素,得到紧邻均值序列
zs = -1 / 2 * (data_add[:-1] + data_add[1:])    #根据累加数据计算紧邻均值序列
B = np.vstack((zs, np.ones(lens - 1))).T    #构建设计矩阵B,其中包括紧邻均值序列和全为1的列向量
Y = ds.reshape(-1, 1)   #将紧邻均值序列重新塑形为列向量,作为因变量Y
a, b = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)    #使用最小二乘法拟合线性模型,得到系数a和b
print('a =', a)
print('b =', b)

# 预测
def forecast(k):
    c = b / a
    return (data[0] - c) * (np.e ** (-a * k)) + c

data_1_for = []  # 累加预测值
data_0_for = []  # 原始预测值
data_1_for.append(forecast(0))
data_0_for.append(data_1_for[0])
for i in range(1, lens + 5):  # 多预测5次
    data_1_for.append(forecast(i))
    data_0_for.append(data_1_for[i] - data_1_for[i - 1])
print('预测值为:')
for i in data_0_for:
    print(i)

# 模型检验
data_h = np.array(data_0_for[:lens])
sum_h = data_h.sum()
mean_h = sum_h / lens
S1 = np.sum((data_h - mean_h) ** 2) / lens
e = data - data_h
e_sum = e.sum()
e_mean = e_sum / lens
S2 = np.sum((e - e_mean) ** 2) / lens
C = S2 / S1
if C <= 0.35:
    print('1级,效果好')
elif 0.35 < C <= 0.5:
    print('2级,效果合格')
elif 0.5 < C <= 0.65:
    print('3级,效果勉强')
else:
    print('4级,效果不合格')

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 可视化预测结果
plt.figure(figsize=(10, 6))
plt.plot(np.arange(1, lens + 1), data, 'bo-', label='原始数据')
plt.plot(np.arange(1, lens + 6), data_0_for, 'r*--', label='预测数据')
plt.xlabel('时间')
plt.ylabel('数据值')
plt.title('灰色预测模型预测结果')
plt.legend()
plt.grid(True)
plt.show()

运行结果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值