自学内容网 自学内容网

灰色关联分析法详细讲解+Python代码实现

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

模型引出

灰色系统

关联分析

灰色关联分析

基本概念

基本步骤

①母序列

②子序列

③数据预处理

④计算灰色关联系数

⑤计算关联度

典型例题1

典型例题2

Python代码实现


模型引出

灰色系统

灰色系统理论是1982年由邓聚龙创立的一门边缘性学科(interdisciplinary)灰色系统用颜色深浅反映信息量的多少。说一个系统是黑色的,就是说这个系统是黑洞洞的,信息量太少;说一个系统是白色的,就是说这个系统是清楚的信息量充足。而处于黑白之间的系统,或说信息不完全的系统,称为灰色系统或简称灰系统。

“信息不完全”是灰的基本含义,一般指:

  • (1)系统因素不完全明确
  • (2)因素关系不完全清楚
  • (3)系统的结构不完全知道
  • (4)系统的作用原理不完全明了

关联分析

所谓关联分析,就是系统地分析因素。回答的问题是:某个包含多种因素的系统中,哪些因素是主要的,哪些是次要的:哪些因素影响大,哪些因素影响小:哪些因素是明显的,哪些因素是潜在的;哪些是需要发展的,那些需要抑制……

现有因素分析的量化方法,大都是数理统计法如回归分析、方差分析、主要成分分析等,这些方法都有下述弱点:

  • (1)要求大量数据,数据量少难以找到统计规律
  • (2)要求分布是典型的(线性的、指数的或对数的),即使是典型的并非都能处理
  • (3)计算工作量大,一般需要计算机帮助
  • (4)有时可能出现反常情况,如正相关则断为负相关,以至正确现象受到歪曲和颠倒

尤其是我国统计数据十分有限,而且现有数据灰度较大,许多数据都出现几次大起大落,没有典型的分布规律。因此,采用数理统计方法往往难以奏效。

灰色关联分析

基本概念

        灰色关联度分析(Grey Relation Analysis,GRA),是一种多因素统计分析的方法。灰色关联分析方法弥补了采用数理统计方法作系统分析所导致的缺憾。它对样本量的多少和样本有无规律都同样适用,而且计算量小,十分方便,更不会出现量化结果与定性分析结果不符的情况。
        灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联度就越大,反之就越小。

        对一个抽象的系统或现象进行分析,首先要选准反映系统行为特征的数据序列,称为找系统行为的映射量,用映射量来间接地表征系统行为。例如,用国民平均接受教育的年数来反映教育发达程度,用刑事案件的发案率来反映社会治安面貌和社会秩序,用医院挂号次数来反映国民的健康水平等。有了系统行为特征数据和相关因素的数据,即可作出各个序列的图形,从直观上进行分析。

基本步骤

①母序列

母序列(又称参考序列、母指标)能反映系统行为特征的数据序列,类似于因变量Y,记为Y=\left [ y_{1},y_{2} ...,y_{n}\right ]^{T}

②子序列

子序列(又称比较序列、子指标)影响系统行为的因素组成的数据序列,类似于自变量X,记为

③数据预处理

由于不同要素具有不同量纲和数据范围,因此我们要对他们进行预处理去量纲,将他们统一到近似的范围内,先求出每个指标的均值,在用指标中的元素除以其均值

④计算灰色关联系数

计算子序列中各个指标与母序列的关联系数

其中a,b两极最小差和最大差,X_{0}为母序列,X_{i}为子序列

其中\xi _{i}为关联系数 

⑤计算关联度

典型例题1

已知某地国民生产总值,工业和农业生产总值,原始数据的形式及来源见下表,分析工业农
业哪个对国民生产总值影响大。

1)定义母序列及子序列如下

因为我们要分析工业农业哪个对国民生产总值影响大,所有国民生产总值自然是X0母序列,工业和农业产值分别为X1和X2子序列。

2)数据预处理

对数据进行均值化

比如2016年的国民生产总值0.75=55÷[(55+65+75+100)÷ 4]

3)求关联系数

分别用母序列X0减去X1和X2并取绝对值,得到如下表

从表中可以得出最小差a=0.01,最大差b=0.38

