【数模百科】一文讲清楚灰色预测模型GM(2,1)的原理(附python代码)

本文主要是介绍【数模百科】一文讲清楚灰色预测模型GM(2,1)的原理(附python代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇文章摘录自GM(2,1) - 数模百科,如果想了解更多有关灰色预测模型的信息,请移步灰色预测模型 - 数模百科

在学习GM(2,1)之前,强烈建议阅读这篇文章,这里包含了数据分析与检验,和灰色预测模型的基础知识

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

你已经了解了GM(1,1)模型,它是用来处理和预测只有一个因素(变量)随时间变化情况的模型,而且它是基于一阶微分方程的。这个模型假设数据之间的增长率是恒定的,但是在实际情况中,很多时候数据的增长率并不是一成不变的。

这时候,灰色模型中的GM(2,1)就派上用场了,GM(2,1)模型仍然是针对单一变量的,只不过它使用的是二阶微分方程。那个“2”表示的是模型预测时考虑了数据变化率的变化率,也就是数据增长速度的速度。这样就能让模型更加精细地捕捉数据随时间变化的趋势,尤其是当数据变化不是那么规则,或者有点起起伏伏时。

简单来说,如果你觉得GM(1,1)模型对某些数据的预测不够精确,或者数据的走势有较大的波动,你可能会想尝试用GM(2,1)模型,它通过考虑更复杂的变化趋势来提供可能更精确的预测结果。因此,GM(2,1)模型适用于那些数据变化比较复杂,一阶模型难以准确捕捉其变化趋势的情况。

定义与详解

以下是GM(2,1)模型的构建和求解过程。

  1. 原始数据序列

    首先,我们有一个原始数据序列,它是时间序列中的观察值

    x^{(0)}=\{x^{(0)}(1),x^{(0)}(2),\ldots,x^{(0)}(n)\},

    其中 x^{(0)}(t) 表示第 t 个时刻的观测值。

  2. 一次累加生成操作(I-AGO)序列 x^{(1)}

    通过对原始数据序列进行累加,我们得到一次累加序列,这有助于展现数据的增长趋势和结构:

    x^{(1)}(k) = \sum_{i=1}^{k} x^{(0)}(i), \quad k = 1, 2, ..., n .

    得到

    x^{(1)}=\{x^{(1)}(1),x^{(1)}(2),\ldots,x^{(1)}(n)\}.
  3. 生成一次累加逆生成操作(I-IAGO)序列 \alpha^{(1)}x^{(0)},是 I-AGO 序列的逆操作,它的目的是从累加序列中重构原始数据序列。基本上,逆生成操作是对累加序列 x^{(1)} 进行差分,以恢复原始的数据值。

    \alpha^{(1)}x^{(0)}=(\alpha^{(1)}x^{(0)}(2),\dots,\alpha^{(1)}x^{(0)}(n)).

    其中,

    \alpha^{(1)}x^{(0)}(k)=x^{(0)}(k)-x^{(0)}(k-1),k=2,3,\dots,n
  4. 生成 x^{(1)}的紧邻均值生成序列 z^{(1)},紧邻均值生成序列 z^{(1)} 是通过计算 x^{(1)} 序列中相邻两个数的平均值得到的,它的目的是用来构建模型方程:

    z^{(1)}=(z^{(1)}(2),z^{(1)}(3),\dots,z^{(1)}(n)).
  5. 建立GM(2,1)模型

    \alpha^{(1)}x^{(0)}(k)+a_1x^{(0)}(k)+a_2z^{(1)}(k)=b.

    这个方程中的 a_1, a_2​, 和 b 是我们需要通过数据来估计的参数。

  6. 建立微分方程模型:基于一次累加序列,我们构建一个包含未知参数的二阶微分方程,即GM(2,1)的白化方程。

    \frac{d^2 x^{(1)}}{dt^2} + a_1 \frac{dx^{(1)}}{dt} + a_2 x^{(1)} = b .

    其中, a_1a_2 ,和 b 是模型参数,需要通过数据拟合来确定。

  7. 求解模型参数:为了估计模型参数,我们构建矩阵 B 和向量 Y :

    B = \begin{bmatrix} -x^{(0)}(2) & -z^{(1)}(2) & 1 \\\ -x^{(0)}(3) & -z^{(1)}(3) & 1 \\\ \vdots & \vdots & \vdots \\\ -x^{(0)}(n) & -z^{(1)}(n) & 1 \end{bmatrix}, \quad Y = \begin{bmatrix} \alpha^{(1)} x^{(0)}(2) \\\ \alpha^{(1)} x^{(0)}(3) \\\ \vdots \\\ \alpha^{(1)} x^{(0)}(n) \end{bmatrix} .

    参数通过最小二乘估计得到:

    \hat{a} = (B^T B)^{-1} B^T Y .
  8. 模型预测:有了模型参数后,我们可以通过解上述微分方程,使用这些参数对未来的数据点进行预测。

  9. 还原预测结果:将预测的累加序列 x^{(1)} 通过逆累加生成操作转换回原始数据序列 x^{(0)} ,得到预测的原始数据值,以便于与实际观察值进行比较。

    \hat{x}^{(0)}(k) = \hat{x}^{(1)}(k) - \hat{x}^{(1)}(k-1), \quad k=2,3,\dots,n .

这个过程的核心是通过累加操作平滑数据,建立和求解微分方程来预测数据的趋势。GM(2,1)模型特别适合预测少量数据和具有一定发展趋势的时间序列。

代码

import numpy as np
from sympy import symbols, Function, Eq, diff, dsolve
from numpy.linalg import lstsqt = symbols('t')  # 定义符号变量 t
x = Function('x')(t)  # 定义函数 x(t)# 数据初始化
x0 = np.array([41,49,61,78,96,104]) # 输入原始序列
n = len(x0)  # 原始序列元素个数
x1 = np.cumsum(x0)  # 原始序列的累积和
a_x0 = np.diff(x0)  # 对原始序列进行一阶差分
a_x0 = np.concatenate([[0], a_x0])  # 在差分结果前面补0,保持序列长度一致z = np.zeros(n)  # 初始化z序列
for i in range(1, n):  # 对每一个元素:z[i] = 0.5 * (x1[i] + x1[i - 1])  # 计算相邻元素的平均值# 构建数组 B 和 Y,用于之后的方程求解
B = np.column_stack((-x0[1:], -z[1:], np.ones(n - 1)))  # 构建 B,其中包含负的 x0 序列元素(从第二个元素开始)、负的 z 序列元素(从第二个元素开始)以及单位列向量
Y = a_x0[1:]  # 构建 Y,由一阶差分序列 a_x0 (从第二个元素开始)# 求解方程,获得参数 u
u, _, _, _ = lstsq(B, Y, rcond=None)  # 运用 Numpy 的最小二乘法 lstsq 求解线性方程得到 u# 定义微分方程
a1, a2, b, = u[0], u[1], u[2]  # 从参数 u 提取所需参数 a1,a2 和 b
diff_eq = Eq(diff(x, t, t) + a1 * diff(x, t) + a2 * x, b)  # 定义微分方程# 设定初始条件
ics = {x.subs(t, 0): x1[0], x.subs(t, 5): x1[-1]}  # 设定初始条件为 x(0) = x1[0],x(5) = x1[5] (注意这里索引是以 0 开始的)# 解微分方程
solution = dsolve(diff_eq, ics=ics)  # 解微分方程# 运用求解出的微分方程进行预测
yuce = [solution.rhs.subs(t, val).evalf() for val in range(n)]  # 对给出的数据序列进行预测
x0_hat = [yuce[0]] + np.diff(yuce).tolist()  # 对预测结果的序列计算一阶差分# 计算预测误差和相对误差
epsilon = x0 - x0_hat  # 计算预测值和实际值之间的差,即预测误差
delta = np.abs(epsilon / x0)  # 计算绝对比例误差,也就是相对误差

这个代码提供了一个基于 GM(2,1) 模型对时间序列数据进行预测的完整工作流程,包含了建模、求解、预测和可视化的各个步骤:

以上仅为模型的参考代码,如果你在实践过程中预测的值相比于原始数据变化幅度过大,说明原始数据可能并不适合该模型。

在实践中,GM(2,1) 模型通常要求数据具有指数趋势,并且估计的参数必须能够合理地反映数据的动态变化。

优缺点

优点:

  1. 灰色预测模型GM(2,1)具有较高的预测精度和稳定性,能够对非线性、不确定性较强的问题进行较好的预测。

  2. 灰色预测模型不需要大量数据的支持,对数据的要求较低,适用于数据量较小、不完整或缺乏特定背景知识的情况。

缺点:

  1. 灰色预测模型的精确度受到数据质量和特征选择的影响,对于噪声或缺失值较多的数据,预测效果可能较差。

  2. 灰色预测模型通常只能进行短期或中期的预测,对于长期预测可能不太准确。

  3. 灰色预测模型依赖于历史数据,对于预测对象的外部影响因素变化较大或不稳定的情况,预测结果可能不准确。

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

GM(2,1) - 数模百科

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

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

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

这篇关于【数模百科】一文讲清楚灰色预测模型GM(2,1)的原理(附python代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618124

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss