数学建模:EWM – TOPSIS 超强讲义! 原理、应用、代码

目录

一、综合评价指标预处理

1.定量指标的一致化处理(正向化处理)

2.定量指标的无量纲化处理

二、熵权法(EWM)

三、TOPSIS法

四、熵权法-TOPSIS的使用流程

案例:熵权法-TOPSIS的案例分析:水质评价

(一)数据导入

(二)指标一致化处理(正向化)

(三)指标的无量纲化处理

(四)确定正负理想解

(五)熵权法确定权重

(六)TOPSIS计算综合评分

(七)结果的分析及绘图


一、综合评价指标预处理

1.定量指标的一致化处理(正向化处理)

       一致化处理就是将评价指标的类型进行统一。一般来说,在评价指标体系中,可能会同时存在极大型指标(指指标越大越好的指标)、极小型指标(指指标越小越好的指标)、居中型指标(指标值取一个中间值最好的指标)和区间型指标(指指标值取在某个区间内为最好的指标)。若指标体系中存在不同类型的指标,必须在综合评价之前将评价指标的类型做一致化处理。例如,将各类指标都转化为极大型指标,或极小型指标。一般的做法是将非极大型指标转化为极大型指标。

2.定量指标的无量纲化处理

通俗来说:就是矩阵的标准化(每一个数 /其所在列数的平方和的再开方)

