数学建模(熵权法 python代码 例子)

news2024/11/24 5:18:34

目录

介绍: 

模板:

例子:择偶

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

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

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

标准化处理:

公式:

熵权:

公式:

​​​完整代码:

结果:

介绍: 

熵权法是一种多属性决策方法,用于确定各个属性在决策中的重要程度。该方法的核心思想是通过计算属性的熵值,来评估属性的信息量和不确定性,进而确定属性的权重。

熵是信息论中的概念,表示一个随机变量的不确定性。在决策中,一个属性的熵越大,说明该属性对决策的贡献越大,因为它包含了更多的信息。熵权法通过计算属性的熵,然后将每个属性的熵除以总的熵,得到每个属性的权重。

具体步骤如下:

  1. 收集决策所涉及的属性数据。
  2. 计算每个属性的熵值,使用熵的计算公式:熵 = -Σ(p*log2(p)),其中p表示属性的概率。
  3. 计算所有属性的熵之和,得到总的熵。
  4. 计算每个属性的权重,使用该属性的熵除以总的熵。
  5. 最后可以根据属性的权重,进行决策或排序。

熵权法在多属性决策中具有一定的优势,能够考虑到不同属性的权重,提高决策的准确性和可靠性。但是,在实际应用中,需要注意属性数据的准确性和合理性,以及熵的计算方法的选择等问题。

 模板:

import numpy as np

# 定义计算熵的函数
def entropy(data):
    # 计算每个属性的概率
    prob = np.array(data) / np.sum(data)
    # 计算熵
    entropy = -np.sum(prob * np.log2(prob))
    return entropy

# 定义熵权法函数
def entropy_weight(data):
    # 计算每个属性的熵
    entropies = [entropy(column) for column in data.T]
    # 计算总的熵
    total_entropy = np.sum(entropies)
    # 计算每个属性的权重
    weights = [entropy / total_entropy for entropy in entropies]
    return weights

# 示例数据
data = np.array([[10, 20, 30, 40], [40, 30, 20, 10]])

# 计算权重
weights = entropy_weight(data)
print("属性权重:", weights)

例子:择偶

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

   # 公式: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

熵权:

公式:

# 定义计算熵权方法
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

 ​​​​完整代码:

#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()
            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

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)
     W = entropy_weight(data_nor)  # 计算熵权权重

     data_s = entropy_score(data, W)  # 计算赋权后的得分,使用原数据计算
     #data_nor_s = entropy_score(data_nor, W)

     print("\n权值:",W)
     print("\n赋权后的得分:")
     print(data_s)
     #print(data_nor_s)

结果: 

 

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

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

相关文章

【Web应用技术基础】HTML(4)——表单类的标签

目录 题目1&#xff1a;文本框 题目2&#xff1a;密码框 题目3&#xff1a;单选框 题目4&#xff1a;多选框 题目5&#xff1a;单选框选中 题目6&#xff1a;禁用disabled 题目7&#xff1a;lable标签 题目8&#xff1a;下拉框 题目9&#xff1a;textarea 题目10&…

【Java之老话常谈】学习Java可以用来做什么?

对于很多新手来说,刚开始接触Java会很迷惘,不知道Java可以做什么。其实Java 可以做的东西太多了,手机游戏、中间件、软件、网站,电脑游戏,以及现在流行的安卓手机app等,都是由java语言编写的。由于Java拥有很高的安全性、平台移植性等,所以受到广大程序员的喜爱。 java…

接口测试、postman、测试点提取【主】

接口测试是测试系统组件间接口的一种测试 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系 文章目录 HTTP接口 & Web Service接口RESTful接口…

ubuntu10.04 apache2.2开启tls1.2的支持,使现代的edge和firefox浏览器能正常访问https

最近发现自己ubuntu10.04服务器上的apache https无法通过win11上的edge和firefox浏览器访问&#xff0c;但xp下的ie6和ie8没有问题。 firefox的错误提示为“此网站可能不支持TLS 1.2协议,而这是Firefox支持的最低版本”。 经过检查发现&#xff1a; IE6访问https所需的版本是SS…

virtualBox镜像复制

镜像复制 有一个镜像后&#xff0c;图方便&#xff0c;想直接使用这个vdi文件&#xff0c;但vdi有个uuid值&#xff0c;同一个虚拟机中不能同时存在两个同样的uuid的介质的&#xff0c;普通的复制文件所得到的uuid是一样的 &#xff0c;所以需要用到自带的方法复制vdi文件&…

隐私计算实训营学习二:隐私计算开源如何助力数据要素流通

文章目录 一、数据要素流转与数据内外循环二、数据外循环中的信任焦虑三、数据要素流通对隐私计算的期望四、隐私计算开源助力数据要素流通 一、数据要素流转与数据内外循环 数据要素流转过程(从数据采集加工->到数据价值释放)&#xff1a; 链路主要包括采集、存储、加工、…

计算机网络面经-什么是IPv4和IPv6?

