数学建模--Topsis评价方法的Python实现

news2024/11/27 8:36:53

目录

1.算法流程简介

2.算法核心代码

3.算法效果展示

1.算法流程简介

"""
TOPSIS(综合评价方法):主要是根据根据各测评对象与理想目标的接近程度进行排序.
然后在现有研究对象中进行相对优劣评价。
其基本原理就是求解计算各评价对象与最优解和最劣解的距离来进行排序.
如果过评价对象最靠近最优解同时又最远离最劣解,则为最优;否则不是最优。
这样的评价方法需要多次统一标准,所以要求我们掌握正向化的求解方法.
"""

2.算法核心代码

"""
Question1:
  现给予你20组有关水质特征的值,分别是含氧量  PH值  细菌总数  植物性营养物量四个参数,请你根据
Topsis方法将20条河流的水质进行对应的评价!
"""
#Topsis综合评价法
import numpy as np
import matplotlib.pyplot as plt
"""
输入评价数据
20个评价数据包含了含氧量  PH值  细菌总数  植物性营养物量四个参数

"""
data=np.array([[4.69, 6.59, 51, 11.94],
        [2.03, 7.86, 19, 6.46],
        [9.11, 6.31, 46, 8.91],
        [8.61, 7.05, 46, 26.43],
        [7.13, 6.5, 50, 23.57],
        [2.39, 6.77, 38, 24.62],
        [7.69, 6.79, 38, 6.01],
        [9.3, 6.81, 27, 31.57],
        [5.45, 7.62, 5, 18.46],
        [6.19, 7.27, 17, 7.51],
        [7.93, 7.53, 9, 6.52],
        [4.4, 7.28, 17, 25.3],
        [7.46, 8.24, 23, 14.42],
        [2.01, 5.55, 47, 26.31],
        [2.04, 6.4, 23, 17.91],
        [7.73, 6.14, 52, 15.72],
        [6.35, 7.58, 25, 29.46],
        [8.29, 8.41, 39, 12.02],
        [3.54, 7.27, 54, 3.16],
        [7.44, 6.26, 8, 28.41]
    ])
#区分指标的性质并且进行正向化处理
"""
一般来说,数据指标分为4种形式:
1.极大值型:越大越好,比如利润
2.极小值型:越小越好,比如死亡数
3.中间值型:越趋近于某一个数越好,比如PH
4.区间值型:越趋近于某一个区间越好
##常见的转化公式
极大值型:x-x_min
极小值型:x_max-x
区间值型:在区间中为1,大于区间:1-(x-r)/M 小于区间:1-(l-x)/M
"""
# 定义position接收需要进行正向化处理的列
position = np.array([1, 2, 3])
# 定义处理类型:1 - > 极小型  2 - > 中间型  3 - > 区间型
Type = np.array([2, 1, 3])
# 定义正向化函数
def positivization(x:np.array,pos:int,type:int)->np.array:
    if type==1:#极小型值
        x=x.max()-x
    elif type==2:
        best=7#此处可以修改
        M=np.max(np.abs(x-best))
        x=1-np.abs(x-best)/M
    else:#区间值型:在区间中为1,大于区间:1-(x-r)/M 小于区间:1-(l-x)/M
        l=10#区间左端
        r=20#区间右端
        M0=max(l-x.min(),x.max()-r)
        x=np.where(x<l,1-(l-x)/M0,x)
        x=np.where(x>r,1-(x-r)/M0,x)
        x=np.where(x>l,1,x)
    return x
for i in range(len(position)):

    data[:, position[i]] = positivization(data[:, position[i]], position[i], Type[i])
#矩阵标准化求解
"""
已经正向化后,我们就能够进行矩阵的标准化求解了
把标准化的矩阵记作Z,对于每一个z(i,j)都有:
z(i,j)=x(i,j)/sqrt(sum(x(i,j)*x(i,j)))
"""
Z = data / np.sum(data * data, axis=0) ** 0.5
"""
计算得分并且归一化
"""
max_grd=np.max(Z)
min_grd=np.min(Z)
max_dist = np.sum((max_grd - Z) * (max_grd - Z), axis=1) ** 0.5
min_dist = np.sum((min_grd - Z) * (min_grd - Z), axis=1) ** 0.5
#最终得分
final_score = (min_dist / (max_dist + min_dist))
#归一化处理并且保留精度
final_score /= np.sum(final_score)
final_score = np.around(final_score, decimals=3) 
print("评级结果为一分制")
print("**********************************************************************")
for i in range(len(final_score)):
    print("第{}条河流的Topsis评价得分为:".format(i+1),final_score[i])
print("**********************************************************************")
#绘制可视化图片
number=20#根据数据的个数进行修改即可
x = np.arange(number) 
colors=['red','black','peru','orchid','deepskyblue', 'orange', 'green', 'pink', 'rosybrown', 'gold', 'lightsteelblue', 'teal']
x_label = [chr(i) for i in range(65,65+number)]#表示成A,B,C,......Z
#绘制可视化图
plt.figure(figsize=(12, 8))
plt.xticks(x, x_label) 
#绘制条形统计图
plt.bar(x, final_score,color=colors) 
#设置网格刻度
plt.grid(True,linestyle=':',color='b',alpha=0.6)
plt.title("TOPSIS's Score Figure")
#在柱状图上绘制数据
for xx, yy in zip(x, final_score):
    plt.text(xx, yy + 0.001, str(yy), ha='center')
plt.savefig('C:\\Users\\Zeng Zhong Yan\\Desktop\\TOPSIS Score Figure.png', dpi=500, bbox_inches='tight')
plt.show()

