【python】灰色预测 GM(1,1) 模型

文章目录

  • 前言
  • python代码


前言

用 python 复刻上一篇博客的 Matlab 代码。

【学习笔记】灰色预测 GM(1,1) 模型 —— Matlab

python代码

# %%
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']   #设置字体
mpl.rcParams['axes.unicode_minus'] = False     # - 号设置

year =np.array([1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004]).T  # 横坐标表示年份
x0 = np.array([174,179,183,189,207,234,220.5,256,270,285]).T # 原始数据序列

# 创建第一个图形
plt.figure(1)
n = x0.shape[0]
x1 = np.cumsum(x0)
plt.plot(year,x0,'o-')
plt.plot(year,x1,'r-')
plt.legend('x(0)','x(1)')
plt.grid(True)
plt.xlabel('年份')  
plt.ylabel('排污总量')

# %%
# 级比检验
rho = np.zeros((n,))
# 计算 rho
for i in range(1, n):
    rho[i] = x0[i] / x1[i-1]

# 创建图表
plt.figure(2)
plt.plot(year[1:], rho[1:], 'o-', label='rho')
plt.plot([year[1], year[-1]], [0.5, 0.5], '-', label='临界线')
plt.grid(True)

# 在指定坐标添加文本
plt.text(year[-2] + 0.2, 0.55, '临界线')

# 设置x轴刻度
plt.xticks(year[1:])

# 添加标签
plt.xlabel('年份')
plt.ylabel('原始数据的光滑度')

# 显示图表
plt.legend()
plt.show()

# %%
# 指标1:光滑比小于0.5的数据占比
num1 = np.sum(rho<0.5)/(n-1)
# 指标2:除去前两个时期外,光滑比小于0.5的数据占比
num2 = np.sum(rho[2:]<0.5)/(n-3)

print("指标一:",num1*100,"%")
print("指标二:",num2*100,"%")

# %%
def gm11(x0, predict_num):
    n = x0.shape[0]
    x1 = np.cumsum(x0)
    z1 = 0.5 * x1[1:n] + 0.5 * x1[0:n-1]
    y = x0[1:]
    x = z1
    # 最小二乘法求解
    k = ((n-1)*np.sum(x*y)-np.sum(x)*np.sum(y))/((n-1)*np.sum(x*x)-np.sum(x)*np.sum(x))
    b = (np.sum(x*x)*np.sum(y)-np.sum(x)*np.sum(x*y))/((n-1)*np.sum(x*x)-np.sum(x)*np.sum(x))
    a = -k
    u = b
    x0_hat = np.zeros((n,))
    x0_hat[0] = x0[0]
    for m in range(n-1):
        x0_hat[m+1] = (1-np.exp(a))*(x0[0]-u/a)*np.exp(-a*(m+1))
    result = np.zeros((predict_num,))
    for i in range(predict_num):
        result[i] = (1-np.exp(a))*(x0[0]-u/a)*np.exp(-a*(n+i))

    # 计算绝对残差和相对残差
    absolute_residuals = x0[1:] - x0_hat[1:]   # 从第二项开始计算绝对残差,因为第一项是相同的
    relative_residuals = np.abs(absolute_residuals) / x0[1:]  # 计算相对残差
    # 计算级比和级比偏差
    class_ratio = x0[1:] / x0[0:n-1]
    eta = np.abs(1-(1-0.5*a)/(1+0.5*a)*(1./class_ratio)) # 计算级比偏差
    return result, x0_hat, relative_residuals, eta


