数学建模-灰色预测最强讲义 GM(1,1)原理及Python实现

目录

一、GM(1,1)模型预测原理

二、GM(1,1)模型预测步骤

2.1 数据的检验与处理

2.2 建立模型

2.3 检验预测值

三、案例 


灰色预测应用场景:时间序列预测

灰色预测的主要特点是模型使用的不是原始数据序列,而是生成的数据序列。其核心体系是灰色模型,即对原始数据做累加生成得到近似的指数规律再进行建模的方法。

优点是不需要很多的数据,一般只需要4个数据就可以,能解决历史数据少、序列的完整性及可靠性低的问题;能利用微分方程来充分挖掘系统的本质,精度高;能将无规律的原始数据进行生成得到规律性较强的生成序列,运算简便,易于检验,具有不考虑分布规律,不考虑变化趋势。

缺点是只适用于中短期的预测,只适合指数增长的预测。

一、GM11)模型预测原理

二、GM11)模型预测步骤

2.1 数据的检验与处理

2.2 建立模型

2.3 检验预测值

三、案例 

由北方某城市1986-1992年道路交通噪声平均值声级数据如表,进行未来10年的预测。

解:

级比检验

首先导入数据,做级比检验

import pandas as pd
import numpy as np
data = pd.read_excel(r"C:\Users\Terry\Desktop\城市交通噪声数据.xlsx")
x_0 = np.array(data["噪声分贝"].to_list()) # [1,2,3] ndarray
x_0
# 级比检验
def level_ratio_test(x):# 可容覆盖范围n = len(x)cover_range = [np.exp(-2/(n+1)), np.exp(2/(n+1))]# 计算x[i]/x[i+1]的值,即计算级比lambda_x = x[:-1] / x[1:]for i in lambda_x:if i < cover_range[0] or i > cover_range[1]:print("不通过级比检验,无法使用GM(1,1)")breakreturnprint("通过级比检验,可以使用GM(1,1)")level_ratio_test(x_0)

注:这里直接写了一个函数,计算量可容覆盖范围,循环判断是每个数的级比是否满足要求,如果不满足,跳出循环,并输出无法使用GM(1,1),如果循环结束,仍然没有输出无法使用,则标明所有级比均通过检验可以输出“通过级比检验,可以使用GM(1,1)”

建模及预测

# 1.计算一次累加生成序列z_1
x_1 = x_0.cumsum()# 2.计算均值生成序列z_1
z_1 = (x_1[:-1] + x_1[1:]) / 2.0# 3.计算B矩阵
B = np.vstack([-z_1, np.ones(len(x_0)-1)]).T# 4.计算Y矩阵
Y = x_0[1:].reshape((-1, 1))# 5.计算a,b
# a为发展系数 b为灰色作用量
[[a], [b]] = np.linalg.inv(B.T @ B) @ B.T @ Y  # 计算参数# 6.原始年份的预测值
x_1_predict = []
n = len(x_0)
for k in range(n): # 如果预测k个未来年份 这里就n+k 假设预测未来5年就n+5x_1_predict.append((x_0[0]-b/a)*np.exp(-a*k) + b/a) # 7.还原数据
x_0_predict = np.hstack([x_0[0],np.diff(x_1_predict)])

结果检验

import pandas as pd
result = pd.DataFrame({"原始数据":x_0,"预测数据":x_0_predict})
# 残差:真实值 - 预测值
result["残差"] = result["原始数据"] - result["预测数据"]
# 相对误差
result["相对误差"] = (abs(result["原始数据"] - result["预测数据"]) /  result["原始数据"]).map('{:.2%}'.format)
# 级比偏差
lambda_x = x_0[:-1] / x_0[1:]
result["级比偏差值"] = np.append(np.nan, abs(1-(1-0.5*a)/(1+0.5*a)*lambda_x))
result

相对误差、级别偏差均小于0.1,达到较高要求。

结果描述及未来预测

通过绘制折线图来看真实值和预测值的比较

result = result.set_index(data.年份)
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#  输出高清图像
%config InlineBackend.figure_format = 'retina'
%matplotlib inline#设定 seaborn 风格
sns.set()
with plt.xkcd():#用 matplotlib 画出每个序列的折线plt.figure(figsize=(10,6)) plt.plot(result['原始数据'], label='Original data',marker='o',color='g')plt.plot(result['预测数据'], label='Predicted data',marker='X',color='r')# 设定图例和标题plt.legend()plt.title('Comparison of Original Data and Predicted Data')# 设置坐标轴范围plt.ylim(60, 85)# 显示图表plt.show()

