1、TOPSIS基本概念

TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution )模型中文叫做“逼近理想解排序方法”,是根据评价对象与理想化目标的接近程度进行排序的方法,是一种距离综合评价方法。基本思路是通过假定正、负理想解,测算各样本与正、负理想解的距离,得到其与理想方案的相对贴近度(即距离正理想解越近同时距离负理想解越远),进行各评价对象的优劣排序。具体步骤及概念如下:

step 1: 指标同向化、标准化并得到权重。这部分与熵权法结合,通过熵权法得到权重,避免主观因素影响,得到权重向量W及标准化矩阵P。具体内容可参照综合评价之熵权法,这里不再赘述。

step 2 : 得到加权后的规范化矩阵Z。Z由P与W相乘后得到。

step 3 : 确定正、负理想解。正理想解指各指标都达到样本中最好的值,负理想解指各指标都为样本中最差的值。

step 4 : 计算各样本距离正、负理想解的距离。

step 5 : 计算各评价对象与最优方案的贴近程度。正其中

的取值范围为[0,1],越接近1表明样本评分越好。

2、作用

TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。

3、输入输出描述

输入:至少两项或以上的定量变量。
输出:反应考核指标在量化评价中的综合得分。

4、代码

import numpy as np  # 导入numpy包并将其命名为np##定义正向化的函数
def positivization(x,type,i):
# x:需要正向化处理的指标对应的原始向量
# typ:指标类型(1:极小型,2:中间型,3:区间型)
# i:正在处理的是原始矩阵的哪一列if type == 1:  #极小型print("第",i,"列是极小型,正向化中...")posit_x = x.max(0)-xprint("第",i,"列极小型处理完成")print("--------------------------分隔--------------------------")return posit_xelif type == 2:  #中间型print("第",i,"列是中间型")best = int(input("请输入最佳值:"))m = (abs(x-best)).max()posit_x = 1-abs(x-best)/mprint("第",i,"列中间型处理完成")print("--------------------------分隔--------------------------")return posit_xelif type == 3:  #区间型print("第",i,"列是区间型")a,b = [int(l) for l in input("按顺序输入最佳区间的左右界,并用逗号隔开:").split(",")]m = (np.append(a-x.min(),x.max()-b)).max()x_row = x.shape[0]  #获取x的行数posit_x = np.zeros((x_row,1),dtype=float)for r in range(x_row):if x[r] < a:posit_x[r] = 1-(a-x[r])/melif x[r] > b:posit_x[r] = 1-(x[r]-b)/melse:posit_x[r] = 1print("第",i,"列区间型处理完成")print("--------------------------分隔--------------------------")return posit_x.reshape(x_row)## 第一步:从外部导入数据
#注:保证表格不包含除数字以外的内容
x_mat = np.loadtxt('river.csv', encoding='UTF-8-sig', delimiter=',')  # 推荐使用csv格式文件## 第二步:判断是否需要正向化
n, m = x_mat.shape
print("共有", n, "个评价对象", m, "个评价指标")
judge = int(input("指标是否需要正向化处理,需要请输入1,不需要则输入0:"))
if judge == 1:position = np.array([int(i) for i in input("请输入需要正向化处理的指标所在的列,例如第1、3、4列需要处理,则输入1,3,4").split(',')])position = position-1typ = np.array([int(j) for j in input("请按照顺序输入这些列的指标类型(1:极小型,2:中间型,3:区间型)格式同上").split(',')])for k in range(position.shape[0]):x_mat[:, position[k]] = positivization(x_mat[:, position[k]], typ[k], position[k])print("正向化后的矩阵:", x_mat)## 第三步:对正向化后的矩阵进行标准化
tep_x1 = (x_mat * x_mat).sum(axis=0)  # 每个元素平方后按列相加
tep_x2 = np.tile(tep_x1, (n, 1))  # 将矩阵tep_x1平铺n行
Z = x_mat / ((tep_x2) ** 0.5)  # Z为标准化矩阵
print("标准化后的矩阵为:", Z)## 第四步:计算与最大值和最小值的距离,并算出得分
tep_max = Z.max(0)  # 得到Z中每列的最大值
tep_min = Z.min(0)  # 每列的最小值
tep_a = Z - np.tile(tep_max, (n, 1))  # 将tep_max向下平铺n行,并与Z中的每个对应元素做差
tep_i = Z - np.tile(tep_min, (n, 1))  # 将tep_max向下平铺n行,并与Z中的每个对应元素做差
D_P = ((tep_a ** 2).sum(axis=1)) ** 0.5  # D+与最大值的距离向量
D_N = ((tep_i ** 2).sum(axis=1)) ** 0.5
S = D_N / (D_P + D_N)  # 未归一化的得分
std_S = S / S.sum(axis=0)
sorted_S = np.sort(std_S, axis=0)
print(std_S)  # 打印标准化后的得分
## std_S.to_csv(std_S.csv)  结果输出到std_S.csv文件

