数学建模(Topsis python代码 案例)

目录

介绍:

模板:

案例:

极小型指标转化为极大型(正向化):

中间型指标转为极大型(正向化):

区间型指标转为极大型(正向化):

标准化处理:

公式:

Topsis(优劣解距离法):

公式:

完整代码:

结果:

介绍:

在数学建模中,Topsis方法是一种多准则决策分析方法,用于评估和排序备选方案。它代表了“最佳方案相似性排序技术”。

在Topsis方法中,每个备选方案根据一组准则进行评估,并分配权重,以反映它们的相对重要性。然后,该方法根据每个备选方案与理想解和负理想解之间的差异计算两个度量值:到理想解的距离和到负理想解的距离。

理想解代表了每个准则的最佳可能值,而负理想解则代表了最差可能值。这些距离度量值使用一个公式计算,考虑了备选方案与这两个参考点之间差异的加权总和。

一旦计算出距离,Topsis根据备选方案与理想解的接近度对其进行排序。与理想解最接近且与负理想解最远的备选方案被视为最佳选择。

Topsis方法常用于需要考虑多个准则的决策情景中,例如选择供应商、评估项目或选择最佳行动方案。它帮助决策者客观地评估和比较备选方案,同时考虑到每个选项的正面和负面因素。

模板:

import numpy as npdef topsis(data, weights, impacts):# 数据归一化normalized_data = data / np.sqrt(np.sum(data**2, axis=0))# 加权归一化数据weighted_normalized_data = normalized_data * weights# 理想解和负理想解ideal_solution = np.max(weighted_normalized_data, axis=0)negative_ideal_solution = np.min(weighted_normalized_data, axis=0)# 计算备选方案与理想解和负理想解的距离distances = np.sqrt(np.sum((weighted_normalized_data - ideal_solution)**2, axis=1)) / \np.sqrt(np.sum((weighted_normalized_data - negative_ideal_solution)**2, axis=1))# 考虑权重和影响的得分scores = np.sum(weights * impacts * normalized_data, axis=1)# 综合得分comprehensive_scores = scores / (scores + distances)# 排序并返回结果rankings = np.argsort(comprehensive_scores)[::-1] + 1return rankings# 例子
data = np.array([[3, 2, 5, 4],[4, 1, 2, 8],[1, 3, 4, 6],[2, 4, 3, 5]])weights = np.array([0.25, 0.25, 0.25, 0.25])
impacts = np.array([1, 1, -1, 1])rankings = topsis(data, weights, impacts)
print(rankings)

案例:

极小型指标转化为极大型(正向化):

   # 公式:max-x if ('Negative' in name) == True:max0 = data_nor[columns_name[i + 1]].max()#取最大值data_nor[columns_name[i + 1]] = (max0 - data_nor[columns_name[i + 1]])  # 正向化# print(data_nor[columns_name[i+1]])

中间型指标转为极大型(正向化):

 # 中间型指标正向化 公式:M=max{|xi-best|}  xi=1-|xi-best|/Mif ('Moderate' in name) == True:print("输入最佳值:")max = data_nor[columns_name[i + 1]].max()min = data_nor[columns_name[i + 1]].min()best=input()M=0for j in data_nor[columns_name[i + 1]]:if(M<abs(j-int(best))):M=(abs(j-int(best)))data_nor[columns_name[i + 1]]=1-(abs(data_nor[columns_name[i + 1]]-int(best))/M)#print(data_nor[columns_name[i + 1]])

区间型指标转为极大型(正向化):

