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

news2024/11/15 10:08:12

目录

介绍:

模板:

案例:

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

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

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

标准化处理:

公式:

Topsis(优劣解距离法):

公式:

完整代码:

结果:

介绍:

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

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

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

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

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

模板:

import numpy as np

def 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] + 1
    
    return 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|/M
        if ('Moderate' in name) == True:
            print("输入最佳值:")
            max = data_nor[columns_name[i + 1]].max()
            min = data_nor[columns_name[i + 1]].min()
            best=input()
            M=0
            for 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-min
            else:
                M=max-b
            #print(data_nor[columns_name[i + 1]][0])
            cnt=0
            for j in data_nor[columns_name[i + 1]]:
                if(j<int(a)):
                    data_nor[columns_name[i + 1]][cnt]=1-(a-j)/M
                elif (int(a)<= j <=int(b)):
                    data_nor[columns_name[i + 1]][cnt]=1
                elif (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.values
    data_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.values
    
    cnt=0
    for 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.values
    data_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 = file
    raw_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=0
            for 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-min
            else:
                M=max-b
            #print(data_nor[columns_name[i + 1]][0])
            cnt=0
            for j in data_nor[columns_name[i + 1]]:
                if(j<int(a)):
                    data_nor[columns_name[i + 1]][cnt]=1-(a-j)/M
                elif (int(a)<= j <=int(b)):
                    data_nor[columns_name[i + 1]][cnt]=1
                elif (j>b):
                    data_nor[columns_name[i + 1]][cnt]=1-(j-b)/M
                cnt+=1
            #print(data_nor[columns_name[i + 1]])

    # print(data_nor)
    return data_nor


def normalization(data_nor):
    data_nors = data_nor.values
    data_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.values

    cnt=0
    for 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.values
    n = 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.values
    for i in range((len(columns_name) - 1)):
        name = columns_name[i + 1]
        data_s[name] = data_s[name] * w[i]
    return data_s

def topsis(data):
    data_nor=data.copy()
    data_nor=data_nor.values
    data_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

if __name__ == "__main__":
     file = 'filepath'  # 声明数据文件地址
     data = read_data(file)  # 读取数据文件
     data_nor = data_normalization(data)  # 数据正向化,生成后的数据data_nor

     print("\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.coloradmin.cn/o/1535089.html

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

相关文章

低压MOS在无人机上的应用-REASUNOS瑞森半导体

一、前言 无人机的结构由机身、动力系统、飞行控制系统、链路系统、任务载荷等几个方面组成的。 无人机动力系统中的电机&#xff0c;俗称“马达”&#xff0c;是无人机的动力来源&#xff0c;无人机通过改变电机的转速来改变无人机的飞行状态。即改变每个电机的速度&#xf…

灵境矩阵:开启无代码写作新时代,AI智能平台引领创作潮流

灵境矩阵 “灵境杯”智能体创意大赛&#xff0c;瓜分百万超级奖励 在当今数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐渐渗透到我们生活的方方面面。从智能家居到自动驾驶&#xff0c;AI的应用领域不断扩大&#xff0c;而今天&#xff0c;我们…

在基于Android相机预览的CV应用程序中使用 OpenCL

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0在Android 开发简介 下一篇&#xff1a;在 MacOS 中安装 本指南旨在帮助您在基于 Android 相机预览的 CV 应用程序中使用 OpenCL ™。教程是为 Android Studio 20…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(1)

所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第1节 云原生架构产生背景 云原生&#xff08;Cloud Native&#xff09;是近几年云计算领域炙手可热的话题&#xff0c;云原生技术已成为驱动业务增长的重要引擎。同时&#xff0c;作为新型基础设施的重要支撑技术&…

DMHS同步之MYSQL to MYSQL

一、环境情况 二、源端及目的端安装MySQL&#xff0c;可参考网上资料&#xff0c;此处省略安装过程 三、目的端安装配置unixODBC 1.上传unixODBC-2.3.12.tar.gz包到/opt下 2.解压 cd /opt tar -zvxf unixODBC-2.3.12.tar.gz复制 3.安装 cd unixODBC-2.3.11 ./configure …

使用 React antd 的ProFormSelect组件 搜索查询 多选的写法

使用 React antd 的ProFormSelect组件 搜索查询 多选的写法 需求&#xff1a;需要一个搜索框&#xff0c;可以选择员工&#xff0c;&#xff08;员工人数多无法一次性获取&#xff0c;全部放入options中&#xff09;&#xff0c;所以需要使用搜索功能&#xff0c;而且是可以多…

WebXR实践——利用aframe框架浏览器展示全景图片

一、效果 话不多说&#xff0c;先上效果 二、代码 index.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>360&deg; Image</title><meta name"description" content"360&deg; Imag…

【QT入门】 Qt槽函数五种常用写法介绍

声明&#xff1a;该专栏为本人学习Qt知识点时候的笔记汇总&#xff0c;希望能给初学的朋友们一点帮助(加油&#xff01;) 往期回顾&#xff1a; 【QT入门】实现一个简单的图片查看软件-CSDN博客 【QT入门】图片查看软件(优化)-CSDN博客 【QT入门】 lambda表达式(函数)详解-CSDN…

odoo扩展导出pdf功能

1. 说明: odoo原生导出功能扩展导出pdf文件功能, 如有额外需求请联系博主 2. 版本说明: odoo版本: odoo15 其他odoo版本未进行测试,如有需要自行测试 3. 地址: 该补丁代码放在github仓库, 地址: https://github.com/YSL-Alpaca/odoo_export_pdf 4. 改补丁依赖于第三方软件wkh…

数学建模(灰色关联度 python代码 案例)

目录 介绍&#xff1a; 模板&#xff1a; 案例&#xff1a;哪些原因影响结婚率 数据标准化&#xff1a; 灰色关联度系数&#xff1a; 完整代码&#xff1a; 结果&#xff1a; 介绍&#xff1a; 灰色关联度是一种多指标综合评价方法&#xff0c;用于分析和评价不同指标之…

【MySQL】对表的相关操作(DDL)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

软件杯 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

AI助力生产制造质检,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建工业生产制造场景下的瓷砖瑕疵检测识别分析系统

瓷砖生产环节一般经过原材料混合研磨、脱水、压胚、喷墨印花、淋釉、烧制、抛光&#xff0c;最后进行质量检测和包装。得益于产业自动化的发展&#xff0c;目前生产环节已基本实现无人化。而质量检测环节仍大量依赖人工完成。一般来说&#xff0c;一条产线需要配数名质检工&…

塔楼VR火灾逃生应急安全教育突破了传统模式

城镇化的高速发展&#xff0c;给消防安全带来了严峻的挑战&#xff0c;尤其是人员密集的办公场所&#xff0c;如何预防火灾发生&#xff0c;学习火灾成因&#xff0c;减少火灾发生避免不必要的损失&#xff0c;成为安全应急科普的重中之重。 通过模拟真实的办公场所火灾场景&am…

JVM监控工具

JVM监控工具 jps 查看系统中运行的java进程id PS D:\practise\test> jps 22672 Jps 13688 RemoteMavenServer36 1068 14188 TestApplication PS D:\practise\test> jmap 用来查看进行内存信息&#xff0c;实例个数以及占用内存大小 jmap -histo 进程id PS D:\prac…

Python使用PaddleSpeech实现语音识别(ASR)、语音合成(TTS)

目录 安装 语音识别 补全标点 语音合成 参考 PaddleSpeech是百度飞桨开发的语音工具 安装 注意&#xff0c;PaddleSpeech不支持过高版本的Python&#xff0c;因为在高版本的Python中&#xff0c;飞桨不再提供paddle.fluid API。这里面我用的是Python3.7 需要通过3个pip…

华为北向网管NCE开发教程(5)打包org.omg.CosNotification找不到

1问题描述 在IDE中&#xff0c;代码能正常运行&#xff0c;但是打包的时候&#xff0c;会抱不到一些类 2问题原因 导入的本地包中&#xff0c;能在IDE中找到&#xff0c;但是在使用maven打包时&#xff0c;maven找不到这些依赖包 3解决办法 将依赖包通过maven安装到maven…

基于python+vue灾害应急救援平台flask-django-php-nodejs

灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;…

python银行柜台管理系统flask-django-php-nodejs

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低银行的运营人员成本&#xff0c;实现了银行柜台的标准化、制度化、程序化的管理&#xff0c;有效地防止了银行柜台的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确地查询…

Linux:Prometheus+Grafana+睿象云告警平台(3)

在上一章我进行了Prometheus和Grafana的基础搭建以及部署 Linux&#xff1a;Prometheus的源码包安装及操作&#xff08;2&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136855988?spm1001.2014.3001.5501 1.注册 在监控中必不可少的就是监控告警&am…