案例:

某一教育评估机构对5个研究生院进行评估。该机构选取了4个评价指标:人均专著、生师比、科研经费、逾期毕业率。采集数据如表所示。

解释:人均专著和科研经费是效益性指标,预期毕业率是成本型指标,生师比是区间型指标,最优范围是[5,6],最差下限2,最差上限12. 4个指标权重采用专家打分的结果,分别为0.2,0.3,0.4和0.1。

实现代码:

import numpy as np
import pandas as pd#TOPSIS方法函数
def Topsis(A1):W0=[0.2,0.3,0.4,0.1] #权重矩阵W=np.ones([A1.shape[1],A1.shape[1]],float)for i in range(len(W)):for j in range(len(W)):if i==j:W[i,j]=W0[j]else:W[i,j]=0Z=np.ones([A1.shape[0],A1.shape[1]],float)Z=np.dot(A1,W) #加权矩阵#计算正、负理想解Zmax=np.ones([1,A1.shape[1]],float)Zmin=np.ones([1,A1.shape[1]],float)for j in range(A1.shape[1]):if j==3:Zmax[0,j]=min(Z[:,j])Zmin[0,j]=max(Z[:,j])else:Zmax[0,j]=max(Z[:,j])Zmin[0,j]=min(Z[:,j])#计算各个方案的相对贴近度CC=[]  for i in range(A1.shape[0]):Smax=np.sqrt(np.sum(np.square(Z[i,:]-Zmax[0,:])))Smin=np.sqrt(np.sum(np.square(Z[i,:]-Zmin[0,:])))C.append(Smin/(Smax+Smin))C=pd.DataFrame(C,index=['院校' + i for i in list('12345')])   return C#标准化处理
def standard(A):#效益型指标A1=np.ones([A.shape[0],A.shape[1]],float)for i in range(A.shape[1]):if i==0 or i==2:if max(A[:,i])==min(A[:,i]):A1[:,i]=1else:for j in range(A.shape[0]):A1[j,i]=(A[j,i]-min(A[:,i]))/(max(A[:,i])-min(A[:,i]))#成本型指标elif i==3:if max(A[:,i])==min(A[:,i]):A1[:,i]=1else:for j in range(A.shape[0]):A1[j,i]=(max(A[:,i])-A[j,i])/(max(A[:,i])-min(A[:,i])) #区间型指标else:a,b,lb,ub=5,6,2,12for j in range(A.shape[0]):if lb <= A[j,i] < a:A1[j,i]=(A[j,i]-lb)/(a-lb)elif a <= A[j,i] < b:A1[j,i]=1       elif b <= A[j,i] <= ub:A1[j,i]=(ub-A[j,i])/(ub-b)else:  #A[i,:]< lb or A[i,:]>ubA1[j,i]=0   return A1#读取初始矩阵并计算
def data(file_path):data=pd.read_excel(file_path).valuesA=data[:,1:]A=np.array(A)#m,n=A.shape[0],A.shape[1] #m表示行数,n表示列数return A#权重
A=data('研究生院评估数据.xlsx')
A1=standard(A)
C=Topsis(A1)
print(C)