# 假设预测10年
x_1_predict = []
for k in range(n+10): # 如果预测k个未来年份 这里就n+k 假设预测未来5年就n+5x_1_predict.append((x_0[0]-b/a)*np.exp(-a*k) + b/a) # 递推计算 第k+1个数 比如k=0的时候 就是第一个预测值 
x_1_predict
# 7.还原数据
x_0_predict = np.hstack([x_0[0],np.diff(x_1_predict)])
x_0_predictyear = data["年份"].tolist()
for i in range(10):year.append(year[-1]+1)
x_0_predict_more = pd.DataFrame({"未来预测":x_0_predict,"年份":year})
x_0_predict_more = x_0_predict_more.set_index("年份")
x_0_predict_more.iloc[0:n-1,:] = np.nanwith plt.xkcd():#用 matplotlib 画出每个序列的折线plt.figure(figsize=(10,6)) plt.plot(result['原始数据'], label='Original data',marker='o',color='g')plt.plot(result['预测数据'], label='Predicted data',marker='X',color='r')plt.plot(x_0_predict_more['未来预测'], label='Predicted Future data',marker='1',color='b',linestyle='--')# 设定图例和标题plt.legend()plt.title('Comparison of Original Data and Predicted Data')# 设置坐标轴范围plt.ylim(60, 80)# 显示图表plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/461911.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12个最常用的matplotlib图例 !!

文章目录 1、折线图 2、散点图 3、直方图 4、柱状图 5、箱线图 6、热力图 7、饼图 8、面积图 9、等高线图 10、3D图 11、时间序列图 12、树状图 总结 1、折线图 折线图&#xff08;Line Plot&#xff09;&#xff1a;用于显示数据随时间或其他连续变量的变化趋势。在实际项目中…

算法------(11)并查集

例题&#xff1a; &#xff08;1&#xff09;Acwing 836.合并集合 并查集就是把每一个集合看成一棵树&#xff0c;记录每个节点的父节点。合并集合就是把一棵树变成另一棵树的子树&#xff0c;即把一棵树的父节点变为另一棵树的父节点的儿子。查询是否在同一集合就是看他们的根…

【Spring源码解读!底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

【leetcode热题100】分隔链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&am…

Maven 安装教程

一、安装地址 1.官网安装最新版本 2.其他版本&#xff0c;我这里是maven-3/3.6.2 二、配置环境 1. 点击此电脑鼠标右击->属性->高级系统设置->环境变量 &#xff0c;配置系统变量->新建&#xff1a;MAVEN_HOME 2.配置path 路径 &#xff1a;%MAVEN_HOME%\bin 三、安…

SpringMVC速成(一)

文章目录 SpringMVC速成&#xff08;一&#xff09;1.SpringMVC概述2.SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行…

【算法】一文带你快速入门动态规划算法以及动规中的空间优化

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;如果给算法的难度和复杂度排一个排名&#xff0c;那么动态规划算法一定名列前茅。在最开始没有什么整体的方法的时候&#xff0c;我也曾经被动态…

MySQL 图书管理系统

1.需求分析 1.1项目需求分析简介 1.1.1信息需求分析 (1) 图书信息&#xff1a;包括书籍编号&#xff0c;书籍名称&#xff0c;出版社&#xff0c;作者&#xff0c;库存量&#xff0c;出版日期&#xff0c;价格&#xff0c;库存&#xff0c;剩余量&#xff0c;类别等&#xf…

上下固定中间自适应布局

实现上下固定中间自适应布局 1.通过position&#xff1a;absolute实现 定义如下结构 <body> <div class"container"> <div class"top"></div> <div class"center"></div> <div class"bottom&…

清平乐-春风丽日

今天&#xff0c;是2024年农历除夕日&#xff0c;远方家人已于昨夜风尘扑扑地倦鸟归巢&#xff0c;团聚过龙年&#xff0c;今晨酣睡未起。老龄笔者心情极佳&#xff0c;一夜好梦醒来&#xff0c;推窗仰头展望苍穹&#xff0c;喜上心头&#xff1a;啊&#xff01;接连几天的小雨…

小区创业项目推荐:小投资大回报的店铺类型

作为一位拥有5年鲜奶吧创业经验的自媒体博主&#xff0c;我深知在小区内寻找一个既小投资又能带来大回报的创业项目是多么重要。今天&#xff0c;我要为大家推荐的&#xff0c;正是这样一个项目——鲜奶吧。 一、鲜奶吧&#xff1a;小区内的健康食品新宠 随着健康饮食观念的深…

STL之list容器的介绍与模拟实现+适配器

STL之list容器的介绍与模拟实现适配器 1. list的介绍2. list容器的使用2.1 list的定义2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 3. list的模拟实现3.1 架构搭建3.2 迭代器3.2.1 正向迭代器3.2.2反向迭代器适配…