算法介绍及实现——GM(1,1)预测模型(附完整Python代码)

2023-12-09 14:50

本文主要是介绍算法介绍及实现——GM(1,1)预测模型(附完整Python代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


目录

一、模型介绍

二、模型建立

三、模型实现及应用


 

一、模型介绍

        上世纪80年代,我国杰出学者提出了著名的数学模型—灰色系统模型,30年来,灰色系统理论已经广泛的运用于经济、气象、环境、地理等众多领域,解决了生产生活和科学研究中很多亟待解决的问题,且均取得了不错的效果。灰色系统之所以能应用如此广泛,是因为灰色系统对数据的要求不高,它不需要完整清晰的数据集,仍然能对数据进行建模分析。灰色系统理论是把一切变量看成灰色量进行处理。基于这样的理论原理,揭示了数据中相对复杂、离散的内在规律,使得时序数据的规律性加强而降低其随机性。经过30多年的发展,灰色系统理论在的实践应用中不断的丰富和完善,现在的关于灰色系统理论研究主要是包括灰色系统建模理论和灰色预测方法在内的六大领域。

        灰色系统理论是一个比较庞大的体系,在数据分析有很多的广泛使用,包括灰色关联分析、GM(1,1)、GM(2,1)、GM(1,n)以及各种改进的灰色模型算法。今天主要介绍GM(1,1)这个最简单的模型。

(参考博文)优质博文推荐:灰色系统理论及其应用 (一) :灰色系统概论、关联分析、与传统统计方法的比较_wamg潇潇的博客-CSDN博客_灰色系统理论及其应用

二、模型建立

        所谓GM(1,1)就是一阶微分方程和一个变量。建模过程如下:

 

 

三、模型实现及应用

用 前7年考研人数作为实验实验数据,使用GM(1,1)进行建模预测。模拟成果如下:

 对后两年考研人数进行预测:分别约为531w和622w。

 完整代码:

import numpy as np
import matplotlib.pyplot as pltclass GM_1_1:"""使用方法:1、首先对类进行实例化:GM_model = GM_1_1()   # 不传入参数2、使用GM下的set_model传入一个一维的list类型数据: GM_model.set_model(list1)3、想预测后N个数据:GM_model.predict(N)想获得模型某个参数或实验数据拟合值,直接访问,如:GM_model.modeling_result_arr、GM_model.argu_a...等想输出模型的精度评定结果:GM_model.precision_evaluation()"""def __init__(self):self.test_data = np.array(())   # 实验数据集self.add_data = np.array(())    # 一次累加产生数据self.argu_a = 0     # 参数aself.argu_b = 0     # 参数bself.MAT_B = np.array(())   # 矩阵Bself.MAT_Y = np.array(())   # 矩阵Yself.modeling_result_arr = np.array(())     # 对实验数据的拟合值self.P = 0      # 小误差概率self.C = 0      # 后验方差比值def set_model(self, arr:list):self.__acq_data(arr)self.__compute()self.__modeling_result()def __acq_data(self, arr:list):     # 构建并计算矩阵B和矩阵Yself.test_data = np.array(arr).flatten()add_data = list()sum = 0for i in range(len(self.test_data)):sum = sum + self.test_data[i]add_data.append(sum)self.add_data = np.array(add_data)ser = list()for i in range(len(self.add_data) - 1):temp = (-1) * ((1 / 2) * self.add_data[i] + (1 / 2) * self.add_data[i + 1])ser.append(temp)B = np.vstack((np.array(ser).flatten(), np.ones(len(ser), ).flatten()))self.MAT_B = np.array(B).TY = np.array(self.test_data[1:])self.MAT_Y = np.reshape(Y, (len(Y), 1))def __compute(self):        # 计算灰参数 a,btemp_1 = np.dot(self.MAT_B.T, self.MAT_B)temp_2 = np.matrix(temp_1).Itemp_3 = np.dot(np.array(temp_2), self.MAT_B.T)vec = np.dot(temp_3, self.MAT_Y)self.argu_a = vec.flatten()[0]self.argu_b = vec.flatten()[1]def __predict(self, k:int) -> float:    # 定义预测计算函数part_1 = 1 - pow(np.e, self.argu_a)part_2 = self.test_data[0] - self.argu_b / self.argu_apart_3 = pow(np.e, (-1) * self.argu_a * k)return part_1 * part_2 * part_3def __modeling_result(self):    # 获得对实验数据的拟合值ls = [self.__predict(i+1) for i in range(len(self.test_data)-1)]ls.insert(0,self.test_data[0])self.modeling_result_arr = np.array(ls)def predict(self,number:int) -> list:   # 外部预测接口,预测后指定个数的数据prediction = [self.__predict(i+len(self.test_data)) for i in range(number)]return predictiondef precision_evaluation(self):         # 模型精度评定函数error = [self.test_data[i] - self.modeling_result_arr[i]for i in range(len(self.test_data))]aver_error = sum(error)/len(error)aver_test_data = np.sum(self.test_data)/len(self.test_data)temp1 = 0temp2 = 0for i in range(len(error)):temp1 = temp1 + pow(self.test_data[i]-aver_test_data,2)temp2 = temp2 + pow(error[i]-aver_error,2)square_S_1 = temp1/len(self.test_data)square_S_2 = temp2/len(error)self.C = np.sqrt(square_S_2)/np.sqrt(square_S_1)ls = [ifor i in range(len(error))if np.abs(error[i]-aver_error) < (0.6745*np.sqrt(square_S_1))]self.P = len(ls)/len(error)print("精度指标P,C值为:",self.P,self.C)def plot(self):     # 绘制实验数据拟合情况(粗糙绘制,可根据需求自定义更改)plt.figure()plt.plot(self.test_data,marker='*',c='b',label='row value')plt.plot(self.modeling_result_arr,marker='^',c='r',label='fit value')plt.legend()plt.grid()return pltif __name__ == "__main__":GM = GM_1_1()# 前7年的每年考研报名人数x = [177, 201, 238, 290, 341, 377, 457]GM.set_model(x)print("模型拟合数据为:",GM.modeling_result_arr)GM.precision_evaluation()print("后两个模型预测值为:",GM.predict(2))p = GM.plot()p.show()

浅薄之见,敬请指正!

共勉!


这篇关于算法介绍及实现——GM(1,1)预测模型(附完整Python代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码