# %%
if num1 > 0.6 and num2 > 0.9:
    if n > 7:    # 将数据分为训练组和试验组(根据原数据量大小n来取,n小于7则取最后两年为试验组,n大于7则取最后三年为试验组)
        test_num = 3
    else:
        test_num = 2
    train_x0 = x0[0:n-test_num]   # 训练数据
    print('训练数据是: ',train_x0)

    test_x0 =  x0[n-test_num:]  # 试验数据
    print('试验数据是: ',test_x0)
    
    # 使用GM(1,1)模型对训练数据进行训练,返回的result就是往后预测test_num期的数据
    print('GM(1,1)模型预测')
    result1,_,_,_ = gm11(train_x0, test_num) # 使用传统的GM(1,1)模型对训练数据,并预测后test_num期的结果
    # 绘制对试验数据进行预测的图形
    test_year = year[n-test_num:]  # 试验组对应的年份
    plt.figure(3)
    plt.plot(test_year,test_x0,'o-',label='试验组的真实数据')
    plt.plot(test_year,result1,'*-',label='预测值')
    plt.grid(True) 
    # 设置x轴刻度
    plt.xticks(year[n-test_num:])
    plt.legend() 
    plt.xlabel('年份')
    plt.ylabel('排污总量')
 
    predict_num = int(input('请输入你要往后面预测的期数:'))
    # 计算使用传统GM模型的结果
    result, x0_hat, relative_residuals, eta = gm11(x0, predict_num)
    
    ## 绘制相对残差和级比偏差的图形
    plt.figure(4)
    # 创建一个2行1列的子图布局
    plt.subplot(2, 1, 1)  # 第1个子图
    plt.plot(year[1:], relative_residuals,'*-',label='相对残差')
    plt.xticks(year[1:])
    plt.legend()
    plt.grid(True) 

    plt.subplot(2, 1, 2)  # 第2个子图
    plt.plot(year[1:], eta,'*-',label='级比偏差')
    plt.xticks(year[1:])
    plt.legend()
    plt.grid(True) 
    plt.xlabel('年份')
    
    ## 残差检验
    average_relative_residuals = np.mean(relative_residuals)  # 计算平均相对残差 mean函数用来均值
    print('平均相对残差为',average_relative_residuals)
    
    ## 级比偏差检验
    average_eta = np.mean(eta)  # 计算平均级比偏差
    print('平均级比偏差为',average_eta)
    
    ## 绘制最终的预测效果图
    plt.figure(5)
    plt.plot(year, x0, '-o', label='原始数据')
    plt.plot(year, x0_hat, '-*m', label='拟合数据')

    year_predict = np.arange(year[n-1], year[n-1] + predict_num + 1)
    res = np.append(x0[n-1],result)
    plt.plot(year_predict, res, '-*k', label='预测数据' )
    plt.grid(True) 

    plt.legend()  
    plt.xticks(year[1:] + predict_num)
    plt.xlabel('年份')
    plt.ylabel('排污总量')

运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

江协科技STM32学习- P4 新建工程

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

模拟笔试 - 卡码网周赛第三十一期(23年百度笔试真题)

难度适中&#xff0c;动态规划出现的比例还是比较高的&#xff0c;要好好掌握&#xff0c;二分查找的点也是比较灵活的。&#xff08;A卷和B卷第一道题是一样的&#xff09; 题目一&#xff1a;讨厌鬼的组合帖子 思路&#xff1a;这个题算是一个还不错的题&#xff1b; 本质就…

C语言每日好题(3)

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 #define _CRT_SECURE_NO_WARNING #include <stdio.h> #include <string.h> int main(void) {if ((strlen("abc") - strlen("abcdef")) > 0)printf(">\n")…

【图文并茂】ant design pro 如何优雅地把删除和批量删除功能合并到一起,并抽出来成为组件

如上图所示&#xff0c;其实批量删除和删除应该算是一个功能 只是删除一个或多个的区别 那么接口应该用的同一个 删除一个的时候呢&#xff0c;就传 一个对象_id 过去 删除多个的时候&#xff0c;就传 多个 对象 _id 的数组过去 后端 const deleteMultipleRoles handleAs…

软件测试-测试分类

测试分类 按照测试目标测试 界面测试 页面内展示的所有内容/元素都需要测试 参考UI图找不同 功能测试 ​ 如何设计功能测试用例&#xff1f; 参考产品规格说明书进行用例的编写&#xff0c;具体的测试用例需要使用黑盒设计测 试用例的方法&#xff0c;如等价类、边界值、…

嵌入式学习——(Linux高级编程——线程控制)

线程的互斥 一、互斥的重要性 在多线程编程中&#xff0c;互斥机制至关重要。当多个线程同时访问临界资源时&#xff0c;如果没有有效的互斥控制&#xff0c;可能会导致数据不一致、资源竞争等问题。通过互斥锁&#xff0c;可以确保在任何时刻只有一个线程能够访问临界资源&am…

PHPShort轻量级网址缩短程序源码开心版,内含汉化包

需要网址缩短并且想获得更多有关链接点击率和流量的数据分析&#xff0c;那么 PHPShort 可能是一个非常好的选择。PHPShort 是一款高级的 URL 缩短器平台&#xff0c;可以帮助你轻松地缩短链接&#xff0c;并根据受众群体的位置或平台来定位受众。 该程序基于 Laravel 框架编写…

python构建一个web程序

