数模百科】一篇文章讲清楚灰色预测模型GM(1,n)附python代码

本篇文章摘录自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)被广泛应用于对多元变量的预测。这个模型通过灰色关联度来度量因素之间的影响关系。

给定一个多元时间序列数据集

X^{(0)}=\{x_1^{(0)}, x_2^{(0)}, ..., x_n^{(0)}\},

其中,x_k^{(0)}为第 k 个变量向量, k=1,2, ..., n。我们先生成累加序列

X^{(1)}=\{x_1^{(1)}, x_2^{(1)}, ..., x_n^{(1)}\},

其中,

x_i^{(1)}(t) = \sum_{j=1}^{t}x_i^{(0)}(j), \quad i=1,2,...,n.

模型的微分方程为

\frac{dx_1^{(1)}}{dt}+a_2x_2^{(1)}+...+a_{n}x_{n}^{(1)}=u.

通过最小二乘法求解模型参数。

然后,求解得到的微分方程,生成预测序列

\hat X^{(1)}=\{\hat x_1^{(1)}(t), \hat x_2^{(1)}(t), ..., \hat x_n^{(1)}(t)\}

预测序列 \hat X^{(1)} 可以由以下公式得到:

\hat x_i^{(1)}(t) = (\frac{u}{a} + x_i^{(0)}(1) - \frac{u}{a}e^{at}),\quad t = 2, 3, ..., m

最后,通过将累加生成序列反演,即求差分,得到原始预测序列

\hat X^{(0)}=\{\hat x_1^{(0)}(t), \hat x_2^{(0)}(t), ..., \hat x_n^{(0)}(t)\}, \ t=2, 3, ..., m.

对于这种多变量的情况来说,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),并对预测结果进行了可视化,具体步骤如下:

  1. 根据初始数据,包括原始数据序列和相关序列,生成AGO(累加生成)序列。

  2. 对AGO序列进行紧邻均值生成计算,形成均值矩阵Z。

  3. 对相应的AGO序列和均值矩阵Z构建估值矩阵B和实际值向量Y。

  4. 利用最小二乘法求解参数向量theat,其中包含发展系数和驱动序列。

  5. 根据获得的参数计算预测序列,包括首先构造驱动值,然后基于这些驱动值和参数构造预测模型。

  6. 将预测序列通过累减还原操作转化为预测数据。

  7. 利用matplotlib库对原始数据和预测数据进行可视化展示,以便直观比较预测结果和实际情况。

通过这个程序,我们可以基于一组数据及其相关因素进行预测,然后用预测结果来进行未来趋势的判断或者进行决策。

优缺点

优点:

  1. 灰色预测模型GM(1,n)相对于GM(0,1)模型更能适应多因素问题,对复杂数据的预测和分析更为准确。

  2. 模型参数较少,计算复杂度低,易于理解和实施。

缺点:

  1. 对于数据波动较大、周期较长的问题,预测精度仍然有限。

  2. GM(1,n)模型仍然假设因素之间无显著关联,不适用于存在复杂关系的问题。

  3. 预测结果受初始值和参数设置的影响,敏感性较大。可能需要对参数进行合理的调整和校准,以提高预测精度。

本篇文章摘录自 数模百科 —— GM(1,n)模型

GM(1,n) - 数模百科

数模百科是一个由一群数模爱好者搭建的数学建模知识平台。我们想让大家只通过一个网站,就能解决自己在数学建模上的难题,把搜索和筛选的时间节省下来,投入到真正的学习当中。

我们团队目前正在努力为大家创建最好的信息集合,从用最简单易懂的话语和生动形象的例子帮助大家理解模型,到用科学严谨的语言讲解模型原理,再到提供参考代码。我们努力为数学建模的学习者和参赛者提供一站式学习平台,目前网站已上线,期待大家的反馈。

如果你想和我们的团队成员进行更深入的学习和交流,你可以通过公众号数模百科找到我们,我们会在这里发布更多资讯,也欢迎你来找我们唠嗑。

你可能感兴趣的:(python,开发语言,数学建模,算法,机器学习)