算法介绍及实现——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

相关文章

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

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

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

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

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

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

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

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