python实现灰色关联法(GRA)

news2025/7/19 0:20:38

原文:https://mp.weixin.qq.com/s/Uuri-FqRWk3V5CH7XrjArg

1 灰色关联分析法简介

白色系统是指信息完全明确的系统,黑色系统是指信息不完全明确的系统,而灰色系统是介于白色与黑色系统之间的系统,是指系统内部信息和特征是部分已知部分未知。

灰色系统理论提出了灰色关联分析的概念,其目的是寻找各因素之间数值的关系

灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断不同序列之间是否具有紧密的联系, 其基本思路是通过线性插值的方法将系统因素的离散行为观测值转化为分段连续的折线,进而根据折线的几何特征构造测度关联程度的模型。

折线的几何形状越接近, 则相应序列之间的关联度就越大,反之就越小。 灰色关联分析实际上是动态指标的量化分析,充分体现了动态意义。

灰色关联度(Grey Relational Analysis, GRA)是指两个系统或两个因素之间关联性大小的量度, 根据其大小我们可以分清因素对系统发展影响的主次关系。

注意:之所以称为关联,是因为他只反映哪一个指标和要对比的指标最有关系,而不反映相关性。他和相关性系数无关,也不对等。最后得出来的系数,也只是做一个排序

灰色关联分析法特点:

  • 不需要应变量,参考变量服从正态分布,对样本数据没有要求,适合小样本数据。
  • 能够将自变量和参考变量的关联性大小排序,从而得到重要性排序的评价,本身的关联度没有实际意义,比如得出关联度为0.95,这个数字只用排序,并不能像相关性0.95一样得出他们高度正相关。
  • 缺点在于只能排序,不能得出确切的相关性,不属于相关性分析范畴,只归入综合评价方法里。

2 灰色关联分析法计算

1)确定指标

2)得到统计数据列成矩阵R

假设选取了 X 个指标,每个指标有 Y 个年份的统计数据。

为了便于计算,将 X 个指标的 Y 个年份的统计数据列成矩阵 R,则有:

3)对矩阵 R 进行无量纲化处理

灰色关联度的计算方法有很多,如绝对关联度、斜率关联度、速率关联度、 B 型关联度、面积关联度等等,这里选择最大最小归一化。

4)确定参考列和对比列

记消除量纲的一个对比序列 x 0 ( t ) x_0(t) x0(t)参考序列 x 1 ( t ) x_1(t) x1(t),则两个序列同在一个时刻 k k k 的值分别为 x 0 ( k ) , x 1 ( k ) x_0(k),x_1(k) x0(k),x1(k) 即:

x 0 ( k ) , x 1 ( k ) x_0(k),x_1(k) x0(k),x1(k)的绝对差值:

5)确定绝对差值的最小值和最大值

6)计算关联系数

Δ i ( k ) \Delta_i(k) Δi(k) k k k 时刻两比较序列的绝对差,在灰色理论中 ρ ∈ ( 0 , 1 ) \rho\in(0,1) ρ(0,1) ,通常研究学者都是取 0.5。

如果 x 0 ( k ) x_0(k) x0(k)是最优值数据列, α i \alpha_i αi 越大,越好;如果 x 0 ( k ) x_0(k) x0(k)是最劣值数据列, α i \alpha_i αi 越小,越不好。

7)计算目标层关联度

式中的 W W W 可以通过AHP方法计算,也可以对 α \alpha α 直接取均值。

8)确定评价等级

3 python 实现

现在有这样一组数据,通过对某健将级女子铅球运动员的跟踪调查,获得其 1982 年至 1986 年每年最好成绩及16 项专项素质和身体素质的时间序列资料,见表,试对此铅球运动员的专项成绩进行因素分析。

# 参考:https://blog.csdn.net/PY_smallH/article/details/121491094
# 最下面写了三个函数分别为gain,cost,level_,用于无量纲化,被GRA调用

