关联度分析、灰色预测GM(1,1)、GM(1,1)残差模型——基于Python实现

关联度分析

import numpy as np
import pandas as pd
#关联度分析
#参考序列
Y_0=[170,174,197,216.4,235.8]
#被比较序列
Y_1=[195.4,189.9,187.2,205,222.7]
Y_2=[308,310,295,346,367]#初始化序列
X_0=np.array(Y_0)/Y_0[0]
X_1=np.array(Y_1)/Y_1[0]
X_2=np.array(Y_2)/Y_2[0]#计算绝对差序列
deta1=np.abs(X_0-X_1)
deta2=np.abs(X_0-X_2)#计算deta1,deta2最小值
min1=np.min([np.min(deta1),np.min(deta2)])
max1=np.max([np.max(deta1),np.max(deta2)])#计算关联系数yita
rio=0.5
yita1 = [(min1 + rio * max1) / (deta1[i] + rio * max1) for i in range(len(deta1))]#计算关联系数yita1
yita2 = [(min1 + rio * max1) / (deta2[i] + rio * max1) for i in range(len(deta2))]#计算关联系数yita2
# #计算关联度
r1=np.mean(yita1)
r2=np.mean(yita2)
# 创建DataFrame
df = pd.DataFrame({'yita1': yita1,'yita2': yita2
})
#更改索引
df.index = ['1','2','3','4','5']print('关联度分析:')
print(df)
#输出关联度
print('关联度:',r1,r2)
关联度分析:yita1     yita2
1  1.000000  1.000000
2  0.705293  0.878928
3  0.381163  0.380878
4  0.355909  0.452620
5  0.333333  0.387478
关联度: 0.5551396262321364 0.6199809489771715

灰色预测GM(1,1)模型

from math import exp
#原始序列
X_0=(6,20,40,25,45,35,21,14,18,15.5,17,15)
#累加生成序列
X_1 = np.cumsum(X_0)
#print('累加生成序列:', X_1)
#构造矩阵B和数据向量Y
B = np.zeros((len(X_1)-1,2))
Y = X_0[1:]
for i in range(len(X_1)-1):B[i][0] = -0.5*(X_1[i]+X_1[i+1])B[i][1] = 1#print('矩阵B:', B)
#print('数据向量Y:', Y)
#计算参数a,b
A = np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y)
a = A[0]
miu = A[1]
#计算预测模型
X_1_predict = np.zeros(len(X_0))
X_1_predict[0] = X_0[0]
for i in range(1, len(X_0)):X_1_predict[i] = ((X_0[0] - miu / a) * exp(-a * i) + miu / a)
#预测方程式
print('预测方程式:', 'X_1_(k+1) = ', X_0[0]- miu/ a, '*exp(-', a, '*i) +', miu/ a)
预测方程式: X_1_(k+1) =  -476.05668934240276 *exp(- 0.0746651965600655 *i) + 482.05668934240276

模型检验

#残差检验
X_1_predict = np.zeros(len(X_0))
X_1_predict[0] = X_0[0]
for i in range(1,len(X_0)):X_1_predict[i] = ((X_0[0]-miu/a)*exp(-a*i)+miu/a)print('预测值:', X_1_predict)
#累减生成序列X_0_predict
X_0_predict = np.zeros(len(X_0))
X_0_predict[0] = X_0[0]
for i in range(1,len(X_0)):X_0_predict[i] = X_1_predict[i] - X_1_predict[i-1]#累减生成序列
print('累减生成序列:', X_0_predict)
预测值: [  6.          40.25030314  72.03643912 101.53569452 128.91260092154.31985252 177.8991578  199.78202993 220.09052023 238.93789892256.42928694 272.66224218]
累减生成序列: [ 6.         34.25030314 31.78613597 29.4992554  27.3769064  25.407251623.57930529 21.88287213 20.30849029 18.8473787  17.49138802 16.23295524]
# X_0_predict
#计算绝对误差
error = np.abs(X_0_predict-X_0)
print('绝对误差:', error)
绝对误差: [ 0.         14.25030314  8.21386403  4.4992554  17.6230936   9.59274842.57930529  7.88287213  2.30849029  3.3473787   0.49138802  1.23295524]
#计算相对误差
error_rate = error/X_0
#输出相对误差,保留四位小数,输出百分比
print('相对误差:', np.round(error_rate,4)*100,'%')
相对误差: [ 0.   71.25 20.53 18.   39.16 27.41 12.28 56.31 12.82 21.6   2.89  8.22] %
#输出检验表,包括原始序列,预测序列,残差序列,绝对误差,相对误差
df = pd.DataFrame({'原始序列': X_0,'预测序列': X_1_predict,'残差序列': X_0_predict,'绝对误差': error,'相对误差': error_rate
})
df.index = ['1','2','3','4','5','6','7','8','9','10','11','12']
print('检验表:')
print(df)
检验表:原始序列        预测序列       残差序列       绝对误差      相对误差
1    6.0    6.000000   6.000000   0.000000  0.000000
2   20.0   40.250303  34.250303  14.250303  0.712515
3   40.0   72.036439  31.786136   8.213864  0.205347
4   25.0  101.535695  29.499255   4.499255  0.179970
5   45.0  128.912601  27.376906  17.623094  0.391624
6   35.0  154.319853  25.407252   9.592748  0.274079
7   21.0  177.899158  23.579305   2.579305  0.122824
8   14.0  199.782030  21.882872   7.882872  0.563062
9   18.0  220.090520  20.308490   2.308490  0.128249
10  15.5  238.937899  18.847379   3.347379  0.215960
11  17.0  256.429287  17.491388   0.491388  0.028905
12  15.0  272.662242  16.232955   1.232955  0.082197
相对误差大于于0.5%,模型检验不通过

