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

目录

介绍:

模板:

案例:

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

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

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

标准化处理:

公式:

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)


结果: 

 

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

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

相关文章

【图像分类】基于深度学习的人脸表情识别(8种表情,ResNet网络)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的兄弟们可以私信…

“洞见·智领未来——2024行业开局暨成渝(内江)服务外包产业发展大会”共商服务外包新未来新业态

3月19日-20日&#xff0c;由中国信息协会、中共内江市委、内江市人民政府指导&#xff0c;中国信息协会数字经济专委会、中共内江市东兴区委、内江市东兴区人民政府共同主办&#xff0c;鸿联九五集团、首席客户官百人会&#xff08;CCO100&#xff09;承办的“洞见 智领未来—…

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统&#xff0c;用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建&#xff0c;现已成为开源软件开发中最流行的版本控制系统&#xff0c;没有之一。Git允许多人同时在不同的分支上工作&…

opencv各个模块介绍(1)

Core 模块&#xff1a;核心模块&#xff0c;提供了基本的数据结构和功能。 常用的核心函数&#xff1a; cv::Mat&#xff1a;表示多维数组的数据结构&#xff0c;是OpenCV中最常用的类之一&#xff0c;用于存储图像数据和进行矩阵运算。 cv::Scalar&#xff1a;用于表示多通道…

mac下Appuim环境安装-持续更新中

参考资料 Mac安装Appium_mac电脑安装appium-CSDN博客 安卓测试工具&#xff1a;Appium 环境安装&#xff08;mac版本&#xff09;_安卓自动化测试mac环境搭建-CSDN博客 1. 基本环境依赖 1 node.js 2 JDK&#xff08;Java JDK&#xff09; 3 Android SDK 4 Appium&#x…

51单片机学习9 串口通讯

51单片机学习9 串口通讯 一、串口通讯简介UARTSTC89C51RC/RD的串口资源 二、51单片机串口介绍1. 内部结构2. 寄存器&#xff08;1&#xff09;串口控制寄存器SCON&#xff08;2&#xff09;电源控制寄存器PCON 3. 计算波特率4. 串口配置步骤 三、 开发示例1. 硬件电路2. 代码实…

好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化

好用的GPTs&#xff1a;指定主题搜索、爬虫、数据清洗、数据分析自动化 Scholar&#xff1a;搜索 YOLO小目标医学方面最新论文Scraper&#xff1a;爬虫自动化数据清洗数据分析 点击 Explore GPTs&#xff1a; Scholar&#xff1a;搜索 YOLO小目标医学方面最新论文 搜索 Scho…

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习&#xff0c;切勿用于非法犯罪活动&#xff0c;对于恶…

【计算机】——51单片机

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路&#xff08;IC芯片&#xff09; 单片机是单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;的简称&#xff0c;用于控制领域&#xff0c;所以又称为微型控制器&#xff08;Microcontroller U…

Eureka的介绍和作用,以及搭建

一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具&#xff0c;它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一&#xff0c;它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…

学成在线_视频处理_视频转码不成功

问题 当我们用xxljob进行视频处理中的转码操作时会发现视频转码不成功。即程序会进入下图所示的if语句内。 问题原因 在进行视频转码时程序会调用Mp4VideoUtil类下的 generateMp4方法&#xff0c;而result接收的正是该方法的返回值。那么什么时候generateMp4方法的返回值会…

SQLiteC/C++接口详细介绍sqlite3_stmt类(七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;六&#xff09; 下一篇&#xff1a; 无 22、sqlite3_column_database_name 用于返回结果集中指定列的数据库名称。如果结果集是由多个Join操作产生的&#xff0c;…

抖音视频关键词爬虫批量采集软件|视频提取下载工具

视频关键词批量采集软件 — 助力您快速获取所需视频 主要功能&#xff1a; 关键词批量提取视频和单独视频提取&#xff0c;提取后下载功能。 功能解析&#xff1a; 1. 关键词批量提取视频的解析 通过输入关键词进行视频搜索和提取。例如&#xff0c;输入“汽车配件”&#x…

四种最新算法(冠豪猪优化算法CPO、鳑鲏鱼优化算法BFO、河马优化算法HO、新雀优化算法NOA)求解机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

npm ERR! code ELIFECYCLE 解决办法

npm ERR! code ELIFECYCLE 解决办法 问题分析可能原因解决方法 问题 使用Vue脚手架构建项目的时候出现npm ERR! code ELIFECYCLE 分析可能原因 vue-cli-service 并没有加入到环境变量里 解决方法 ./node_modules/.bin/vue-cli-service serve

【Linux】多线程编程基础

&#x1f4bb;文章目录 &#x1f4c4;前言&#x1f33a;linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 &#x1f33b;linux线程冲突概念互斥锁函数介绍加锁的缺点 &#x1f4d3;总结 &#x1f4c4;前言 无论你是否为程序员&#xff0c;相信多线程这个词汇应…

MySQL之体系结构和基础管理

前言 本文以linux系统的MySQL为例详细介绍MySQL的体系结构&#xff0c;因为在实际生产环境中MySQL的运行环境都是linux系统。同时介绍MySQL的基础管理&#xff0c;包括用户管理和权限管理等。 MySQL体系结构 MySQL客户端/服务器工作模型 MySQL是C/S架构&#xff0c;工作模型…

Ribbon知识点

1、通过类实现重写Ribbon规则 1.1注意 这个类一定不能跟启动类放在同一个包下面&#xff0c;不能被componentScan给扫描到。 需要如图放置&#xff1a; 要是被componentScan给扫描到&#xff0c;则会被所有的服务提供方所共享&#xff0c;那么就不能实现指定服务用不同的Ribbo…

pycharm中的Mark Directory As 里的 Sources Root、Excluded...

这里主要提到两个文件夹的作用&#xff0c;分别是Sources Root、Excluded 1、Sources Root 1、场景 平时使用pycharm&#xff0c;有时出现导包问题&#xff0c;将那个目录Mark Directory as sources root&#xff0c;然后就可以正常运行代码了 2、原理 其实主要就是将那个目录…

官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会

摘要&#xff1a;本文整理自阿里云开源大数据平台徐榜江 (雪尽)&#xff0c;关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会&#xff0c;内容主要分为以下四部分&#xff1a; 1、Flink CDC 新仓库&#xff0c;新流程 2、Flink CDC 新定位&#xff0c;新玩法 3、Flin…