def GRA(df,normaliza="initial",level=None,r=0.5):
    '''
    df : 二维数据,这里用dataframe,每一行是一个评价指标,要对比的参考指标放在第一行
    normaliza :["initial","mean"] 归一化方法,默认为初值,提供初值化或者均值化,其他方法自行编写
    level :为None默认增益型, 
            可取增益型"gain"(越大越好),成本型"cost"(越小越好),
            或者dataframe中的某一列,如level="level","level"是列名,这列中用数字1和0表示增益和成本型
    r : [0-1] 分辨系数  
            越大,分辨率越大; 越小,分辨率越小,一般取0.5
    '''
    # 判断类型
    if not isinstance(df,pd.DataFrame):
        df = pd.DataFrame(df)
        
    # 判断参数输入
    if (normaliza not in ["initial","mean"]) or (r<0 or r>1):
        raise KeyError("参数输入类型错误")
    
        # 增益型的无量纲化方法
    if level == "gain" or level == None:
        df_ = gain(df,normaliza)
        
        #成本性无量纲化方法
    elif level == "cost":
        df_ = cost(df,normaliza)
        
    else:# 有增益有成本性的无量纲化方法
        try:
            df.columns.get_loc(level) # 尝试获得这一列的列索引,判断输入的列名有没有,返回这个列的索引下标
        except:
            raise KeyError("表中没有这一列")
        df_ = level_(df,normaliza,level)
        df_.drop(level,axis=1,inplace=True)# 加的level这一列对总体没用,最后把这一列删除再做关联分析
        
    df_ = np.abs(df_ - df_.iloc[0,:]) # 每一行指标和要参考的指标做减法,取绝对值。
    global_max = df_.max().max()
    global_min = df_.min().min()
    df_r = (global_min + r*global_max)/(df_ + r*global_max) # 求关联矩阵
    return df_r.mean(axis=1)

# gain增益型
def gain(df,normaliza):
    for i in range(df.shape[0]):
        if normaliza == "initial" or normaliza==None:
            df.iloc[i] = df.iloc[i]/df.iloc[i,0]
        elif normaliza == "mean":
            df.iloc[i] = df.iloc[i]/df.mean(axis=1)
    return df

# cost成本型
def cost(df,normaliza):
    for i in range(df.shape[0]):
        if normaliza == "initial" or normaliza==None:
            df.iloc[i] = df.iloc[i,0]/df.iloc[i]
        elif normaliza == "mean":
            df.iloc[i] = df.mean(axis=1)/df.iloc[i]
    return df

# 数据如下
x = np.array([
    [13.6,14.01,14.54,15.64,15.69],
    [11.50,13.00,15.15,15.30,15.02],
    [13.76,16.36,16.90,16.56,17.30],
    [12.41,12.70,13.96,14.04,13.46],
    [2.48,2.49,2.56,2.64,2.59],
    [85,85,90,100,105],
    [55,65,75,80,80],
    [65,70,75,85,90],
    [12.80,15.30,16.24,16.40,17.05],
    [15.30,18.40,18.75,17.95,19.30],
    [12.71,14.50,14.66,15.88,15.70],
    [14.78,15.54,16.03,16.87,17.82],
    [7.64,7.56,7.76,7.54,7.70],
    [120,125,130,140,140],
    [80,85,90,90,95],
    [4.2,4.25,4.1,4.06,3.99],
    [13.1,13.42,12.85,12.72,12.56]
])

df1 = pd.DataFrame(x)

可得到最终的关联系数:

0 1.000000
1 0.588106
2 0.662749
3 0.853618
4 0.776254
5 0.854873
6 0.502235
7 0.659223
8 0.582007
9 0.683125
10 0.695782
11 0.895453
12 0.704684
13 0.933405
14 0.846704
15 0.745373
16 0.726079

第一行是铅球专项成绩x0,本身和自己最关联,这个不用看,剩下关联最强的就是x13全蹲,这样可以做针对性训练。最后还可以排个序。

再讨论一下这个关联系数矩阵,步骤中第五步求出的。针对上面的,关联矩阵如下:

画一个图,从里面挑几行出来画,要不太多了,看不清楚。

挑的数据为[0,1,2,3,4,13,16]这几行,其中0就是参考的指标。

可以看得出来,x13是关系最强的,所以和0的那条直线挨的最近,1,2,3中3是最强的,所以红色的线也在上面。

这就是一开始说的,若两个因素变化的趋势具有一致性,即同步变化程度较高,即可谓二者关联程度较高;反之,则较低。

