目录

1.TOPSIS法介绍

2. 计算步骤

(1)数据标准化

(2)得到加权后的矩阵

(3)确定正理想解和负理想解 

(4)计算各方案到正(负)理想解的距离

(5)计算综合评价值

3.实例研究 

3.1 导入相关库

3.2 读取数据

3.3 读取行数和列数

3.4  数据标准化

3.5 得到信息熵 

3.6 计算权重

3.7 计算权重后的数据

3.8 得到最大值最小值距离

3.9 计算评分

总代码


1.TOPSIS法介绍

        TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution),可翻译为逼近理想解排序法,国内常简称为优劣解距离法,TOPSIS 法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。

2. 计算步骤

(1)数据标准化

        设决策矩阵为X=(xij)m×n,(在进行决策时,因决策属性类型的不同、属性量纲不同和属性值的大小不同,决策与评价的结果会受影响)进行属性值的规范化(方法不唯一,可视具体情况而定),设规范化决策矩阵(也就是标准化后的矩阵)X=(xij)m×n ,其中

python熵权topsis代码 熵权法topsis模型的python_python

(2)得到加权后的矩阵

计算信息熵:

python熵权topsis代码 熵权法topsis模型的python_数据_02

权重为:

python熵权topsis代码 熵权法topsis模型的python_后端_03

设标准化后的数据矩阵元素为rij  ,由上可得指标正向化后数据矩阵元素为xij' :

python熵权topsis代码 熵权法topsis模型的python_python_04

(3)确定正理想解和负理想解 

处理过后可以构成数据矩阵 R=(rij)m*n  

  • 定义每个指标即每列的最大值为正理想解

python熵权topsis代码 熵权法topsis模型的python_后端_05

  • 定义每个指标即每列的最大值为负理想解 

python熵权topsis代码 熵权法topsis模型的python_开发语言_06

(4)计算各方案到正(负)理想解的距离

  • 定义第i个对象与最大值距离为正理想解的距离

python熵权topsis代码 熵权法topsis模型的python_数据_07

  • 定义第i个对象与最大值距离为负理想解的距离

python熵权topsis代码 熵权法topsis模型的python_开发语言_08

(5)计算综合评价值

得分为:

python熵权topsis代码 熵权法topsis模型的python_开发语言_09

明显可以看出0<=score<=1 ,当scorei越大时,d+越小,说明指标离最大值距离越小,越接近最大值

3.实例研究 

数据来源:蓝奏云

python熵权topsis代码 熵权法topsis模型的python_数据_10

3.1 导入相关库


#导入相关库
import pandas as pd
import numpy as np


3.2 读取数据

读取文件中所有数据:


#导入数据
data=pd.read_excel('D:\桌面\TOPSIS.xlsx')
print(data)


返回:

python熵权topsis代码 熵权法topsis模型的python_python熵权topsis代码_11


得到数据的变量名:


label_need=data.keys()[1:]
print(label_need)


返回:

python熵权topsis代码 熵权法topsis模型的python_后端_12


得到刨除变量名后的数据值:


data1=data[label_need].values
print(data1)
[m,n]=data1.shape


返回:

python熵权topsis代码 熵权法topsis模型的python_python_13


3.3 读取行数和列数


[m,n]=data1.shape
print('行数:',m)
print('列数:',n)


返回:

python熵权topsis代码 熵权法topsis模型的python_python_14


3.4  数据标准化


#数据标准化
data2=data1.astype('float')
for j in range(0,n):
    data2[:,j]=data1[:,j]/np.sqrt(sum(np.square(data1[:,j])))
print(data2)


返回:

python熵权topsis代码 熵权法topsis模型的python_python熵权topsis代码_15


3.5 得到信息熵 


#计算信息熵
p=data2
for j in range(0,n):
    p[:,j]=data2[:,j]/sum(data2[:,j])
print(p)
E=data2[0,:]
for j in range(0,n):
    E[j]=-1/np.log(m)*sum(p[:,j]*np.log(p[:,j]))
print(E)


返回:

python熵权topsis代码 熵权法topsis模型的python_数据_16


3.6 计算权重


# 计算权重
w=(1-E)/sum(1-E)
print(w)


返回:

python熵权topsis代码 熵权法topsis模型的python_python熵权topsis代码_17


3.7 计算权重后的数据


#得到加权后的数据
R=data2*w
print(R)


返回:

python熵权topsis代码 熵权法topsis模型的python_开发语言_18


3.8 得到最大值最小值距离

#得到最大值最小值距离
r_max=np.max(R, axis=0)  #每个指标的最大值
r_min=np.min(R,axis=0)   #每个指标的最小值
d_z = np.sqrt(np.sum(np.square((R -np.tile(r_max,(m,1)))),axis=1))  #d+向量
d_f = np.sqrt(np.sum(np.square((R -np.tile(r_min,(m,1)))),axis=1))  #d-向量 
print('每个指标的最大值',r_max)
print('每个指标的最小值',r_min)
print('d+向量',d_z)
print('d-向量',d_f)

返回:

python熵权topsis代码 熵权法topsis模型的python_后端_19

3.9 计算评分

#得到评分
s=d_f/(d_z+d_f )
Score=100*s/max(s)
for i in range(0,len(Score)):
    print(f"第{i+1}个投标者百分制得分为:{Score[i]}")

返回:

python熵权topsis代码 熵权法topsis模型的python_数据_20

总代码

import copy
import pandas as pd
import numpy as np
#导入数据
data=pd.read_excel('D:\桌面\TOPSIS.xlsx')
label_need=data.keys()[1:]
data1=data[label_need].values
#计算行数和列数
[m,n]=data1.shape
#print('行数:',m)
#print('列数:',n)
#数据标准化
data2=data1.astype('float')
for j in range(0,n):
    data2[:,j]=data1[:,j]/np.sqrt(sum(np.square(data1[:,j])))
#print(data2)
#计算信息熵
p=data2
for j in range(0,n):
    p[:,j]=data2[:,j]/sum(data2[:,j])
#print(p)
E=data2[0,:]
for j in range(0,n):
    E[j]=-1/np.log(m)*sum(p[:,j]*np.log(p[:,j]))
#print(E)
# 计算权重
w=(1-E)/sum(1-E)
#print(w)
#得到加权后的数据
R=data2*w
#得到最大值最小值距离
r_max=np.max(R, axis=0)  #每个指标的最大值
r_min=np.min(R,axis=0)   #每个指标的最小值
d_z = np.sqrt(np.sum(np.square((R -np.tile(r_max,(m,1)))),axis=1))  #d+向量
d_f = np.sqrt(np.sum(np.square((R -np.tile(r_min,(m,1)))),axis=1))  #d-向量  
#得到评分
s=d_f/(d_z+d_f )
Score=100*s/max(s)
for i in range(0,len(Score)):
    print(f"第{i+1}个投标者百分制得分为:{Score[i]}")