# 区间型指标正向化if('Section' in name)==True:print()print("输入区间:")a=input()b=input()a=int(a)b=int(b)max = data_nor[columns_name[i + 1]].max()min= data_nor[columns_name[i + 1]].min()if(a-min>max-b):M=a-minelse:M=max-b#print(data_nor[columns_name[i + 1]][0])cnt=0for j in data_nor[columns_name[i + 1]]:if(j<int(a)):data_nor[columns_name[i + 1]][cnt]=1-(a-j)/Melif (int(a)<= j <=int(b)):data_nor[columns_name[i + 1]][cnt]=1elif (j>b):data_nor[columns_name[i + 1]][cnt]=1-(j-b)/M#print(data_nor[columns_name[i + 1]][cnt])cnt+=1#print(data_nor[columns_name[i + 1]])'''公式:
M = max{a-min{xi},max{xi}-b}  xi<a,则xi=1-(a-xi)/M; a<=xi<=b,则xi=1; xi>b,则1-(xi-b)/M
'''

标准化处理:

公式:

def normalization(data_nor):data_nors = data_nor.valuesdata_nors = np.delete(data_nors, 0, axis=1)#去掉第一行squere_A = data_nors * data_nors#矩阵相乘# print(squere_A)sum_A = np.sum(squere_A, axis=0)#按列求和sum_A = sum_A.astype(float)stand_A = np.sqrt(sum_A)#平方根columns_name = data_nor.columns.valuescnt=0for i in columns_name[1:]:#print(data_nor[i])data_nor[i]=data_nor[i]/stand_A[cnt]cnt+=1#print(data_nor)return data_nor

Topsis(优劣解距离法):

公式:

 

def topsis(data):data_nor=data.copy()data_nor=data_nor.valuesdata_nor = np.delete(data_nor, 0, axis=1)z_max=np.amax(data_nor,axis=0)#每个特征里面挑最大值z_min=np.amin(data_nor,axis=0)#每个特征里面挑最小值#print(z_min)#print(z_max)tmpmaxdist=np.power(np.sum(np.power((z_max-data_nor),2),axis=1),0.5)#最大距离tmpmindist=np.power(np.sum(np.power((z_min-data_nor),2),axis=1),0.5)#最小距离score=tmpmindist/(tmpmindist+tmpmaxdist)#定义得分score = score/np.sum(score)#归一化return  score

完整代码:

#coding=gbk
import pandas as pd
import numpy as np
import re
import warnings# 定义文件读取方法
def read_data(file):file_path = fileraw_data = pd.read_excel(file_path, header=0)# print(raw_data)return raw_data# 定义数据正向化
def data_normalization(data):data_nor = data.copy()columns_name = data_nor.columns.values#print(columns_name)for i in range((len(columns_name) - 1)):name = columns_name[i + 1]print("输入这一类数据类型(Positive、Negative、Moderate、Section:)")name=input()# 极小型指标正向化if ('Negative' in name) == True:max0 = data_nor[columns_name[i + 1]].max()#取最大值data_nor[columns_name[i + 1]] = (max0 - data_nor[columns_name[i + 1]])  # 正向化# print(data_nor[columns_name[i+1]])# 中间型指标正向化if ('Moderate' in name) == True:print("输入最佳值:")max = data_nor[columns_name[i + 1]].max()#取最大值min = data_nor[columns_name[i + 1]].min()#取最小值best=input()best=int(float(best))M=0for j in data_nor[columns_name[i + 1]]:if(M<abs(j-int(best))):M=(abs(j-int(best)))data_nor[columns_name[i + 1]]=1-(abs(data_nor[columns_name[i + 1]]-int(best))/M)#print(data_nor[columns_name[i + 1]])# 区间型指标正向化if('Section' in name)==True:print("输入区间:")a=input()b=input()a=int(a)b=int(b)max = data_nor[columns_name[i + 1]].max()min= data_nor[columns_name[i + 1]].min()if(a-min>max-b):M=a-minelse:M=max-b#print(data_nor[columns_name[i + 1]][0])cnt=0for j in data_nor[columns_name[i + 1]]:if(j<int(a)):data_nor[columns_name[i + 1]][cnt]=1-(a-j)/Melif (int(a)<= j <=int(b)):data_nor[columns_name[i + 1]][cnt]=1elif (j>b):data_nor[columns_name[i + 1]][cnt]=1-(j-b)/Mcnt+=1#print(data_nor[columns_name[i + 1]])# print(data_nor)return data_nordef normalization(data_nor):data_nors = data_nor.valuesdata_nors = np.delete(data_nors, 0, axis=1)squere_A = data_nors * data_nors#矩阵相乘# print(squere_A)sum_A = np.sum(squere_A, axis=0)#按列求和sum_A = sum_A.astype(float)stand_A = np.sqrt(sum_A)#开平方columns_name = data_nor.columns.valuescnt=0for i in columns_name[1:]:data_nor[i]=data_nor[i]/stand_A[cnt]#每个元素除以相对应的平方根cnt+=1#print(data_nor)return data_nor# 定义计算熵权方法
def entropy_weight(data_nor):columns_name = data_nor.columns.valuesn = data_nor.shape[0]E = []for i in columns_name[1:]:# 计算信息熵# print(i)data_nor[i] = data_nor[i] / sum(data_nor[i])data_nor[i] = data_nor[i] * np.log(data_nor[i])data_nor[i] = data_nor[i].where(data_nor[i].notnull(), 0)# print(data_nor[i])Ei = (-1) / (np.log(n)) * sum(data_nor[i])E.append(Ei)# print(E)# 计算权重W = []for i in E:wi = (1 - i) / ((len(columns_name) - 1) - sum(E))W.append(wi)# print(W)return W# 计算得分
def entropy_score(data, w):data_s = data.copy()columns_name = data_s.columns.valuesfor i in range((len(columns_name) - 1)):name = columns_name[i + 1]data_s[name] = data_s[name] * w[i]return data_sdef topsis(data):data_nor=data.copy()data_nor=data_nor.valuesdata_nor = np.delete(data_nor, 0, axis=1)z_max=np.amax(data_nor,axis=0)#每个特征里面挑最大值z_min=np.amin(data_nor,axis=0)#每个特征里面挑最小值#print(z_min)#print(z_max)tmpmaxdist=np.power(np.sum(np.power((z_max-data_nor),2),axis=1),0.5)#最大距离tmpmindist=np.power(np.sum(np.power((z_min-data_nor),2),axis=1),0.5)#最小距离score=tmpmindist/(tmpmindist+tmpmaxdist)#定义得分score = score/np.sum(score)#归一化return  scoreif __name__ == "__main__":file = 'filepath'  # 声明数据文件地址data = read_data(file)  # 读取数据文件data_nor = data_normalization(data)  # 数据正向化,生成后的数据data_norprint("\n正向化后的数据:")print(data_nor)data_nor=normalization(data_nor)print("\n标准化后的数据:")print(data_nor)score=topsis(data_nor)print("\n得分:")print(score)score=pd.DataFrame(score)score.columns=["得分"]data=pd.DataFrame(data)data=pd.concat([data,score],axis=1)print(data)

结果: 

 

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

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

相关文章

RequestResponse使用

文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法&#xff08;1&#xff09;、请求行&#xff08;2&#xff09;、请求头&#xff08;3&#xff09;、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…

WEB 表单练习题

任务如图&#xff1a; <html><head><meta charest"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><body><table width"…

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

算法沉淀——贪心算法七(leetcode真题剖析)

算法沉淀——贪心算法七 01.整数替换02.俄罗斯套娃信封问题03.可被三整除的最大和04.距离相等的条形码05.重构字符串 01.整数替换 题目链接&#xff1a;https://leetcode.cn/problems/integer-replacement/ 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果…

数据结构:堆的创建和使用

上一期我们学习了树和二叉树的定义&#xff0c;其中我们了解到了两种特殊的二叉树&#xff1a;满二叉树和完全二叉树。 今天我们还要学习一种新的结构&#xff1a;堆 那这种结构和二叉树有什么联系呢&#xff1f;&#xff1f;&#xff1f; 通过观察我们可以发现&#xff0c;…

鸿蒙一次开发,多端部署(三)应用UX设计原则

设计原则 当为多种不同的设备开发应用时&#xff0c;有如下设计原则&#xff1a; 差异性 充分了解所要支持的设备&#xff0c;包括屏幕尺寸、交互方式、使用场景、用户人群等&#xff0c;对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外&#xff0c;还…

C# 读取二维数组集合输出到Word预设表格

目录 应用场景 设计约定 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 DataSet转二维数组 导出写入WORD表格 调用举例 小结 应用场景 存储或导出个人WORD版简历是招聘应用系统中的常用功能&#xff0c;我们通常会通过应用系统采集用户的个人简历信息…

云主机搭建与服务软件部署

文章目录 登录访问云电脑与云电脑传输文件配置ssh服务ssh连接云电脑使用scp传输文件云端服务软件部署与实现外部访问首先购买云主机,以阿里云服务器 ECS为例子,官网购买就行了,选择默认安装了windows server 2022服务器系统 登录访问云电脑 购买完成进入控制台,能看到创建…

使用CUDA 为Tegra构建OpenCV

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 下一篇&#xff1a;在iOS中安装 警告&#xff1a; 本教程可能包含过时的信息。 使用CUDA for Tegra 的OpenCV 本文档是构建支持 CUD…

谷歌具身智能最新进展:RT-H 机器人通用灵巧抓取

随着 GPT-4 等大型语言模型与机器人研究的结合愈发紧密&#xff0c;人工智能正在越来越多地走向现实世界&#xff0c;因此具身智能相关的研究也正受到越来越多的关注。在众多研究项目中&#xff0c;谷歌的「RT」系列机器人始终走在前沿&#xff08;参见《大模型正在重构机器人&…

各位老板,你需要的工厂数字孪生可视化库在这

各位老板是不是很喜欢下面这种有逼格的大屏,下面介绍一下怎么实现的,保证有所收获。 Cesium是一个开源的WebGL JavaScript库&#xff0c;用于创建高性能的三维地球、地图和虚拟环境。它支持在浏览器中实现高质量的地球模拟&#xff0c;同时提供了丰富的功能特点&#xff0c;使得…

k8s系列之十五 Istio 部署Bookinfo 应用

Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖&#xff0c;但是构成了一个有代表性的服务网格的例子&#xff1a;它由多个服务、多个语言构成&#xff0c;并且 reviews 服务具有多个版本。 该应用由四个单独的微服务构成。 这个应用模仿在线书…

模板高级使用(非类型模板参数,特化,分离编译)

文章目录 模板没有实例化取内嵌类型报错问题非类型模板参数模板的特化函数模板的特化类模板的特化1.全特化2.偏特化 模板的分离编译 模板没有实例化取内嵌类型报错问题 首先在这里分享一个模板的常见报错问题。就是模板的在没有实例化的情况下去取模板类里面的内嵌类型这时候的…

代码随想录|Day25|回溯05|491.非递减子序列、46.全排列、47.全排列II

491. 非递减子序列 本题并不能像 90.子集II 那样&#xff0c;使用排序进行树层去重。虽然题目没有明确不能排序&#xff0c;但如果排序了&#xff0c;集合本身就是递增子序列&#xff0c;这是LeetCode示例2中没有出现的。 所以本题的关键在于&#xff0c;如何在不排序的情况下对…

2024格行VS华为VS飞猫哪个是最值得购买随身WiFi?中兴随身WiFi好用吗?

经常出差旅行&#xff0c;或者户外工作的朋友因为长期在外&#xff0c;手机流量经常不够用&#xff0c;想必都是随身WiFi的忠实用户&#xff0c;但是也都被这款产品割韭菜割的头皮发麻。今天&#xff0c;我们统计了市面上最靠谱的、最热销、口碑最好的几款随身WiFi。排名依据来…

Java学习笔记(17)

集合进阶 单列集合 Collection List set Add clear remove contains isempty size Add方法可能也会添加失败 同理&#xff0c;可能删除失败 Contains细节 为什么要重写equals&#xff1f; 因为contains底层用的是object类中的equals方法&#xff0c;比较的是地址值&#xf…

为什么穷人什么都懂,就是不懂赚钱?2024金矿项目! 2024创业好项目 !2024创业新项目新商机! 2024超级机会

为什么穷人什么都懂&#xff0c;就是不懂赚钱&#xff1f;有位网友是这么说的&#xff0c;穷人的思维有一个致命的缺陷&#xff0c;就是追求确定性&#xff0c;进而失去了可能性。而赚钱的真相实际上非常残酷。世界上能够赚钱的事情必定是不确定的&#xff0c;能够赚取巨额财富…

万亿参数GPU!算力提升30倍!英伟达新核弹B200重磅发布!

关注文章底部的公众号,获取每日AI资讯 前沿 3月18日-21日期间,英伟达在美国圣何塞召开GTC大会。创始人黄仁勋也在GTC大会上,做了一场长达两小时的开幕演讲,展示了其在AI芯片、机器人、汽车等领域的最新研发成果和技术进展,号称让全世界用上AI。 全球头号人工智能领域开发…

算法第三十一天-直方图的水量

直方图的水量 题目要求 解题思路 使用面向列的计算比面向行的计算更加容易。我们只需要考虑当前的位置的左右最高模板的高度。 方法一、暴力解法 每个位置能接到多少雨水&#xff0c;很容易想到[木桶效应]&#xff0c;即是由两边最短的木板限制的。那么直观思路就是&#x…

扶贫惠农推介系统|基于jsp技术+ Mysql+Java+ B/S结构的扶贫惠农推介系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…