3.算法效果展示

 

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

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

相关文章

文字验证码:简单有效的账号安全守卫!

前言 文字验证码不仅是一种简单易懂的验证方式&#xff0c;同时也是保护您的账号安全的重要工具。通过输入正确的文字组合&#xff0c;您可以有效地确认自己的身份&#xff0c;确保只有真正的用户才能访问您的账号。 HTML代码 <script src"https://cdn6.kgcaptcha.…

rust编译出错:error: failed to run custom build command for `ring v0.16.20`

安装 Visual Studio&#xff0c;确保选择 —.NET 桌面开发、使用 C 的桌面开发和通用 Windows 平台开发。显示已安装的工具链rustup show。然后通过运行更改和设置工具链rustup default stable-x86_64-pc-windows-msvc。 另外是想用clion进行调试rust 需要你按下面配置即可解…

【Spring MVC】统一功能处理

一、登录验证 登录验证通过拦截器实现&#xff0c;拦截器就是在用户访问服务器时&#xff0c;预先拦截检查一下用户的访问请求。 没有拦截器时&#xff0c;用户访问服务器的流程是&#xff1a;用户–>controller–>service–>Mapper。有拦截器时&#xff0c;用户访问…

自旋锁和读写锁

目录 一、自旋锁 1.自旋锁和挂起等待锁 2.自旋锁的接口 二、读写锁 1.读者写者模型与读写锁 2.读写锁接口 3.加锁的原理 4.读写优先级 一、自旋锁 1.自旋锁和挂起等待锁 互斥锁的类型有很多&#xff0c;我们之前使用的锁实际上是互斥锁中的挂起等待锁。互斥锁比较有代…

JMeter(三十九):selenium怪异的UI自动化测试组合

文章目录 一、背景二、JMeter+selenium使用过程三、总结一、背景 题主多年前在某社区看到有人使用jmeter+selenium做UI自动化测试的时候,感觉很是诧异、怪异,为啥?众所周知在python/java+selenium+testng/pytest这样的组合框架下,为啥要选择jmeter这个东西[本身定位是接口测…

基于微信小程序的智能垃圾分类回收系统,附源码、教程

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 1 简介 视频演示地址&#xff1a; 基于微信小程序的智能垃圾分类回收系统&#xff0c;可作为毕业设计 小…

《C++ Primer》第2章 变量(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 2.1 基本内置类型&#xff08;P30&#xff09; C 定义的基本类型包括算术类型&#xff08;arithmetic type&#xff09;和空类型&#xff08;void&#xff09;&#xff0c;其中算术类型包括字符、整型、布尔…

postgresql-类型转换函数

postgresql-类型转换函数 简介CAST 函数to_date函数to_timestampto_charto_number隐式类型转换 简介 类型转换函数用于将数据从一种类型转换为另一种类型。 CAST 函数 CAST ( expr AS data_type )函数用于将 expr 转换为 data_type 数据类型&#xff1b;PostgreSQL 类型转 换…

《86盒应用于家居中控》——实现智能家居的灵动掌控

近年来&#xff0c;智能家居产品受到越来越多消费者的关注&#xff0c;其便捷、舒适的生活方式让人们对未来生活充满期待。作为智能家居方案领域的方案商&#xff0c;启明智显生产设计的86盒凭借出色的性能和良好的用户体验&#xff0c;成功应用于家居中控系统&#xff0c;让家…

Gof23设计模式之策略模式

1.概述 该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&#xff0c;…

剑指 Offer 43. 1~n 整数中 1 出现的次数(困难)

题目&#xff1a; class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong long mulk 1;int…

Text Workflow for Mac,简单易用的文本转换工具

如果你需要一个能够将文本转换成多种语言和文件格式的工具&#xff0c;那么Text Workflow for Mac将是你的不二之选。 这个软件支持多种语言翻译和多种文件格式转换&#xff0c;让你可以轻松地将文本转换成你需要的形式。而且&#xff0c;它的操作非常简单&#xff0c;只需要几…

精讲算法的时间复杂度

目录 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 1.2算法的复杂度 二、时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.常见时间复杂度的计算举例 三、空间复杂度 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 long long Fib(int N) {if(N <…

Day6:浅谈useState

「目标」: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 Day6-今日话题 谈谈react hooks中的useState &#xff0c;将从以下七个角度介绍&#xff1a; 用法 参数 返回值 作用 工作原理 优缺点 注意点 用法 useState 是一个函数&a…

Hugging News #0904: 登陆 AWS Marketplace

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

VMware虚拟机安装CentOS7设置静态ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33修改BOOTPROTO的值为static 增加最后那四项&#xff0c;参数在编辑&#xff0c;虚拟网络编辑器里面看

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像&#xff0c;但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…

手写bind方法

<script>/** 手写bind方法* */Function.prototype.myBind function (thisArg, ...args) {return (...newArgs) > {return this.call(thisArg, ...args, ...newArgs)}}const obj {name: zs,age: 18,}function fn (a, b, c) {console.log(this)console.log(a b c)re…

《数据出境安全评估办法》解读

一、数据出境的统一评估体系正式确立 自我国《网络安全法》规定了关键信息基础设施运营者的重要数据与个人信息出境评估制度后&#xff0c;至今历时五年&#xff0c;关于数据出境及个人信息出境安全评估的立法体例、评估机制一直在探索过程中。 其后&#xff0c;国家互联网信…

PYTHON知识点学习-字典

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由 Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…