二、熵权法(EWM

在信息论中信息熵是信息不确定性的一种度量。

熵值法是一种依据各指标值所包含的信息量的多少确定指标权重的客观赋权法,某个指标的熵越小,说明该指标值的变异程度越大,提供的信息量也就越多,在综合评价中起的作用越大,则该指标的权重也应越大。

熵值法可单独进行综合评价;也可以与其他方法相结合,如TOPSIS法,用熵值法确定各指标的权重,然后运用TOPSIS法得到各个评价对象的综合得分。用熵值法确定权重就是所谓的熵权法。

三、TOPSIS

TOPSIS法是理想解的排序方法(Technique for Order Preference by Similarity to Ideal Solution)的英文缩写。它借助于评价问题的正理想解和负理想解,对各评价对象进行排序。

正理想解是一个虚拟的最佳对象,其每个指标值都是多所有评价对象中该指标的最好值;

负理想解则是另一个虚拟的最差对象,其每个指标都是评价对象中该指标的最差值。求出各评价对象与正理想解和负理想解的距离,并以此对评价对象进行优劣排序。

四、熵权法-TOPSIS的使用流程

以美赛O奖论文为例:来自美赛2023E Team # 2307336

  1. 导入数据
  2. 正向化
  3. 无量纲化
  4. 得出正负理想解
  5. EWM熵权法计算权重
  6. TOPSIS计算加权相对距离和相对接近度
  7. 排序、得出结论、画图描述结果

案例:熵权法-TOPSIS的案例分析:水质评价

案例描述:一共20条河流从A-T排序,其中含氧量(极大化指标), PH值(中间型指标,近7越好), 细菌总数(极小指标), 植物性营养含量 (【10,20】区间型指标),使用合适的方法评价河流水质。

(一)数据导入

import pandas as pd
data = pd.read_excel(r"data.xlsx")

(二)指标一致化处理(正向化)

 # 1.最小化指标极大化 细菌总数
data["细菌总数_极大化"] = data["细菌总数(个/mL)"].apply(lambda x : max(data["细菌总数(个/mL)"]) - x)

 # 2.居中型转化为极大型指标 PH值 7
PH_M = max(abs(data["PH值"] - 7))
data["PH值_极大化"] = data["PH值"].apply(lambda x: 1 - abs(x - 7) / PH_M)

# 3.区间型转化为极大型指标 植物性营养含量(ppm)
nutrition_Max = max(data["植物性营养含量(ppm)"])
nutrition_min = min(data["植物性营养含量(ppm)"])
nutrition_M = max(10 - nutrition_min, nutrition_Max - 20)
data['植物性营养含量_极大化'] = data["植物性营养含量(ppm)"].apply(
                                    lambda x: 1 - (10 - x) / nutrition_M if x < 10 
                                    else (1 - (x - 20) / nutrition_M if x >20  
                                    else 1))

(三)指标的无量纲化处理

import numpy as np
normalized_data = data.loc[:,["含氧量(ppm)","PH值_极大化","细菌总数_极大化","植物性营养含量_极大化"]]

# 将每一列的每一个数除以该列所有数的平方和再开方
for column in normalized_data.columns:
    squared_sum = np.square(normalized_data[column]).sum() 
    normalized_data[column] = normalized_data[column] / np.sqrt(squared_sum)  

(四)确定正负理想解

# 确定正负理想解
C_positive = [max(normalized_data[i]) for i in list(normalized_data.columns)]
C_negative = [min(normalized_data[i]) for i in list(normalized_data.columns)]  

(五)熵权法确定权重

# 计算特征比重
normalized_data["P_含氧量"] = normalized_data["含氧量(ppm)"].apply(lambda x: x / sum(normalized_data["含氧量(ppm)"]))
normalized_data["P_PH值"] = normalized_data["PH值_极大化"].apply(lambda x: x / sum(normalized_data["PH值_极大化"]))
normalized_data["P_细菌总数"] = normalized_data["细菌总数_极大化"].apply(lambda x: x / sum(normalized_data["细菌总数_极大化"]))
normalized_data["P_植物性营养含量"] = normalized_data["植物性营养含量_极大化"].apply(lambda x: x / sum(normalized_data["植物性营养含量_极大化"]))

# 计算每个指标的信息熵
import math
e_1 = - (1 / math.log(20)) * sum(normalized_data["P_含氧量"].apply(lambda x: x * (math.log(x + 0.0000001))))
e_2 = - (1 / math.log(20)) * sum(normalized_data["P_PH值"].apply(lambda x: x * (math.log(x + 0.0000001))))
e_3 = - (1 / math.log(20)) * sum(normalized_data["P_细菌总数"].apply(lambda x: x * (math.log(x + 0.0000001))))
e_4 = - (1 / math.log(20)) * sum(normalized_data["P_植物性营养含量"].apply(lambda x: x * (math.log(x + 0.0000001))))
e = [e_1, e_2, e_3, e_4]

# 计算信息效用值
d = [1 - e_i for e_i in e]

# 信息效用值归一化 - 得到四个指标的权重
w = [d_i / sum(d) for d_i in d]

(六)TOPSIS计算综合评分

# 计算正负理想解距离
normalized_data_copy = normalized_data.iloc[:,:4]
w = np.array(w) # 权重矩阵
C_positive = np.array(C_positive) # 正理想解
C_negative = np.array(C_negative) # 负理想解
normalized_data['dist_to_C_positive'] = normalized_data_copy.apply(lambda row: np.sqrt(np.sum(np.square((row - C_positive) * w))), axis=1)
normalized_data['dist_to_C_negative'] = normalized_data_copy.apply(lambda row: np.sqrt(np.sum(np.square((row - C_negative) * w))), axis=1)

# 计算相对接近度
normalized_data['f'] = normalized_data['dist_to_C_negative'] / (normalized_data['dist_to_C_negative'] + normalized_data['dist_to_C_positive'])

(七)结果的分析及绘图

使用柱状图,描述相对接近度即水质质量评分的情况。可以看出河流I、河流K水质最为良好,河流N水质最差,排名如图2

import matplotlib.pyplot as plt
import seaborn as sns
# 高清图像输出
%config InlineBackend.figure_format = 'retina'
%matplotlib inline
# 设置Seaborn样式
sns.set()
# 对数据按照 "f" 列进行降序排序。
data_show = data_show.sort_values(by="f", ascending=True)
# 获取colormap
cmap = plt.cm.get_cmap("RdYlGn_r")  # 颜色可变如tab20 RdYlGn_r等等
# 计算颜色
colors = cmap(data_show["f"].values / data_show["f"].values.max())
# 创建水平柱状图
with plt.xkcd():
    plt.barh(data_show["河流"], data_show["f"], color=colors)
    for i, (index, row) in enumerate(data_show.iterrows()):
        plt.text(row['f'], i, f"{row['f']:.2f}", va='center')  # 将数据标签添加到条形图的右侧
    plt.title("Relative closeness coefficient")
    plt.show()

雷达图的使用:多维度评价,4-6维度效果较好。可以使用PPT进一步加工。

# 雷达图 需要添加正理想解
import plotly.graph_objects as go

# # 数据映射到0-1区间(可选)
# from sklearn.preprocessing import MinMaxScaler
# scaler = MinMaxScaler()
# df_normalized = pd.DataFrame(scaler.fit_transform(normalized_data.iloc[:,:4]), columns=normalized_data.iloc[:,:4].columns)

df_normalized = normalized_data.iloc[:,:4]
# 先进行拼接
df = pd.concat([data.iloc[:,0],df_normalized],axis=1)
# 然后添加新的行 "正理想解" 和 "负理想解"
df.loc["正理想解"] = ["正理想解"] + list(df.iloc[:, 1:].max())
df.loc["负理想解"] = ["负理想解"] + list(df.iloc[:, 1:].min())
# 定义属性
categories = ['含氧量(ppm)', 'PH值_极大化', '细菌总数_极大化', '植物性营养含量_极大化']
# 绘制雷达图
fig = go.Figure()
for i in range(len(df)):
    fig.add_trace(go.Scatterpolar(
      r=[df.iloc[i][col] for col in categories],
      theta=categories,
      fill='toself',
      name=f'河流 - {df.iloc[i]["河流"]}'
    ))
fig.update_layout(
    polar=dict(
    radialaxis=dict(
      visible=True,
    )),
  showlegend=True
)
fig.update_layout(template = "presentation") # plotly_dark presentation plotly 
fig.show()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪吃蛇的实现,基于windows操作系统

前言&#xff1a; 贪吃蛇从学习到真正实现花了9天实现&#xff0c;第一二天第一次学习&#xff0c;第三四五天第二次学习&#xff0c;第六七八天一边实现一边思考&#xff0c;才完成了贪吃蛇的代码。实现了贪吃蛇以后已经接近过年&#xff0c;我想自己再根据掌握的知识制作烟花…

leetcode 461. 汉明距离

比较简单的一题&#xff0c;先对两个整数进行异或操作&#xff0c;会将两个整数二进制形式中各个数字进行异或操作&#xff0c;不同的数字则为1&#xff0c;再通过移位操作统计得到的二进制数中为1的个数&#xff0c;即为所求。 Java代码如下&#xff1a; class Solution {pub…

STM32 STD/HAL库驱动W25Q64模块读写字库数据+OLED0.96显示例程

STM32 STD/HAL库驱动W25Q64 模块读写字库数据OLED0.96显示例程 &#x1f3ac;原创作者对W25Q64保存汉字字库演示&#xff1a; W25Q64保存汉字字库 &#x1f39e;测试字体显示效果&#xff1a; &#x1f4d1;功能实现说明 利用W25Q64保存汉字字库&#xff0c;OLED显示汉字的时…

SVD奇异值分解

一、奇异值 奇异值&#xff08;Singular Values&#xff09;是线性代数中矩阵的重要性质之一&#xff0c;与奇异值分解&#xff08;SVD&#xff09;密切相关。让我们来更详细地了解一下奇异值的概念&#xff1a; 定义&#xff1a; 对于一个矩阵 ( A )&#xff0c;它的奇异值是…

【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、基本介绍 Vehicle Overview Vehicle Mannel Vehicle的官方demo 1.1 Vehicle的构型 一个车辆由许多子系统构成&#xff1a;悬挂、转向、轮子/履带、刹车/油门、动…

双场板功率GaN HEMT电容模型以精确模拟开关行为

标题&#xff1a;Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior&#xff08;TED.16年&#xff09; 摘要 本文提出了一种基于表面电位的紧凑模型&#xff0c;用于模拟具有栅极和源极场板&#xff08;FP&#xff09;结构的AlGaN/G…

JMM(Java内存模型)

Java内存模型&#xff08;Java Memory Model&#xff0c;简称JMM&#xff09;是Java语言规范中定义的一个抽象概念&#xff0c;它描述了程序中各个变量&#xff08;包括实例字段、静态字段和构成数组对象的元素&#xff09;在并发环境下的访问规则和一致性保证。JMM的主要目标是…

python+flask+django医院预约挂号病历分时段管理系统snsj0

技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm . 第一&#xff0c;研究分析python技术&#xff0c…

点云标注工具

目录 3d手势识别 c 3d关键点&#xff0c;Bounding Box Labels Rectangle Labels KITTI 3D Ground Truth Annotator c标注工具 3d手势识别 GitHub - 99xtaewoo/Automated-Hand-3D-pose-annotation-Tool: Automated Hand 3D pose annotation Tool c 3d关键点&#xff0c;Bou…

【Django】Django文件上传

文件上传 1 定义&场景 定义&#xff1a;用户可以通过浏览器将图片等文件上传至网站。 场景&#xff1a; 用户上传头像。 上传流程性的文档[pdf&#xff0c;txt等] 2 上传规范-前端[html] 文件上传必须为POST提交方式 表单 <form> 中文件上传时必须带有 enctype…

电视上如何下载软件

电视上如何下载软件&#xff0c;告诉大家一个简单的方法&#xff0c;可以用DT浏览器下载软件&#xff0c;然后会自动安装这个软件&#xff0c;如有技术问题&#xff0c;可以免费解答

【初中生讲机器学习】8. KNN 算法原理 实践一篇讲清!

创建时间&#xff1a;2024-02-11 最后编辑时间&#xff1a;2024-02-12 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

从零开始学howtoheap:fastbins的house_of_spirit攻击3

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指…

Python:解析获取连续的重叠对pairwise

简介&#xff1a;pairwise函数&#xff0c;返回从输入迭代器获取的重叠对的迭代器&#xff0c;是Python 3.10 新特性&#xff0c;表示一个迭代器从对象中获取连续的重叠对&#xff0c;在某些场景中可以优化代码运行效率。pairwise 函数是一种用于处理列表中元素之间配对操作的通…

渗透专用虚拟机(公开版)

0x01 工具介绍 okfafu渗透虚拟机公开版。解压密码&#xff1a;Mrl64Miku&#xff0c;压缩包大小&#xff1a;15.5G&#xff0c;解压后大小&#xff1a;16.5G。安装的软件已分类并在桌面中体现&#xff0c;也可以使用everything进行查找。包含一些常用的渗透工具以及一些基本工…

腾讯云4核8G服务器多少钱?2024精准报价

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;轻量应用服务器4核8G12M带宽一…

app逆向-android-studio安装使用教程

Android Studio 是谷歌推出的一个Android集成开发工具&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 android-studio下载地址&#xff1a;https://developer.android.com/studio/archive androi…

【ES】--ES集成自定义分词库

目录 一、相关安装1、(window单机)elasticsearch安装2、安装Elasticvue插件3、ik分词器插件4、ES集成自定义词库 一、相关安装 1、(window单机)elasticsearch安装 Win10下下载ES组件&#xff0c;安装部署如下&#xff1a;JDK1.8、elasticsearch-7.3.2-windows-x86_64。 Elast…

【前端web入门第六天】01 CSS浮动

⭐️第六天目标 解决布局问题如多个div标签在同一行的问题 简单来说,就是可以两个标签,一个在左边,另一个在右边. &#x1f449;相关知识 标准流浮动flex布局❗️ ❗️ ❗️ 标准流是先导,浮动和flex布局都可以解决问题,但是浮动在目标开发领域较为落后,主流的解决办法是flex…

Linux第51步_移植ST公司的linux内核第3步_添加修改设备树

1、设备树文件的路径 1)、创建linux中的设备树头文件 在“my_linux/linux-5.4.31/arch/arm/boot/dts/”目录中&#xff0c;以“stm32mp15xx-edx.dtsi”为蓝本&#xff0c;复制一份&#xff0c;并命名为 “stm32mp157d-atk.dtsi”&#xff0c;这就是我们开发板的设备树头文件。…