【建模算法】TOPSIS法(Python实现)

2023-11-23 04:00

本文主要是介绍【建模算法】TOPSIS法(Python实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【建模算法】TOPSIS法(Python实现)

Topsis法,全称为Technique for Order Preference by Similarity to an Ideal Solution,中文常翻译为“优劣解距离法”或“逼近理想解排序法”,该方法是一种通过比较样本值与理想值的距离实现综合评价的方法。能够根据现有的数据,对个体进行评价排序。TOPSIS算法是直接用来评价的,它也可以和赋权方法一起使用。

逼近理想解排序法(TOPSIS),采用相对接近度来表征各个评价对象与参考点的距离。首先在空间确定出参考点,包括最优和最劣点,然后计算各个评价对象与参考点的距离,与最优点越近或与最劣点越远说明被评价对象的综合特性越好。

一、问题描述

现需要对投标者进行综合评价,实现某招标公司的招标项目决策。现有A、B、C、D四个投标者,招标公司对它们的总价、人力、方案、设备级别、公司级别、能力成熟度分别进行评价,觉得哪个投标者应该中标?投标单位的各项指标数量与分值如下:
在这里插入图片描述

二、TOPSIS法评价步骤

step0:指标正向化

不同的指标代表含义不一样,有的指标越大越好,称为越大越优型指标。有的指标越小越好,称为越小越优型指标,而有些指标在某个点是最好的,称为某点最优型指标。为方便评价,应把所有指标转化成越大越优型指标。

设有m个待评对象,n个评价指标,可以构成数据矩阵 X = ( x i j ) m × n X=(x_{ij})_{m\times n} X=(xij)m×n , 设数据矩阵内元素,经过指标正向化处理过后的元素为 x i j ′ {x}^{\prime}_{ij} xij

  • 越小越优型指标:

x i j ′ = m a x ( x i j ) − x i j x^{\prime}_{ij}=max{(x_{ij})}-x_{ij} xij=max(xij)xij

其他处理方法也可,只要指标性质不变即可

  • 某点最优型指标:

    设最优点为a, 当a=90时E最优。
    在这里插入图片描述

​ 其他处理方法也可,只要指标性质不变即可

  • 越大越优型指标:

x i j ′ = x i j x^{\prime}_{ij}=x_{ij} xij=xij

此类指标可以不用处理,想要处理也可,只要指标性质不变

step1:数据标准化

因为本案例数据指标都是正向指标,不需要进行指标正向化,若有其他性质指标应把它们都正向化。

本案例直接进入数据标准化,每个指标的数量级不一样,需要把它们化到同一个范围内比较。可以用最大最小值标准化方法。本案例使用另一方法。

设有m个待评对象,n个评价指标,可以构成数据矩阵 X = ( x i j ) m × n X=(x_{ij})_{m\times n} X=(xij)m×n ,设数据矩阵内元素 x i j x_{ij} xij,标准化处理过后的元素为 x i j ′ x^{\prime}_{ij} xij
x i j ′ = x i j ∑ i = 1 m x i j 2 x^{\prime}_{ij}=\frac{x_{ij}}{\sqrt{\sum^m_{i=1}x^2_{ij}}} xij=i=1mxij2 xij

step2:计算加权后的矩阵

之前有讲过层次分析法、熵权法、变异系数法,都是获取权重的方法,可以翻看之前的文章。现设得到指标的权重为 w i w_i wi ,加权重后的数据为 r i j r_{ij} rij

每个指标的数量级不一样,需要把它们化到同一个范围内比较。上一篇建模算法用到了最大最小值标准化方法。此篇可以用一个新的标准化方法,处理如下:

设标准化后的数据矩阵元素为 r i j r_{ij} rij ,由上可得指标正向化后数据矩阵元素为 x i j ′ x^{\prime}_{ij} xij
r i j = w j x i j ′ r_{ij}=w_jx^{\prime}_{ij} rij=wjxij

step3:计算矩阵和最值之间的距离

处理过后可以构成数据矩阵 R = ( r i j ) m × n R=(r_{ij})_{m\times n} R=(rij)m×n

  • 定义每个指标即每列的最大值为 r j + r^+_j rj+
    r j + = m a x ( r 1 j , r 2 j , . . . , r n j ) r^+_{j}=max(r_{1j},r_{2j},...,r_{nj}) rj+=max(r1j,r2j,...,rnj)

  • 定义每个指标即每列的最小值为 r j − r^{-}_{j} rj
    r j − = m i n ( r 1 j , r 2 j , . . . , r n j ) r^{-}_{j}=min(r_{1j},r_{2j},...,r_{nj}) rj=min(r1j,r2j,...,rnj)

  • 定义第i个对象与最大值距离为 d i + d^{+}_{i} di+
    d i + = ∑ j = 1 n ( r j + − r i j ) 2 d^+_i=\sqrt{\sum^n_{j=1}(r^+_j-r_{ij})^2} di+=j=1n(rj+rij)2

  • 定义第i个对象与最小值距离为 d i − d^-_i di
    d i − = ∑ j = 1 n ( r j − − r i j ) 2 d^{-}_{i}=\sqrt{\sum^n_{j=1}(r^{-}_{j}-r_{ij})^2} di=j=1n(rjrij)2

step4:计算评分

得分为:
S c o r e i = d i − d i + + d i − Score_i=\frac{d^-_i}{d^+_i+d^-_i} Scorei=di++didi
明显可以看出 0 ≤ S c o r e i ≤ 1 0\leq Score_i\leq 1 0Scorei1 ,当 S c o r e i Score_i Scorei越大时,

d i + d^+_i di+越小,说明指标离最大值距离越小,越接近最大值。

三、求解结果

结果如下:
在这里插入图片描述

四、实现代码

Python源码:

import pandas as pd
import numpy as np#读取数据
data=pd.read_excel('投标单位各项指标和分值.xlsx')#数据标准化
label_need=data.keys()[1:]
data1=data[label_need].values
[m,n]=data1.shape
data2=data1.copy().astype('float')
for j in range(0,n):data2[:,j]=data1[:,j]/np.sqrt(sum(np.square(data1[:,j])))#计算加权重后的数据
w=[0.3724, 0.1003,0.1991, 0.1991,0.0998,0.0485]   #使用求权重的方法求得,参见文献1
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]}") 

参考文献:

【1】陈雷,王延章.基于熵权系数与TOPSIS集成评价决策方法的研究[J].控制与决策,2003(04):456-459.

这篇关于【建模算法】TOPSIS法(Python实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415197

相关文章

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用