前言 Internet协议&#xff08;IP&#xff09;是为连接到Internet网络的每个设备分配的数字地址。它类似于电话号码&#xff0c;是一种独特的数字组合&#xff0c;允许用户与他人通信。IP地址主要有两个主要功能。首先&#xff0c;有了IP&#xff0c;用户能够在Internet上被识别…

JUnit5的条件测试、嵌套测试、重复测试

条件测试 JUnit5支持条件注解&#xff0c;根据布尔值判断是否执行测试。 自定义条件 EnabledIf和DisabledIf注解用来设置自定义条件&#xff0c;示例&#xff1a; Test EnabledIf("customCondition") void enabled() { // ... } Test DisabledIf("cust…

动态规划课堂6-----回文串问题

目录 引言&#xff1a; 例题1&#xff1a;回文子串 例题2&#xff1a;回文串分割IV 例题3&#xff1a;分割回文串II 例题4&#xff1a;最长回文子序列 例题5&#xff1a;让字符串成为回文串的最小插入次数 引言&#xff1a; 回文字符串 是正着读和倒过来读一样的字符串。…

Sora后时代文生视频的探索

一、写在前面 按常理&#xff0c;这里应该长篇大论地介绍一下Sora发布对各行业各方面产生的影响。不过&#xff0c;这类文章已经很多了&#xff0c;我们今天主要聊聊那些已经成熟的解决方案、那些已经可以“信手拈来”的成果&#xff0c;并以此为基础&#xff0c;看看Sora发布…

PHP全新美化广告横幅在线制作源码

源码简介 可以做网站的引流不需要安装上传就可以使用&#xff0c;在第一版基础上做了二次开发更加好用 注意&#xff1a;主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候,记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是…

用pdf2docx将PDF转换成word文档

pdf2docx是一个Python模块&#xff0c;可以将PDF文件转换为docx格式的Word文档。 pdf2docx模块基于Python的pdfminer和python-docx库开发&#xff0c;可以在Windows、Linux和Mac系统上运行。它可以从PDF文件中提取文本和图片&#xff0c;并将其转换成可编辑的Word文档&#xf…

手撕算法-二叉搜索树与双向链表

牛客BM30。 描述&#xff1a;https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId295&tqId23253&ru/exam/oj&qru/ta/format-top101/question-ranking&sourceUrl%2Fexam%2Foj分析&#xff1a;二叉搜索树的中序遍历是递增序列。可以利用…

相聚武汉氢能展_2024武汉国际氢能源及燃料电池产业博览会

相聚武汉氢能展_2024武汉国际氢能源及燃料电池产业博览会 2024武汉国际氢能源及燃料电池产业博览会 2024 Wuhan International Hydrogen Energy and Fuel Cell Industry Expo 同期举办&#xff1a;2024世界汽车制造技术暨智能装备博览会 时间&#xff1a;2024.8.14-16 地…

【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目

本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C算法&#xff1a;滑动窗口总结 多重背包 LeetCode2902. 和带限制的子多重集合的数目 给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。 请你…

拷贝他人maven仓库jar包到自己本地仓库,加载maven依然提示无法下载对应依赖

所遇问题&#xff1a; 拷贝他人maven仓库jar包到自己本地maven仓库repository下的对应依赖位置&#xff0c;重新加载idea的maven依然提示无法下载对应依赖。 解决办法&#xff1a; 在maven->repository找到对应报错依赖路径&#xff0c;删除xxx.repositories 和 xxx.lastU…

记录开发STM32遇到的卡死问题-串口

背景&#xff1a;以STM32作为主控&#xff0c;广州大彩显示屏显示&#xff0c;主控实时采集数据&#xff0c;串口波特率115200.设置收发频率为50Hz&#xff0c;即单片机每秒发送50帧数据&#xff0c;每秒接收50帧数据&#xff0c;每帧数据大概14字节。 问题&#xff1a;系统长…

Beamer模板——基于LaTeX制作学术PPT

Beamer模板——基于LaTeX制作学术PPT 介绍Beamer的基本使用安装和编译用于学术汇报的模板项目代码模板效果图 Beamer的高级特性动态效果分栏布局定理环境 介绍 在学术领域&#xff0c;演示文稿是展示和讨论研究成果的重要方式。传统的PowerPoint虽然方便&#xff0c;但在处理复…

C#中右键通过listview来控制datagridview字段值的是否显示、显示顺序,并存储到XML中。

最终显示效果&#xff0c;如下图所示&#xff1a; datagridview开始显示通过调用XML存储的字段值及顺序来显示&#xff0c;右键调出Tools来控制显示的顺序及是否显示&#xff0c;通过加号和减号进行调整顺序。 XML存储字段值及顺序 主要代码及事件&#xff1a; 获取datagridv…

SG5032VAN差分晶振X1G004261001100专用于5G通讯设备

差分晶体振荡器(DXO)是目前行业中公认高技术&#xff0c;高要求的一款晶体振荡器&#xff0c;是指输出差分信号使用2种相位彼此完全相反的信号,从而消除了共模噪声,并产生一个更高性能的系统。差分晶振一般为六脚贴片晶振&#xff0c;输出类型分为好几种,LVDS&#xff0c;LV-PE…