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

目录

介绍: 

模板:

例子:择偶

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

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

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

标准化处理:

公式:

熵权:

公式:

​​​完整代码:

结果:

介绍: 

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

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

具体步骤如下:

  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|/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

熵权:

公式:

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

 ​​​​完整代码:

#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()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_sif __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)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.rhkb.cn/news/280549.html

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

相关文章

【Spring Cloud】微服务通信概述

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助播出 目录 前言 1. Dubbo&#xff08;Spring Cloud Alibaba&#xff09;和 Spring Cloud 的适…

python爬虫基础实验:通过DBLP数据库获取数据挖掘顶会KDD在2023年的论文收录和相关作者信息

Task1 读取网站主页整个页面的 html 内容并解码为文本串&#xff08;可使用urllib.request的相应方法&#xff09;&#xff0c;将其以UTF-8编码格式写入page.txt文件。 Code1 import urllib.requestwith urllib.request.urlopen(https://dblp.dagstuhl.de/db/conf/kdd/kdd202…

联想笔记本的声音键没有反应怎么办?

如果我的联想笔记本电脑上的声音按钮没有响应&#xff0c;该怎么办&#xff1f; 如果我的联想笔记本电脑上的声音按钮没有响应&#xff0c;该怎么办&#xff1f; 按下按钮后我无法控制声音。 我该怎么办&#xff1f; 以下是我为您整理的关于联想笔记本声音按键无反应的相关资料…

Python 解析json文件 使用Plotly绘制地理散点图

目录 0、任务说明 1、解析json文件 2、使用Plotly绘制地理散点图 2.1 函数scatter_geo介绍 2.2 官方示例 3、根据json文件数据&#xff0c;准备绘制地理散点图的‘数据结构’ 4、完整代码及运行效果 0、任务说明 json文件中存放了关于地震的地理信息。 使用plotly模块…

练习 9 Web [SUCTF 2019]CheckIn (未拿到flag)

上传图片格式的木马文件&#xff1a; 返回 <? in contents!,存在PHP代码检测 上传非图片格式文件&#xff1a; 返回 不允许非image 修改木马PHP代码规避检测 <? ?> 改为 < script language“php”>< /script ><?php eval($_POST[shell]);?>…

初始Java篇(JavaSE基础语法)(3)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 方法的使用 方法定义 实参和形参的关系 方法重载 方法签名 递归 方法的使用 方法就是一个代码片段. 类似于 C 语言中的 "函数"…

华为openEuler系统卸载jdk

华为openEuler系统卸载jdk 1.查看openEuler上已安装的 Java 版本&#xff1a; 在终端中运行以下命令&#xff0c;查看系统中已经安装的 Java 版本。 sudo alternatives --config java这将列出已安装的 Java 版本&#xff0c;你可以看到当前使用的是哪个版本 2.卸载 Java&am…

git如何在某个commitId的状态提交到一个分支

有些时候&#xff0c;我们在使用子仓库&#xff0c;或者其他情况&#xff0c;会有一个状态是当前的git仓库是在一个commitId上&#xff0c;而没有在一个分支上&#xff1a; 这时如果想要把基于这个commitId创建一个分支&#xff0c;可以使用下面这个命令&#xff1a; git push…

软考高级:结构化需求分析概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

机器人路径规划:基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的机器人路径规划(提供MATLAB代码)

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

Debezium vs OGG vs Tapdata:如何实时同步 Oracle 数据到 Kafka 消息队列?

随着信息时代的蓬勃发展&#xff0c;企业对实时数据处理的需求逐渐成为推动业务创新和发展的重要驱动力。在这个快速变化的环境中&#xff0c;许多企业选择将 Oracle 数据库同步到 Kafka&#xff0c;以满足日益增长的实时数据处理需求。本文将深入探讨这一趋势的背后原因&#…

Vue+Element-UI Table表格实现复选框单选效果(隐藏表头上的全选Checkbox)

实现效果 完整代码 <div class"box-pos"><el-table ref"table" :header-cell-style"{ color: #FFF, background: #333 }":cell-style"{ color: #FFF, background: #333 }" :data"grListData" style"width: 1…

01分布式搜索引擎ES

分布式搜索引擎ES 1.初识elasticsearch1.1.了解ES1.2.倒排索引1.3.es的一些概念 2.索引库操作2.1.mapping映射属性2.2.索引库的CRUD 3.文档操作3.1.新增文档3.2.查询文档3.3.删除文档3.4.修改文档3.5.总结 4.RestAPI4.0.导入Demo工程4.1.创建索引库4.2.删除索引库4.3.判断索引库…

Linux环境开发工具之vim

前言 上一期我们已经介绍了软件包管理器yum&#xff0c; 已经可以在linux上查找、安装、卸载软件了&#xff0c;本期我们来介绍一下文本编辑器vim。 本期内容介绍 什么是vim vim的常见的模式以及切换 vim命令模式常见的操作 vim底行模式常见的操作 解决普通用户无法执行sudo问…

Apache Superset

前言 最近在准备一个小的项目&#xff0c;需要对 Hive 的数据进行展示&#xff0c;所以想到了把 Hive 的数据导出到 MySQL 然后用 Superset 进行展示。 Superset 1.1 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接…

ASP .Net Core 配置集合 IConfiguration 的使用

&#x1f433;简介 IConfiguration 是 ASP.NET Core 中的一个接口&#xff0c;用于表示配置集合。以下是关于 IConfiguration 的详细介绍&#xff1a; 作用&#xff1a;IConfiguration 允许开发人员从各种来源&#xff08;如文件、环境变量、命令行参数等&#xff09;读取应用…

wireshark 使用实践

1、打开wireshark软件&#xff0c;选择网卡&#xff0c;开始抓包 2、打开浏览器&#xff0c;访问一个http网站&#xff1a;这里我用 【邵武市博物馆】明弘治十一年&#xff08;1498&#xff09;铜钟_文物资源_福建省文 测试&#xff0c;因为它是http的不是https&#xff0c;方…

Oracle19C静默安装教程

文章目录 一、安装前的准备1、安装Linux操作系统2、配置网络源或者本地源3、hosts文件配置 二、准备安装环境1、安装依赖包2、创建oracle用户组3、配置系统内核参数4、关闭selinux5、配置oracle用户环境6、修改用户的Shell限制 三、静默安装Oracle数据库1、创建oracle安装目录2…

申请双软认证需要哪些材料?软件功能测试报告怎么获取?

“双软认证”是指软件产品评估和软件企业评估&#xff0c;其中需要软件测试报告。 企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策。 那么&#xff0c;…

[BT]BUUCTF刷题第2天(3.20)

第2天&#xff08;共5题&#xff09; Web [ACTF2020 新生赛]Exec Payload&#xff1a;target127.0.0.1;cat /flag 分号;在许多shell中用作命令分隔符&#xff0c;意味着在执行完前一个命令&#xff08;这里是设置target变量&#xff09;后&#xff0c;接着执行cat /flag命令…