GM(1,1)残差模型

#残差模型进行修正
#对erroe序列进行GM(1,1)模型预测
#原始序列
X_0 = error
#累加生成序列
X_1 = np.cumsum(X_0)
#构造矩阵B和数据向量Y
B = np.zeros((len(X_1)-1,2))
Y = X_0[1:]
for i in range(len(X_1)-1):B[i][0] = -0.5*(X_1[i]+X_1[i+1])B[i][1] = 1
#计算参数a,b
A = np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y)
a = A[0]
miu = A[1]
#计算预测模型
X_1_predict = np.zeros(len(X_0))
X_1_predict[0] = X_0[0]
for i in range(1, len(X_0)):X_1_predict[i] = ((X_0[0] - miu / a) * exp(-a * i) + miu / a)
# #预测方程式
print('预测方程式:', 'X_1_(k+1) = ', X_0[0]- miu/ a, '*exp(-', a, '*k) +', miu/ a)
预测方程式: X_1_(k+1) =  -47.4894117559714 *exp(- 0.21716818506240565 *k) + 47.4894117559714
#修正后的模型为原始模型加上求导后的方程式
# Differentiate the prediction equation with respect to k
X_1_predict_derivative = np.zeros(len(X_0))for i in range(1, len(X_0)):deta3= 1 if (i + 1) >= 2  else 0X_1_predict_derivative[i] = -a * (X_0[0] - miu / a) * exp(-a * (i-1)) * deta3# Corrected model by adding the differentiated equation to the original model
X_1_corrected = X_1_predict + X_1_predict_derivativeprint('修正后的模型:', X_1_corrected)
#输出修正后的模型方程式
print('修正后的模型方程式:', 'X_1_(k+1) = ', X_0[0]- miu/ a, '*exp(-', a, '*k) +', miu/ a, ' - ', -a*(X_0[0] - miu/a), 'deta(k-1)*exp(-',a, '*k) ')
#输出修正后的模型方程式,分开为k>=2,k<2
print('修正后的模型方程式:', 'X_1_(k+1) = ', X_0[0]- miu/ a, '*exp(-', a, '*k) +', miu/ a, ' - ', -a*(X_0[0] - miu/a), 'deta(k-1)*exp(-',a, '*(k-1)) ', 'k>=2')
print('修正后的模型方程式:', 'X_1_(k+1) = ', X_0[0]- miu/ a, '*exp(-', a, '*k) +', miu/ a, 'k<2')
修正后的模型: [ 0.         19.58337881 25.03078704 29.41483178 32.94308733 35.7826083638.06783956 39.90698129 41.38711264 42.57831436 43.53698707 44.3085217 ]
修正后的模型方程式: X_1_(k+1) =  -47.4894117559714 *exp(- 0.21716818506240565 *k) + 47.4894117559714  -  10.31318936072558 deta(k-1)*exp(- 0.21716818506240565 *k) 
修正后的模型方程式: X_1_(k+1) =  -47.4894117559714 *exp(- 0.21716818506240565 *k) + 47.4894117559714  -  10.31318936072558 deta(k-1)*exp(- 0.21716818506240565 *(k-1))  k>=2
修正后的模型方程式: X_1_(k+1) =  -47.4894117559714 *exp(- 0.21716818506240565 *k) + 47.4894117559714 k<2
#残差检验
X_1_corrected
#累减生成序列
X_0_corrected = np.zeros(len(X_1_corrected))
X_0_corrected[0] = X_1_corrected[0]
for i in range(1, len(X_1_corrected)):X_0_corrected[i] = X_1_corrected[i] - X_1_corrected[i-1]print('累减生成序列:', X_0_corrected)
累减生成序列: [ 0.         19.58337881  5.44740823  4.38404474  3.52825555  2.839521032.2852312   1.83914174  1.48013134  1.19120172  0.95867271  0.77153463]
# X_0_predict
#计算绝对误差
error = np.abs(X_0_corrected-X_0)
print('绝对误差:', error)
绝对误差: [0.         6.11131907 4.55574461 1.15568474 7.53661955 1.187444440.14100682 2.03499833 0.386519   0.73109566 1.00028958 0.07505627]
#计算相对误差
X_0=(6,20,40,25,45,35,21,14,18,15.5,17,15)
error_rate = error/X_0
#输出相对误差,保留四位小数,输出百分比
print('相对误差:', np.round(error_rate,4)*100,'%')
相对误差: [ 0.   30.56 11.39  4.62 16.75  3.39  0.67 14.54  2.15  4.72  5.88  0.5 ] %
#输出检验表,包括原始序列,预测序列,残差序列,绝对误差,相对误差
df = pd.DataFrame({'原始序列': X_0,'预测序列': X_1_corrected,'残差序列': X_0_corrected,'绝对误差': error,'相对误差': error_rate
})
df.index = ['1','2','3','4','5','6','7','8','9','10','11','12']
print('检验表:')
print(df)
检验表:原始序列       预测序列       残差序列      绝对误差      相对误差
1    6.0   0.000000   0.000000  0.000000  0.000000
2   20.0  19.583379  19.583379  6.111319  0.305566
3   40.0  25.030787   5.447408  4.555745  0.113894
4   25.0  29.414832   4.384045  1.155685  0.046227
5   45.0  32.943087   3.528256  7.536620  0.167480
6   35.0  35.782608   2.839521  1.187444  0.033927
7   21.0  38.067840   2.285231  0.141007  0.006715
8   14.0  39.906981   1.839142  2.034998  0.145357
9   18.0  41.387113   1.480131  0.386519  0.021473
10  15.5  42.578314   1.191202  0.731096  0.047167
11  17.0  43.536987   0.958673  1.000290  0.058841
12  15.0  44.308522   0.771535  0.075056  0.005004

