灰色关联与TOPSIS法 —— python

目录

1.简介

2.算法详解

2.1 指标正向化及标准化

2.2 找到最大最小参考向量

2.3 计算与参考向量的相关系数

2.4 求评分

3.实例分析

3.1 读取数据

3.2 数据标准化

3.3 得到最大最小参考行

3.4 与最大值的灰色相关系数

3.5 与最小值的灰色相关系数

3.6 计算综合评分

 完整代码


1.简介

TOPSIS法 —— python :传送门

灰色关联法 —— python:传送门

2.算法详解

2.1 指标正向化及标准化

        设有m个待评对象,n个评价指标,可以构成数据矩阵X=(xij)m*n,设数据矩阵内元素,经过指标正向化处理过后的元素为xij'

  • 若xj为负向指标(越小越优型指标)

  • 若xj为正向指标(越大越优型指标)

2.2 找到最大最小参考向量

设正向化标准化后的数据矩阵

最大参考向量由各个指标的最大值构成

最小参考向量由各个指标的最小值构成

2.3 计算与参考向量的相关系数

求出标准化后数据矩阵X和最大参考向量Vmax和最小参考向量Vmin的灰色相关系数。

该过程仿照灰色关联度分析法做就行

  • 参考向量的选择

        例如研究x2指标与x1指标之间的灰色关联度。所以将x1列作为参考向量,即要研究与谁的关系,就将谁作为参考。设参考向量为Y1=x1,生成新的数据矩阵 X1=x2.

  • 生成绝对值矩阵 

设生成的绝对值矩阵为A

A=[X1-Y1],亦是A=[x2-x1]

设dmax为绝对值矩阵A的最大值,dmin为绝对值矩阵A的最小值。

  • 计算灰色关联矩阵

设灰色关联矩阵为B

  • 计算灰色关联

2.4 求评分

3.实例分析

数据来源:蓝奏云

3.1 读取数据

#导入数据
data=pd.read_excel('D:\桌面\TOPSIS.xlsx') #横坐标为评价指标,纵坐标为评价对象
# print(data)
#提取变量名 x1 -- x7
label_need=data.keys()[1:]
# print(label_need)
#提取上面变量名下的数据
data1=data[label_need].values.T
print(data1)

返回:

 

 3.2 数据标准化

#0.002~1区间归一化
data2=data1.astype('float')
data3=data2
ymin=0.002
ymax=1
for j in range(0,n):
    d_max=max(data2[:,j])
    d_min=min(data2[:,j])
    data3[:,j]=(ymax-ymin)*(data2[:,j]-d_min)/(d_max-d_min)+ymin
print(data3)

返回:

 3.3 得到最大最小参考行

# 得到最大最小参考行
data3=data3.T
V_max=np.max(data3,axis=0) #最大参考行,指标最大
V_min=np.min(data3,axis=0) #最小参考行,指标最小

3.4 与最大值的灰色相关系数

# 与最大值的灰色相关系数
[m,n]=data1.shape #得到行数和列数
data4=data3;
for i in range(m):
    data4[i,:]=abs(data3[i,:]-V_min);
#得到绝对值矩阵的全局最大值和最小值
d_max=np.max(data4)
d_min=np.min(data4)
#灰色关联矩阵
a=0.5;   #分辨系数
data5=(d_min+a*d_max)/(data4+a*d_max);
xi_min=np.mean(data5.T,axis=1)
print(xi_min)

 返回:

3.5 与最小值的灰色相关系数

# 与最小值的灰色相关系数
[m,n]=data1.shape #得到行数和列数
data4=data3;
for i in range(m):
    data4[i,:]=abs(data3[i,:]-V_max);
#得到绝对值矩阵的全局最大值和最小值
d_max=np.max(data4)
d_min=np.min(data4)
#灰色关联矩阵
a=0.5;   #分辨系数
data5=(d_min+a*d_max)/(data4+a*d_max);
xi_max=np.mean(data5.T,axis=1)
print(xi_max)

返回:

 3.6 计算综合评分

# 综合评分
#与最大指标行相关系数越大,最小指标构成的行相关系数越小得分大
s=xi_min/(xi_max+xi_min)
Score=100*s/max(s)
for i in range(len(Score)):
    print(f"第{i+1}个投标者百分制得分为:{Score[i]}")

返回:

 完整代码

#导入数据
data=pd.read_excel('D:\桌面\TOPSIS.xlsx')
# print(data)
#提取变量名 x1 -- x7
label_need=data.keys()[1:]
# print(label_need)
#提取上面变量名下的数据
data1=data[label_need].values.T
print(data1)
#0.002~1区间归一化
data2=data1.astype('float')
data3=data2
ymin=0.002
ymax=1
for j in range(0,n):
    d_max=max(data2[:,j])
    d_min=min(data2[:,j])
    data3[:,j]=(ymax-ymin)*(data2[:,j]-d_min)/(d_max-d_min)+ymin
print(data3)
# 得到最大最小参考行
V_max=np.max(data3) #最大参考行,指标最大
V_min=np.min(data3) #最小参考行,指标最小
# 与最大值的灰色相关系数
[m,n]=data1.shape #得到行数和列数
data4=data3;
for i in range(m):
    data4[i,:]=abs(data3[i,:]-V_min);
#得到绝对值矩阵的全局最大值和最小值
d_max=np.max(data4)
d_min=np.min(data4)
#灰色关联矩阵
a=0.5;   #分辨系数
data5=(d_min+a*d_max)/(data4+a*d_max);
xi_min=np.mean(data5.T,axis=1)
print(xi_min)
# 与最小值的灰色相关系数
[m,n]=data1.shape #得到行数和列数
data4=data3;
for i in range(m):
    data4[i,:]=abs(data3[i,:]-V_max);
#得到绝对值矩阵的全局最大值和最小值
d_max=np.max(data4)
d_min=np.min(data4)
#灰色关联矩阵
a=0.5;   #分辨系数
data5=(d_min+a*d_max)/(data4+a*d_max);
xi_max=np.mean(data5.T,axis=1)
print(xi_max)
# 综合评分
#与最大指标行相关系数越大,最小指标构成的行相关系数越小得分大
s=xi_min/(xi_max+xi_min)
Score=100*s/max(s)
for i in range(len(Score)):
    print(f"第{i+1}个投标者百分制得分为:{Score[i]}")
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值