TOPSIS算法介绍及python实现
日期:2020.1.14
部分算法转载自Thaws 2016-07-19 14:57:31 文章( https://blog.csdn.net/Thaws/article/details/51955861 )
TOPSIS是非常基础的评价算法,常见于建模比赛和各种文章当中, TOPSIS是最著名的经典指标方法之一,最初是在1981年由Hwang和Yoon首次提出,在1992年由Chen和Hwang做了进一步的发展。
TOPSIS是一个评价算法,为解释算法思想,假设情景是对一个班级的学生评价,评价指标包含,德智体美四项。为选出TOPSIS将各项指标分别排序,取出德智体美四项的最高值,以及最低值,构成“最好样本”,“最坏样本”并求解各学生与最好最坏间的距离,根据距离打分。
TOPSIS具体步骤见Thaws 2016-07-19 14:57:31 文章( https://blog.csdn.net/Thaws/article/details/51955861 )
python代码:
import pandas as pd
import numpy as np
'''引入pandas和numpy库'''
np.set_printoptions(precision=10)#定义numpy的 计算精度
C = pd.read_excel('原始指标.xlsx',sheet_name=0,header=0, names=None, index_col=None,
usecols=None, squeeze=False,dtype=None, engine=None,
converters=None, true_values=None, false_values=None,
skiprows=None, nrows=None, na_values=None, parse_dates=False,
date_parser=None, thousands=None, comment=None, skipfooter=0,
convert_float=True).values
'''使用pandas读取原始excel'''
A = C[:,2:]
for column in range(A.shape[1]):
print(column)
sum = 0
for row in range(A.shape[0]):
sum = sum + A[row,column]**2
sum = sum**0.5
for row1 in range(A.shape[0]):
A[row1,column] = A[row1,column]/sum
'''使用numpy取出指定列并标准化决策矩阵'''
# A为标准化后的决策矩阵,W为权值矩阵,M为正指标所在的列,N为负指标所在的列[ma,na]=A.shape
w = [0.15,0.15,0.15,0.15,0.1,0.1,0.1,0.1]#w为人为指定的权重矩阵,认为那一项更重要就拟订一个高一点的系数,列求和为1即可
w = np.array(w)#w转化为numpy.array
'''定义TOPSIS计算函数,本函数根据( https://blog.csdn.net/Thaws/article/details/51955861 )matlab代码python重构'''
def Topsis(A,w):
B = np.ones([A.shape[0],A.shape[1]],float)
#ma为A矩阵的行数,na为A矩阵的列数[ma,na]=A.shape
for i in range(A.shape[1]):
B[:,i] = A[:,i]*w[i] #按列循环得到[加权标准化矩阵]
BMAX = np.ones([1,A.shape[1]],float)
BMIN = np.ones([1,A.shape[1]],float)
for j in range(A.shape[1]):
BMAX[0,j]=max(B[:,j])#取加权标准化矩阵每列的最大值和最小值
BMIN[0,j]=min(B[:,j])
# print('BMAX = ',BMAX,'BIMN = ',BMIN)
t = []
for p in range(A.shape[0]):
S1 = np.sqrt(np.sum(np.square(B[p,:]-BMAX[0,:])))
S2 = np.sqrt(np.sum(np.square(B[p,:]-BMIN[0,:])))
t.append(S2/(S1+S1))
t = pd.DataFrame(t)
t.to_csv('e:/result_of_topsis.csv')
return t
Topsis(A,w)