修正后的模型检验通过,模型预测准确

预测

#预测13月份的数据
X_13_predict = ((X_0[0]-miu/a)*exp(-a*12)+miu/a)
print('13月份的预测值:', X_13_predict)

13月份的预测值: 76.46124387795606

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

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

相关文章

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素&#xff1a;机密性、完整性、可用性、可控性、审查性 信息安全范围&#xff1a;设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在&#xff1a;物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 &#xff08;一&#xff09;启用 TCP/IP 协议 操作入口 首先&#xff0c;我们要找到 SQL Server 配置管理器&#xff0c;操作路径为&#xff1a;通过 “此电脑” 右键选择 “管理”&#xff0c;在弹出的 “计算机管理” 窗口中&#xff0c;找到 “服务和应用程…

类和对象——static 成员,匿名对象(C++)

1.static成员 a&#xff09;⽤static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成员变量⼀定要在类外进行初始化。 b&#xff09;静态成员变量为所有类对象所共享&#xff0c;不属于某个具体的对象&#xff0c;不存在对象中&#xff0c;存放在静态区。 …

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …

【JavaEE初阶 — 多线程】线程池

目录 1. 线程池的原理 1.1 为什么要有线程池 1.2 线程池的构造方法 1.3 线程池的核心参数 1.4 TimeUnit 1.5 工作队列的类型 1.6 工厂设计模式 1.6.1 工厂模式概念 1.6.2 使用工厂模式的好处 1.6.3 使用工厂模式的典型案例 1.6.4 Thread…

基于Vue+SpringBoot的求职招聘平台

平台概述 本平台是一个高效、便捷的人才与职位匹配系统&#xff0c;旨在为求职者与招聘者提供一站式服务。平台内设三大核心角色&#xff1a;求职者、招聘者以及超级管理员&#xff0c;每个角色拥有独特的功能模块&#xff0c;确保用户能够轻松完成从信息获取到最终录用的整个…

黑马点评 秒杀下单出现的问题:服务器异常---java.lang.NullPointerException: null(已解决)

前言&#xff1a; 在此之前找了好多资料&#xff0c;查了很多&#xff0c;都没有找到对应解决的方法&#xff0c;虽然知道是userid为空&#xff0c;但不知道要修改哪里&#xff0c;还是自己的debug能力不足&#xff0c;以后得多加练习。。。 问题如下&#xff1a; 点击限时抢…

