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)
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值