数学建模: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()

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

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

相关文章

Spring Security实现权限认证与授权

一、Spring Security Spring Security作为Spring家族的安全框架&#xff0c;在安全方面的两个核心功能是认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;。 &#xff08;1&#xff09;用户认证指的是&#xff1a;验证某个用户是否为系…

Docker 一小时从入门到实战 —— Docker commands | Create your own image | vs VM ... 基本概念扫盲

Docker crash course 文章目录 Docker crash course1. What and Why of Docker?2.1 What2.2 What problem does it solve?2.2.1 before containers2.1.2 with containers 2. Docker vs Virtual Machines2.1 Difference2.2 Benefits 3. Install docker locally4. Images vs Co…

CentOS7下如何安装Nginx

一、Ngxin是什么 Nginx是一个开源的 Web 服务器&#xff0c;具有反向代理、负载均衡、缓存等功能。它可以作为 HTTP 服务器&#xff0c;将服务器上的静态文件&#xff08;如 HTML、图片&#xff09;通过 HTTP 协议展现给客户端&#xff0c;也可以实现动静分离&#xff0c;把动态…

寒假9-蓝桥杯训练

//轨道炮 #include<iostream> using namespace std; #include<algorithm> int logs[100010]; int main() {int n;cin >> n;for (int i 1;i < n;i){cin >> logs[i];}sort(logs 1, logs n 1);int ans 1000000000;for (int i 2;i < n;i){if (…

{}初始化和初始化列表

C98标准中允许使用花括号对数组和自定义类型的变量进行初始化&#xff0c;C11扩展了大括号的用途&#xff0c;允许使用花括号对所有的内置类型和自定义类型进行初始化&#xff0c;使用时&#xff0c;可以加号&#xff0c;也可以不加。 对于自定义类型&#xff0c;当花括号中的常…

Obsidian Publish的开源替代品Perlite

前几天就有网友跟我说&#xff0c;freenom 的免费域名不可用了&#xff0c;10 号的时候老苏进后台看了一下&#xff0c;还有一半的域名显示为 ACTIVE&#xff0c;似乎是以 2024年6月 为限。但到 11 号&#xff0c;老苏发现博客 (https://laosu.cf) 已经访问不了了&#xff0c;这…

OpenMVG(EXIF、畸变、仿射特征、特征匹配)

本人之前也研究过OpenMVS但是对于OpenMVG只是原理层次的了解&#xff0c;因此乘着过年期间对这个库进行详细的学习。 目录 1 OpenMVG编译与简单测试 1.1 sfm_data.json获取 1.2 计算特征 2 OpenMVG整个流程的运行测试 3 OpenMVG实战 3.1 SVG绘制 3.2 解析图片的EXIF信息…

前沿重器[42] | self-RAG-大模型决策的典型案例探究

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

WordPress修改所有用户名并发送邮件通知的插件Easy Username Updater

前面跟大家介绍了『如何修改WordPress后台管理员用户名&#xff1f;推荐2种简单方法』一文&#xff0c;但是对于有很多用户的站长来说&#xff0c;操作有点复杂&#xff0c;而且无法发邮件通知对方&#xff0c;所以今天boke112百科向大家推荐一款可以直接在WordPress后台修改所…

关于Navicat导入sql文件后er图乱序问题

关于Navicat导入sql文件后er图乱序问题 具体操作如下&#xff1a; 点击左下角刷新旁边的小三角

Bootstrap学习三

Bootstrap学习三 文章目录 前言四、Bootstrap插件4.1. 插件概览4.1.1. data属性4.1.2. 编程方式的API4.1.3. 避免命名空间冲突4.1.4. 事件 4.2. 模态框4.2.1. 引入4.2.2. 基本结构4.2.3. 基本使用4.2.4. 触发模态框的方法 4.3. 下拉菜单和滚动监听4.3.1. 下拉菜单4.3.2. 滚动监…

第三节课[LangChain]作业

文章目录 前言实践搭建向量知识库 前言 本次作业虽然是第三节课作业&#xff0c;但是在第四次作业之后才完成&#xff0c;所以用的是经过自我认知微调的小助手权重。 使用**诡秘之主和宿命之环小说&#xff08;仅用于学习和研究&#xff09;**以及设定集、百度百科&#xff0c…