接着将a和b带入求关联系数的公式中

计算出的结果如下

4)求关联度

根据前面的结果计算\xi _{1}\xi _{2}的均值 

从结果可以看出r_{1}>r_{2},说明工业产值关联度更大。

典型例题2

前面例题1是关联分析去求解一些指标的关联度的问题,那么我们怎么将关联分析运用到综合评价问题中呢?这里我们还是以前面给明星A找对象为例
我们来换个方法给明星A选对象,还是A、B、C三位候选人(A觉得身高165是最好,体重在90-100斤是最好)

这个问题就是综合评价问题,最终评价出一个最高分

1)数据正向化处理(可看TOPSIS法那一篇文章)

将原始矩阵正向化,就是要将所有的指标类型统一转化为极大型指标,正向化后如下

2)正向化后的数据预处理

每个指标的元素除以该指标元素的平均值,结果如下

3)构造母序列

在例题1中,我们是由明确的母序列的,但在评价决策问题中往往没有明显的因变量,所有我们需要构造出一个母序列,如何构造呢,其实就是每个对象所有指标中的最大值,结果如下

4)计算关联系数

记差值矩阵为K

结果如下

易得a=0,b=1.55

带入求关联系数的公式中

结果如下

5)计算关联度

结果如下

在得到关联度之后,我们就可以计算各个指标的权重了

6)计算指标权重

结果如下 

这里其实就是对关联度进行归一化就可以得到指标权重,其中r为关联度,w为权重

7)计算得分并归一化

结果如下

可以看出候选人B最后依然是以微弱的优势胜出。

Python代码实现

以例题1为例

import numpy as np
# 请输入初始矩阵[[55,24,10],[65,38,22],[75,40,18],[100,50,20]]
A = np.array(eval(input('请输入初始矩阵=')))# 假设输入的形式是合法的Python列表形式
# 求出每一列的均值以供后续的数据预处理
Mean = np.mean(A, axis=0)
# 预处理后的矩阵
A_norm = A/Mean
print("预处理后的矩阵为:")
print(A_norm)
# 母序列
Y = A_norm[:,0]
# 子序列
X = A_norm[:,1:]
# 计算|X0-Xi|矩阵(在这里我们把X0定义为了Y)
absX0_Xi = np.abs(X-np.tile(Y.reshape(-1,1),reps=(1,X.shape[1])))
# 计算两级最小差a
a= np.min(absX0_Xi)
#计算两级最大差b
b = np.max(absX0_Xi)
# 分辨系数取0.5
rho = 0.5
#计算子序列中各个指标与母序列的关联系效
gamma = (a+rho*b)/(absX0_Xi + rho*b)
print('子序列中各个指标的灰色关联度分别为:')
print(np.mean(gamma,axis=0))

运行结果如下:

以例题2为例

import numpy as np #导入numpy库,用于选行科学计算
# 从用户输入中接收参评效目和指标数目,并将输入的字符事转换为数值
n = int(input("请输入参评数目:")) # 接收参评数目
m = int(input("请输入指标数目:")) # 接收指标数目
# 接收用户输入的类型矩阵,该矩阵指示了每个指标的类型(极大型、极小型等)
kind = input("请输入类型矩阵(1:极大型,2:极小型,3:中间型,4:区间型):").split(" ") # 将输入的字符串按空格分割,形成列表
# 接收用户输入的矩阵并转换为numpy数组
print("请输入矩阵:")
A = np.zeros(shape=(n,m)) #初始化一个n行m列的全零矩阵A
for i in range(n):
    A[i] = input().split(" ") # 接收每行输入的数据
    A[i] = list(map(float, A[i])) # 将接收到的字符串列表转换为浮点数列表
print("输入矩阵为:\n{}".format(A)) # 打印输入的矩阵A

# 极小型指标转化为极大型指标的函数
def minTomax(maxx,x):
    x = list(x) # 将输入的指标效据转换为列表
    ans = [[(maxx-e)] for e in x]  # 计算最大值与每个指标值的差,并将其放入新列表中
    return np.array(ans) # 将列表转换为numpy数组并返回