参考:
基于AHP-灰色关联分析法的沈阳市沈河区住区景观综合评价研究-王文文.
https://blog.csdn.net/PY_smallH/article/details/121491094

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA设置和相关快捷键记录汇总

IDEA设置和相关快捷键 前言 Java 开发 现在基本都是使用 IDEA 作为开发工具&#xff0c;IDEA 有很多设置和常用的快捷键&#xff0c;熟悉之后能更好的提高开发效率&#xff0c;这里总结了下从慕课网的内容 开发工具IDEA从入门到爱不释手-慕课网 (imooc.com)&#xff0c;摘录做…

Kafka - 04 Java客户端实现消息发送和订阅

1. Kafka测试命令行操作 1. 主题命令行操作 在上一节中我们安装了Kafka单机环境和集群环境&#xff0c;这一节来测试下Linux环境安装Kafka后的命令行操作。 我们之前在用Windows环境安装Kafka Kafka应用场景|基础架构|Windows安装|命令行操作 和命令行操作时&#xff0c;讲到…

哪种类型的蓝牙耳机好?超高性价比蓝牙耳机推荐

朋友让我推荐蓝牙耳机的时候&#xff0c;总是喜欢问哪款蓝牙耳机的性能更强&#xff0c;想要直接入手那款性能更强的蓝牙耳机&#xff0c;以此节省对比的时间。但是用户自行进行对比的步骤&#xff0c;显然是不能省的&#xff0c;所以推荐这四款高性价比的蓝牙耳机&#xff0c;…

华为云桌面Workspace,让你的办公更加舒适惬意

在各行各业转型的过程中&#xff0c;企业对于线上办公的需求不断增多&#xff0c;越来越需要一个云办公平台&#xff0c;为企业更好实现数字化网络化办公降本增效。正逢佳节之际&#xff0c;在此为各大企业推荐一个高效的办公神器——华为云桌面Workspace。相信作为企业决策者的…

详解设计模式:抽象工厂模式

工厂方法模式&#xff0c;又称工厂模式、多态工厂模式和虚拟构造器模式&#xff0c;通过工厂父类定义负责创建产品的公共接口&#xff0c;子类负责生产具体对象。可以理解为简单工程模式的升级&#xff0c;解决简单工厂模式的弊端。 &#xff5e; 本篇内容包括&#xff1a;关于…

Executors-四种创建线程的手段

1 Executors.newCachedThreadPool() 从构造方法可以看出&#xff0c;它创建了一个可缓存的线程池。当有新的任务提交时&#xff0c;有空闲线程则直接处理任务&#xff0c;没有空闲线程则创建新的线程处理任务&#xff0c;队列中不储存任务。线程池不对线程池大小做限制&#x…

ESP三相SVPWM控制器的simulink仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB程序 1.算法描述 SVPWM则以三相的合成矢量为出发点&#xff0c;其基本思想为&#xff1a;在数学意义上的abc轴也好&#xff0c;αβ轴也好&#xff0c;其产生的电压都应该等于dq轴合成的那个电压。那么只要让…

swiper在动态创建dom过程中的问题:数据从后端请求回来后加载到页面上,dom加载完发现swiper没用了

怎么动态创建div标签&#xff1a; 要轮播的数据是后端返回的&#xff0c;所以我们要发ajax请求接收数据&#xff1b; 下面演示的是已经接收回来的数据&#xff0c;动态创建div标签&#xff1a; setTimeout(()>{var list ["aaa","bbb","ccc&quo…

【Redis】从计算机组成原理开始讲解为什么会出现Redis

文章目录前置知识数据库的出现Redismemcache与redis的区别前置知识 首先需要知道的一个常识就是&#xff1a;数据是存放在磁盘里面的。 而磁盘有两个指标&#xff1a; 寻址&#xff1a;表示找到对应的数据所需要的时间&#xff0c;ms带宽&#xff1a;表示单位时间可以有多少个…

Python排序:冒泡排序,选择排序,插入排序,希尔排序

编程中的交换元素逻辑&#xff1a; # python中交换元素 有内置的三方底层逻辑 可以直接交换 a 2 b 3 a, b b, a print(a) # a为3# 其他编程需要有一个中间的变量来转换 变量设为temp a 2 b 3 temp a a b b temp print(a) # a为3 -----冒泡排序----- 相邻…

