TOPSIS法 —— python

目录

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 ,其中

(2)得到加权后的矩阵

计算信息熵:

权重为:

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

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

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

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

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

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

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

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

(5)计算综合评价值

得分为:

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

3.实例研究 

数据来源:蓝奏云

3.1 导入相关库

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

3.2 读取数据

读取文件中所有数据:

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

返回:

得到数据的变量名:

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

返回:

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

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

返回:

3.3 读取行数和列数

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

返回:

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)

返回:

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)

返回:

3.6 计算权重

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

返回:

3.7 计算权重后的数据

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

返回:

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)

返回:

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]}")

返回:

总代码

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]}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言随机读写文件

实现随机读写的关键是要按要求移动位置指针&#xff0c;这称为文件的定位。 文件定位函数rewind和fseek 移动文件内部位置指针的函数主要有两个&#xff0c;即 rewind() 和 fseek()。 rewind() 用来将位置指针移动到文件开头&#xff0c;前面已经多次使用过&#xff0c;它的…

mysql-installer安装教程(详细图文)

目录 1.安装 2.配置系统环境变量 3.配置初始化my.ini文件 4.MySQL彻底删除 5.Navicat 安装 1.安装 先去官网下载需要的msi&#xff0c;在这放出官网下载地址下载地址 这里我具体以8.0.28 为安装例子&#xff0c;除了最新版安装界面有些变动以往的都是差不多的。 过去的版本…

Java三种随机数生成方法

java的三种随机数生成方式 随机数的产生在一些代码中很常用&#xff0c;也是我们必须要掌握的。而java中产生随机数的方法主要有三种&#xff1a;     第一种&#xff1a;new Random()     第二种&#xff1a;Math.random()     第三种&#xff1a;currentTimeMil…

Python MySQL入门连接

目录 基本环境准备 navicat的傻瓜使用方式 python连接 mysql安装教程&#xff1a;传送门 基本环境准备 WINR 输入cmd回车打开cmd&#xff0c;登录mysql: mysql -h localhost -u root -p然后输入密码回车即可。 创建用户名为testuser1&#xff1a; CREATE USER testuser1…

JDBC连接sql server数据库

IDEA使用JDBC连接Sqlserver数据库 在IDEA的项目中添加对应数据库的jar包 在项目中创建util包和DBUtil类用来存放数据库连接的java代码。 完整代码 package com.hnpi.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; …

Python MySQL创建表

目录 一、创建表 二、检查表是否存在 三、关键字 一、创建表 在库student环境下创建表名为stu: # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root", #默认用户名password"123456"…

JDBC连接 Mysql数据库

IDEA使用JDBC连接Mysql数据库 在项目中添加连接Mysql数据库的jar包 在项目中创建util包和DBUtil类用来存放数据库连接的java代码。 完整代码 package com.zsh.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import…

Python MySQL插入表

目录 1.插入表格 2.插入多行 3.获取插入的 ID 1.插入表格 要在 MySQL 中填充表&#xff0c;请使用“INSERT INTO”语句。 “stu”表中添加一条记录&#xff1a; 代码&#xff1a; # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认…

Python MySQL选择

目录 1.从表中选择 2.选择列 3.使用 fetchone() 1.从表中选择 要从 MySQL 中的表中进行选择&#xff0c;请使用“SELECT”语句。从“stu”表中选择所有记录&#xff0c;并显示结果&#xff1a; # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhos…

Eclipse编辑器字体大小的设置

我们在第一次使用 Eclipse 编写程序时&#xff0c;由于 Eclipse 默认使用的是 Cosnolas 字体&#xff0c;字号为 10&#xff0c;所以编辑器中的字体非常小&#xff0c;不方便查看。 我们可以通过下面所示的方法来修改编辑器的字体大小。 操作方法&#xff1a; 1 . 选择“窗口…

Python MySQL查询在哪里(where)

目录 一.用过滤器选择 二.通配符 三.防止 SQL 注入 一.用过滤器选择 从表中选择记录时&#xff0c;可以使用“WHERE”语句过滤选择。例如&#xff1a;选择名字为”笨小孩“的记录&#xff1a;结果&#xff1a; # codinggbk #连接 import pymysqlmydb pymysql.connect(hos…

Python MySQL排序

目录 顺序排序 按 DESC逆序排序 顺序排序 使用 ORDER BY 语句按升序或降序对结果进行排序。ORDER BY 关键字默认对结果进行升序排序。要按降序对结果进行排序&#xff0c;请使用 DESC 关键字。 按名称的字母顺序对结果进行排序&#xff1a; # codinggbk #连接 import pymys…

Python MySQL删除

目录 删除记录 防止 SQL 注入 删除记录 您可以使用“DELETE FROM”语句从现有表中删除记录。例如删除地址为“笨小孩”的任何记录&#xff1a; # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root&q…

Python MySQL更新表

目录 更新表 防止 SQL 注入 更新表 您可以使用“UPDATE”语句更新表中的现有记录。将地址栏从“Valley 345”改写为“Canyoun 123”&#xff1a; # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root…

Python MySQL合并

目录 创建新表 表中添加数据 连接两个或多个表 左连接 右连接 创建新表 创建表名为product # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root", #默认用户名password"123456",…

如何用记事本编写运行java程序?

我们在安装好JDK和配置好环境变量后&#xff0c;许多人使用编译器编写程序而不会使用记事本编写运行java程序&#xff0c;下面就给大家讲解一下使用记事本编写运行java程序。 1.首先&#xff0c;要保证环境变量配置完成。组合键<WinR>打开运行命令框。 2.输入CMD进入命…

Python MySQL限制

目录 限制结果 从另一个位置开始 限制结果 我们先看一下表中全部数据 # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root", #默认用户名password"123456", #mysql密码databasest…

笔记本电脑控制面板在哪_2020年滚筒洗衣机选购指南:滚筒洗衣机应该怎么选?哪一些滚筒洗衣机性价比更高?...

滚筒洗衣机以其独特的特点和功能的多样性被现在很多家庭所接纳&#xff0c;很多人都想入手一台滚筒洗衣机&#xff0c;因为他最大的特点就是速度&#xff0c;符合现在快节奏的生活&#xff0c;另外杀菌、省电、省水、清洁度和卫生性方面也很好。但是现在市面上的滚筒洗衣机的品…

四万字让你精通SQL数据库操作

目录 前言 MySQL 命令提示符相关操作 MYSQL 最重要的命令 SELECT选择语句 SELECT DISTINCT 选择不同语句 WHERE 查询定位 子句 AND、OR 和 NOT 运算符 ORDER BY 关键字 INSERT INTO 插入语句 NULL 空值 UPDATE更新语句 DELETE删除语句 TOP、LIMIT、FETCH FIRST 或…

3d打印英语文献_万华推出可3D打印PP粉末材料

近日&#xff0c;随着万华推出了PP粉末材料 WANFAB PP700N&#xff0c;PP将进入一个全新的应用领域——3D打印。1 什么是3D打印技术3D打印技术又称增材制造技术&#xff0c;是一项起源于20 世纪80 年代集机械、计算机、数控和材料于一体的先进制造技术。该技术的基本原理是根据…