# 中间型指标转化为极大型指标的函数
def midTomax(bestx,x):
    x = list(x) # 将输入的指标效据转换为列表
    h = [abs(e-bestx)for e in x] # 计算每个指标值与最优值之间的绝对差
    M = max(h) # 找到最大的差值
    if M == 0:
        M = 1 # 防止最大差值为0的情况
    ans = [[(1-e/M)]for e in h] # 计算每个差值占最大差值的比例,并从1中减去,得到新指标值
    return np.array(ans) # 返回处理后的numpy数组

# 区间型指标转化为极大型指标的函数
def regTomax(lowx,highx,x):
    x = list(x) # 将输入的指标效据转换为列表
    M = max(lowx-min(x),max(x)-highx) # 计算指标值超出区间的最大距高
    if M == 0:
        M = 1 # 防止最大距离为0的情况
    ans = []
    for i in range(len(x)):
        if x[i]<lowx:
            ans.append([(1-(lowx-x[i])/M)]) # 如果指标值小于下限,则计算其与下限的距离比例
        elif x[i]>highx:
            ans.append([(1-(x[i]-highx)/M)]) # 如果指标值大于上限,则计算其与上限的距离比例
        else:
            ans.append([1]) # 如果指标值在区间内,则直接职为1
    return np.array(ans) #返回处理后的numpy数组

# 统一指标类型,将所有指标转化为极大型指标
X = np.zeros(shape=(n,1))
for  i in range(m):
    if kind[i]=="1": # 如果当前指标为极大型,则直接使用原值
        v= np.array(A[:,i])
    elif kind[i]=="2": # 如果当前指标为极小型,调用minTomax函数转换
        maxA = max(A[:,i])
        v = minTomax(maxA,A[:,i])
    elif kind[i]=="3": # 如果当前指标为中间型,调用midTomax函数转换
        bestA = float(eval(input("【类型三】请输入最优值:")))
        v = midTomax(bestA,A[:,i])
    elif kind[i]=="4": #如果当前指标为区间型,调用regTomax的数转换
        lowA = float(eval(input("【类型四】请输入区间[a,b]值a:")))
        highA = float(eval(input("【类型四】请输入区间[a,b]值b:")))
        v = regTomax(lowA, highA, A[:,i])
    if i==0:
        X = v.reshape(-1,1) # 如果是第一个指标,直接替换X数组
    else:
        X= np.hstack([X,v.reshape(-1,1)]) # 如果不是第一个指标,则将新指标列拼接到X敬组上
print("统一指标后矩阵为:\n{}".format(X)) # 打印处理后的矩阵X

# 对正向化后的矩阵进行预处理
Mean = np.mean(X, axis=0)
Z = X/Mean
print("预处理后的矩阵为:")
print(Z)
# 构造母序列和子序列
Y = np.max(Z,axis=1) # 母序列为虚拟的,用每一行的最大值构成的列向量表示母序列
X = Z #子序列就是预处理后的数据矩阵
#计算得分
absX0_Xi = np.abs(X-np.tile(Y.reshape(-1,1),reps=(1,X.shape[1])))
a = np.min(absX0_Xi)
b = np.max(absX0_Xi)
rho = 0.5 # 分辨系效取0.5
gamma = (a+rho*b)/(absX0_Xi+rho *b) # 计算子序列中各个指标与母序列的关联系数
weight = np.mean(gamma,axis=0)/np.sum(np.mean(gamma,axis=0)) # 利用子序列中各个指标的灰色关联度计算权重
score = np.sum(X*np.tile(weight,reps=(X.shape[0],1)),axis=1) # 未归一化的得分
stand_S = score/np.sum(score) # 归一化后的得分
sorted_S = np.sort(stand_S)[::-1] # 进行降序排序
index = np.argsort(stand_S)[::-1] # 排序后的索引
print("归一化后的得分及其索引(降序):")
print(sorted_S)
print(index)

代码中前半部分都是使用TOPSIS中的指标正向化

运行结果如下:

从结果来看,索引为1(也就是候选人B)得分最高。

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述


原文地址:https://blog.csdn.net/m0_64336780/article/details/138617734

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!