openfeign原理

openfeign原理 EnableFeignClients注解启用Feign客户端&#xff0c;通过Import注解导入了FeignClientsRegistrar类加载额外的Bean。FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar接口&#xff0c;在Spring启动过程中会调用registerBeanDefinitions方法注册BeanDe…

自动化项目倍加福WCS-PG210E使用GSD文件

1&#xff0e;硬件电气连接 WCS-PG210E WCS3B WCS2B Pin 颜色 Pin 颜色 24V UB 1 BN棕色 2 WH白色 0V GND 3 BU蓝色 3 BU蓝色 RS485- RS485- 4 BK黑色 1 BN棕色 RS485 RS485 2 WH白色 4 BK黑色 保留 5 GY灰色 5 GY灰色 2. 安装W…

Nginx (4):nginx动静分离

什么是动静分离不解释了&#xff0c;网上说的很清楚&#xff0c;这里只说配置 目的 02虚拟机运行一个tomcat&#xff0c;处理动态请求&#xff0c;而对静态文件的访问则交给01虚拟机。操作 下面是01虚拟机的配置文件内容&#xff1a; server {listen 82;listen [::]:82;#root /…

六、nacos环境隔离、服务配置拉取和多环境配置共享

文章目录一、环境隔离-namespace1.namespace理解2.创建命名空间二、Nacos-实现配置管理三、nacos-实现服务配置拉取1.非热更新2.热更新&#xff1a;四、实现多环境配置共享1.开发环境&#xff1a;2.测试环境3.结论一、环境隔离-namespace 1.namespace理解 Nacos中服务存储和数…

Element Plus 组件库相关技术:7. 组件实现的基本流程及 Icon 组件的实现

前言 本章节我们将要实现 Icon 组件&#xff0c;Icon 组件应该是所有组件里面最简单的一个组件了&#xff0c;所以我们由简入深&#xff0c;循序渐进进行学习。Icon 组件虽然简单&#xff0c;但它却包含了一个组件的全部基础流程&#xff0c;通过实现 Icon 组件进行理解 Eleme…

疫情失业之下,测试的未来在哪里

前天和测试圈子里一个朋友聊了关于今年求职招聘市场行情和个人认知以及发展副业的话题。 聊起了今年的求职招聘行情&#xff0c;他说他们公司已经裁了一波人了&#xff0c;估计年底还会有一波裁员。 今年的市场冷的有点吓人&#xff0c;在这么下去&#xff0c;他也会担心自己…

nacos实现负载均衡、权重

文章目录一、nacos服务分级存储模型二、Nacos-NacosRule 实现负载均衡三、nacos-服务实例的权重设置一、nacos服务分级存储模型 修改 application.yml 配置文件&#xff1a; spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ #集群位置&#xff0c…

Linux C/C++ 学习笔记(九):百万并发的服务器实现

本文内容参考自(2条消息) Linux C/C 开发&#xff08;学习笔记十三)&#xff1a;百万并发的服务器实现_菊头蝙蝠的博客-CSDN博客_linux百万并发 一、connection_refuesed ---->文件系统最大的进程fd个数 nat 模式&#xff0c;物理机的VMnet8网卡&#xff0c;连接到了VMnet…

selenium--关闭窗口,指定窗口大小,前进,后退,刷新等等

关闭窗口跳转到指定页面窗口大小设置返回上个页面前进到下一个页面页面刷新关闭窗口 在selenium中执行完关闭窗口一般有两种方法&#xff1a; driver.close() driver.quit()这两个都是常用的方法&#xff0c;但是他们有什么区别呢&#xff1f; 对于driver.close(),他是关闭当…

【FME实战教程】003:FME读取地理空间数据(矢量、栅格、点云、三维模型、数据库、地理服务)大全

FME读取地理空间数据&#xff08;矢量、栅格、点云、三维模型、空间数据库、地理服务&#xff09;大全。 文章目录1. FME读取数据1.1 读取矢量1.1.1 读取Shapefile1.1.2 读取dwg1.2 读取栅格数据1.2.1 影像DOM1.3 读取地理数据库1.3.1 读取文件数据库&#xff08;.gdb&#xff…