from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return 欢迎来到我的Python Web程序!if __name__ __main__:app.run(debugTrue)1、安装flask D:\Users\USER\PycharmProjects\pythonProject1\p01>pip install flask WARNING: Ignoring invalid…

多线程中常见问题

1、为什么不建议使用Executors来创建线程池&#xff1f; 除开有可能造成的OOM外&#xff0c;使用Executors来创建线程池也不能自定义线程的名字&#xff0c;不利于排查问题&#xff0c;所以建议是直接使用ThreadPoolExecutor来定义线程池&#xff0c;这样可以灵活控制 2、线程…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书&#xff0c;有时在项目中需要使用免费的 SSL 证书&#xff0c;Aliyun 提供免费证书&#xff0c;三个月有效期&#xff0c;可以直接在aliyun 申请&#xff0c;搜索 SSL 证书&#xff0c;选择测试证书。 Aliyun 证书需要每三月来来换一次&#xff0c;页…

线程优先级调度

Windows优先级调度算法 系统维护了一个全局的处理器数组KiProcessorBlock&#xff0c;其中每个元素对应于一个处理器的KPRCB对象。其次&#xff0c;另有一个全局变量KiIdleSummary记录了哪些处理器当前是空闲的。所谓一个处理器是空闲的&#xff0c;是指该处理器正在执行空闲循…

根据状态的不同,显示不同的背景颜色

文章目录 前言HTML模板部分JavaScript部分注意&#xff1a;主要差异影响如何处理示例 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 实现效果&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 根据给定的状态…

内网安全:跨域攻击

目录 获取域信息 利用域信任密钥获取目标域 利用krbtgt哈希值获取目标域 内网中的域林&#xff1a; 很多大型企业都拥有自己的内网&#xff0c;一般通过域林进行共享资源。根据不同职能区分的部门&#xff0c;从逻辑上以 主域和子域进行区分&#xff0c;以方便统一管理。在…

基于x86 平台opencv的图像采集和seetaface6的图像质量评估功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的图像质量评估功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的图像质量评估模块…

大模型学习笔记 - LLM 之 attention 优化

LLM 注意力机制 LLM 注意力机制 1. 注意力机制类型概述2.Group Query Attention3.FlashAttention4. PageAttention 1. 注意力机制类型概述 注意力机制最早来源于Transformer&#xff0c;Transformer中的注意力机制分为2种 Encoder中的 全量注意力机制和 Decoder中的带mask的…

qt处理表格,Qtxlsx库文件的安装以及导入

qt想要处理excel表格的&#xff0c;这个过程中避免不了使用Qtxlsx这个库文件。这几天花了几天时间&#xff0c;终于本地调通了。记录一下。 关于Qtxlsx的使用&#xff0c;大致分为2中方法。 方法一&#xff1a;直接下载对应的xlsx文件&#xff0c;然后在.pro文件中 这种方法是…

《黑神话.悟空》:一场跨越神话与现实的深度探索

《黑神话.悟空》&#xff1a;一场跨越神话与现实的深度探索 在国产游戏日益崛起的今天&#xff0c;《黑神话.悟空》以其独特的剧情、丰富的人物设定和深刻的主题&#xff0c;成为了无数玩家翘首以盼的国产3A大作。这款游戏不仅是一次对传统故事的创新演绎&#xff0c;更是一场对…

《黑神话:悟空》游戏攻略:第一回合打法教程!

《黑神话&#xff1a;悟空》是一款以西游记为背景的动作角色扮演游戏&#xff0c;玩家在游戏中将面对各式各样的强大敌人和BOSS。在游戏的第一回合中&#xff0c;你将遇到牯护院、灵虚子、幽魂等多个BOSS。以下是详细的BOSS打法攻略&#xff0c;帮助你在战斗中游刃有余。你可以…

eNSP 华为三层交换机配置DHCP

华为三层交换机配置DHCP 华为DHCP原理&#xff1a;&#xff08;思科四个都是广播包&#xff09; 1、客户端广播发送DHCP Discover包。用于发现当前局域网中的DHCP服务器。 2、DHCP服务器单播发送DHCP Offer包给客户端。携带分配给客户端的IP地址。 3、客户端广播发送DHCP Resqe…

路径规划 | 灰狼算法+B样条曲线优化无人机三维路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 灰狼算法B样条曲线优化无人机三维路径规划&#xff08;Matlab&#xff09; 群智能路径规划算法。三维灰狼算法&#xff08;GWO&#xff09;加B样条曲线优化的matlab代码。无人机&#xff08;UAV&#xff09;路径规划…