数学建模之:TOPSIS综合评价模型python代码相关推荐

  1. 数学建模——TOPSIS综合评价模型Python代码

    数学建模--TOPSIS综合评价模型Python代码 正常代码 import numpy as np # 导入numpy包并将其命名为np ##定义正向化的函数 def positivization( ...

  2. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  3. 数学建模:整数规划示例模型 (Python 求解)

    目录 例 1 : 选课策略模型 1. 为了选修课程门数最少, 应学习哪些课程? 建立 0-1 规划模型 Python 求解 2. 选修课程最少时, 为了学分尽量多, 应学习哪些课程? 例 2 : 装箱 ...

  4. 数学建模之:匈牙利算法python代码

    from scipy.optimize import linear_sum_assignmentcost =np.array([[4,1,3],[2,0,5],[3,2,2]]) row_ind,co ...

  5. Python小白的数学建模课-09.微分方程模型

    小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型的建模与求解,通过常微分方程.常微分方程组.高阶常微分方程 3个案例手 ...

  6. 【Python数学建模】SEIR传染病模型模型延伸-SEIDR模型(一),加入疫苗接种、政府管控、病毒变异等因素的影响

    目录 一. SEIR传染病模型 二. SEIR模型的延伸--SEIDR模型 三. 模型延伸--影响因素1:疫苗接种 四. 模型延伸--影响因素2:政府管控 五. 模型延伸--影响因素3:病毒变异 写在 ...

  7. 数学建模学习记录——数学规划模型

    数学建模学习记录--数学规划模型 一.线性规划问题 MatLab中线性规划的标准型 MatLab中求解线性规划的命令 二.整数线性规划问题 三.非线性规划问题 MatLab中非线性规划的标准型 Mat ...

  8. 【数学建模】灰色关联(Matlab代码实现)

    目录 1 灰色关联理论 2 算例及Matlab代码实现 2.1 算例1 2.2 算例2   2.3 算例3 2.4 算例4  3 写在最后 1 灰色关联理论 灰色关联分析l是由邓聚龙教授于1982年提 ...

  9. dna序列分类数学建模matlab,数学建模DNA序列分类模型(终稿).doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp生物学 数学建模DNA序列分类模型(终稿).doc32页 本文 ...

最新文章

  1. nginx 启动脚本
  2. 深入redis内部--内存管理
  3. 后端 消息 转发_SAP PO 消息报文应用2例(永久保存SAP PO中间件消息之四)
  4. ASP.NET Core快速入门(第6章:ASP.NET Core MVC)--学习笔记
  5. moxy json介绍_MOXy的对象图和动态JAXB
  6. Pytorch —— 模型保存与加载
  7. 部门级服务器一般支持几个cpu,部门级服务器简介
  8. durpal是否支持php7,drupal7 的安装方法
  9. .NET框架图解之五:System.Reflection
  10. 商品规格表设计_计算机毕业设计分享jsp企业销售管理系统
  11. qcap 教程_高通平台抓取ramdump及使用qcap解析,ramdumpqcap
  12. dw添加下拉菜单_Dreamweaver怎么创建下拉菜单
  13. 51单片机温控风扇仿真原理图 C语言程序,51单片机温控风扇(含程序+原理图+仿真+PCB)...
  14. 实战sqlmap绕过WAF(中转注入)
  15. 感冒初期试试食疗方 盲目用药伤脾胃
  16. 微信小程序在java后台获取用户unionid等敏感信息
  17. 虚拟机启动后一直黑屏的解决办法
  18. 如何从零开始设计一款小程序原型?
  19. iOS--上传AppStore时遇到的10个大坑
  20. 在线直播源码,VUE 获奖名单滚动显示的两种方式

热门文章

  1. 推荐测试网站的性能测试工具这最佳的12款
  2. AutoCAD快速入门(十):移动、旋转和复制
  3. shell 免杀aspx_asp免杀webshell木马总结
  4. 超硬核:Linux系统内存知识
  5. 仿抖音 快手 小火山等短视频APP
  6. 怎么查看计算机里隐藏的文件夹,怎么查看隐藏文件,教您怎么查看隐藏文件
  7. Android 应用换肤方案的总结
  8. DL4J源码阅读(一):网络初始化
  9. UnityRPG第三人称控制器
  10. c# 小票机打印二维条码_C# winform小票打印