本篇文章摘录自GM(1,n) - 数模百科,如果你希望了解更多关于灰色模型的知识,请移步?灰色预测模型 - 数模百科
在阅读本篇文章之前,强烈建议先阅读这篇文章?【数模百科】一篇文章讲清楚灰色预测模型GM(1,1)附python代码-CSDN博客
回归正题。
说到GM(1,n)模型,这里面的“1”表示模型中只有一个微分方程,而“n”则说明有n个变量参与进来。与我们之前了解的GM(1,1)模型不同,在GM(1,1)模型中只有一个因变量和一个自变量,而GM(1,n)模型则是在多变量的情况下进行预测,适合那种多因素影响下的预测问题。
比方说,咱们要预测一个地区的电力消费量,这个消费量可能不仅仅和时间有关,还可能和当地的经济发展水平、人口数量、工业结构等多个因素有关。这种多因子的情况下,就可以考虑用GM(1,n)模型来进行预测分析,它可以帮助咱们从有限的、不完全的数据中,找到这些因素与电力消费量之间的关系。
总结一下,GM(1,n)模型是灰色预测的一种扩展,它适用于数据量不大、信息不完全但又受多种因素影响的预测场景。通过对不完全信息的把握和挖掘,GM(1,n)模型能够帮助我们在复杂多变的实际问题中,找到规律,进行相对准确的预测。
灰色预测模型GM(1,n)被广泛应用于对多元变量的预测。这个模型通过灰色关联度来度量因素之间的影响关系。
给定一个多元时间序列数据集
其中,为第 k 个变量向量, k=1,2, ..., n。我们先生成累加序列
其中,
模型的微分方程为
通过最小二乘法求解模型参数。
然后,求解得到的微分方程,生成预测序列
预测序列 可以由以下公式得到:
最后,通过将累加生成序列反演,即求差分,得到原始预测序列
对于这种多变量的情况来说,GM(1,n)模型对于具有线性关系的多元序列具有较好的预测性能,但是当序列之间存在非线性关系时,模型的预测性能可能会下降。因此,灰色预测模型GM(1,n)更适用于短期预测,对于长期预测,需要其他更加合适的模型。
import numpy as np
import math as mt
import matplotlib.pyplot as plt
# 累加生成函数
def generate_AGO(m):
return np.cumsum(m).tolist()
# 紧邻均值生成函数
def generate_Z(m):
return [(m[j]+m[j-1])/2 for j in range(1,len(m))]
# 初始化原始数据和相关因素序列
orig_data = [560823,542386,604834,591248,583031,640636,575688,689637,570790,519574,614677]
factor_seq = [[104,101.8,105.8,111.5,115.97,120.03,113.3,116.4,105.1,83.4,73.3],
[135.6,140.2,140.1,146.9,144,143,133.3,135.7,125.8,98.5,99.8],
[131.6,135.5,142.6,143.2,142.2,138.4,138.4,135,122.5,87.2,96.5],
[54.2,54.9,54.8,56.3,54.5,54.6,54.9,54.8,49.3,41.5,48.9]]
# 生成累加序列和B矩阵
B = np.array(generate_Z(generate_AGO(orig_data))).reshape(-1, 1)
Xi = np.array([generate_AGO(x)[1:] for x in factor_seq]).T
# 构建B矩阵和Y向量
B = np.hstack((-B, Xi))
Y = np.mat(orig_data)[0, 1:].T
# 求解参数
params = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
al, b = float(params[0]), np.array(params[1:]).flatten().tolist()
# 构建驱动值
# 见数模百科
# 计算预测并生成预测模型
F = [(orig_data[0] - U[i-1] / al) / (mt.exp(al * i)) + U[i-1] / al for i in range(len(U))]
# 还原生成预测数据
F.insert(0, orig_data[0])
predicted_data = [F[i] - F[i - 1] for i in range(1, len(F))]
predicted_data.insert(0, orig_data[0])
# 展示预测结果
plt.plot(orig_data, 'r--', label='原始数据')
plt.plot(predicted_data, 'b--', label='预测数据')
plt.legend(loc='upper right')
plt.show()
这段代码实现了灰色预测模型GM(1,n),并对预测结果进行了可视化,具体步骤如下:
根据初始数据,包括原始数据序列和相关序列,生成AGO(累加生成)序列。
对AGO序列进行紧邻均值生成计算,形成均值矩阵Z。
对相应的AGO序列和均值矩阵Z构建估值矩阵B和实际值向量Y。
利用最小二乘法求解参数向量theat,其中包含发展系数和驱动序列。
根据获得的参数计算预测序列,包括首先构造驱动值,然后基于这些驱动值和参数构造预测模型。
将预测序列通过累减还原操作转化为预测数据。
利用matplotlib库对原始数据和预测数据进行可视化展示,以便直观比较预测结果和实际情况。
通过这个程序,我们可以基于一组数据及其相关因素进行预测,然后用预测结果来进行未来趋势的判断或者进行决策。
优点:
灰色预测模型GM(1,n)相对于GM(0,1)模型更能适应多因素问题,对复杂数据的预测和分析更为准确。
模型参数较少,计算复杂度低,易于理解和实施。
缺点:
对于数据波动较大、周期较长的问题,预测精度仍然有限。
GM(1,n)模型仍然假设因素之间无显著关联,不适用于存在复杂关系的问题。
预测结果受初始值和参数设置的影响,敏感性较大。可能需要对参数进行合理的调整和校准,以提高预测精度。
本篇文章摘录自 数模百科 —— GM(1,n)模型
数模百科是一个由一群数模爱好者搭建的数学建模知识平台。我们想让大家只通过一个网站,就能解决自己在数学建模上的难题,把搜索和筛选的时间节省下来,投入到真正的学习当中。
我们团队目前正在努力为大家创建最好的信息集合,从用最简单易懂的话语和生动形象的例子帮助大家理解模型,到用科学严谨的语言讲解模型原理,再到提供参考代码。我们努力为数学建模的学习者和参赛者提供一站式学习平台,目前网站已上线,期待大家的反馈。
如果你想和我们的团队成员进行更深入的学习和交流,你可以通过公众号数模百科找到我们,我们会在这里发布更多资讯,也欢迎你来找我们唠嗑。