使用GDB或Delve对已经运行起来的Go程序进行远程调试

同步发布在我的博客&#xff0c;欢迎来点赞。 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 背景 Java 程序可以很方便地通过 jdwp 参数指定一个对外端口进行远程调试&#xff0c;如 java \ -agentlib…

如何解决pdf.js跨域从url动态加载pdf文档

摘要 当我们想用PDF.js从URL加载文档时&#xff0c;将会因遇到跨域问题而中断&#xff0c;且是因为会触发了PDF.js和浏览器的双重CORS block&#xff0c;这篇文章将会介绍&#xff1a;①如何禁用pdf.js的跨域&#xff1f;②如何绕过浏览器的CORS加载URL文件&#xff1f;②如何使…

Jmeter中的断言(三)

9--MD5Hex断言 功能特点 数据完整性验证&#xff1a;验证响应数据的 MD5 哈希值是否符合预期。简单配置&#xff1a;只需提供预期的 MD5 哈希值即可。灵活配置&#xff1a;可以设置多个断言条件&#xff0c;满足复杂的测试需求。 配置步骤 添加 MD5Hex 断言 右键点击需要添加…

Tomcat和Nginx原理说明

Tomcat Tomcat 是一个开源的 Java 应用服务器&#xff0c;它由多个关键组件组成。这些组件共同协作&#xff0c;实现了 Servlet 容器的功能。以下是 Tomcat 的核心组件说明及其逻辑架构的示意图。 1. Tomcat 核心组件说明 (1) Server 描述&#xff1a;Tomcat 的顶级组件&…

vmWare虚拟环境centos7安装Hadoop 伪分布式实践

背景&#xff1a;近期在研发大数据中台&#xff0c;需要研究Hadoop hive 的各种特性&#xff0c;需要搭建一个Hadoop的虚拟环境&#xff0c;本来想着使用dock &#xff0c;但突然发现docker 公共仓库的镜像 被XX 了&#xff0c;无奈重新使用vm 搭建虚拟机。 大概经历了6个小时完…

10 基于深度学习的目标检测

首次完成时间&#xff1a;2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1&#xff09;程序代码&#xff1a; import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …

ssl证书,以 Nginx 为例

文章目录 1 证书概述1.1 常见证书格式1.2 证书的几种扩展名1.3 关于 PKCS#12 格式 2 Nginx 下证书配置2.1 证书的工作原理2.1.1 单向认证2.1.2 双向认证 2.2 CA 机构签发2.2.1 免费 SSL 证书申请2.2.2 双向认证 2.3 自签证书2.3.1 单向认证2.3.2 双向认证 附录 1&#xff1a;Wi…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中&#xff0c;任务栈&#xff08;Task&#xff09;是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

专家PID控制

专家PID控制&#xff08;Expert PID Control&#xff09;是一种结合了传统PID控制和专家系统思想的控制方法。它通过引入专家经验、规则和推理机制&#xff0c;以改善PID控制器在面对复杂系统时的性能。专家PID控制不仅仅依赖于固定的PID参数&#xff08;比例、积分、微分&…

ES分词环境实战

文章目录 安装下载1.1 下载镜像1.2 单节点启动 防火墙设置异常处理【1】iptable链路中断 参考文档 参加完2024年11月软考&#xff0c;对ES的分词进行考查&#xff0c;前期有【 Docker 环境下安装部署 Elasticsearch 和 kibana】和【 Docker 环境下为 Elasticsearch 安装IK 分…

【桌面应用程序】Vue-Electron 环境构建、打包与测试(Windows)

前言 Vue 与 Electron 环境构建、打包与测试。 目录 前言 一、基本环境准备 二、配置npm源 三、创建Vue项目 四、添加Electron支持 五、应用启动 ​六、添加UI框架 ElementUI ​七、打包 一、基本环境准备 npm版本&#xff1a;8.6.0node版本&#xff1a;v18.0.0Vue/…

golang中的init函数

程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包&#xff0c;那么就会在编译时将它们依次 导入。有时一个包会被多个包同时导入&#xff0c;那么它只会被导入一次&#xff08;例如很多包可能都会用到 fmt 包&#xff0c;但 它只会被导入一次&#x…

Paint 学习笔记

目录 ippaint 外扩对象 LCM_inpaint_Outpaint_Comfy&#xff1a; 不支持文字引导 ippaint https://github.com/Sanster/IOPaint 外扩对象 https://www.iopaint.com/models/diffusion/powerpaint_v2 GitHub - open-mmlab/PowerPaint: [ECCV 2024] PowerPaint, a versatile …