数学建模(熵权法 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.mzph.cn/news/759537.shtml

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

相关文章

力扣每日练习(3.18)补

200. 岛屿数量 岛屿是指上下左右都是被0包起来的。使用递归的方式&#xff0c;也就是深度优先搜索&#xff0c;需要确定终止条件&#xff0c;也就是badcase是什么情况出现的。 二叉树是递到叶子节点的时候&#xff0c;因为下面是空子树了&#xff1b;矩阵就是越界&#xff0c;…

基于BusyBox的imx6ull移植sqlite3到ARM板子上

1.官网下载源码 https://www.sqlite.org/download.html 下载源码解压到本地的linux环境下 2.解压并创建install文件夹 3.使用命令行配置 在解压的文件夹下打开终端&#xff0c;然后输入以下内容&#xff0c;其中arm-linux-gnueabihf是自己的交叉编译器【自己替换】 ./config…

PyTorch 深度学习(GPT 重译)(三)

六、使用神经网络拟合数据 本章内容包括 与线性模型相比&#xff0c;非线性激活函数是关键区别 使用 PyTorch 的nn模块 使用神经网络解决线性拟合问题 到目前为止&#xff0c;我们已经仔细研究了线性模型如何学习以及如何在 PyTorch 中实现这一点。我们专注于一个非常简单…

获取蓝牙Download_Linkey日志方法

::获取root权限 del bt_config.conf :retry adb root if %errorlevel% neq 0 ( echo adb root failed. Retrying... goto retry ) echo Congratulations To Adb Root For His Success.... :adb_pull adb pull /data/misc/bluedroid/bt_config.conf if %errorlevel% neq…

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

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

websocket 中 request-line 中的URI编码问题

首先&#xff0c;request-line组成如下&#xff1a; Request-Line Method SP Request-URI SP HTTP-Version CRLF 在 rfc6455 规范的 5.1.2 Request-URI 中&#xff0c;有这样的描述&#xff1a; The Request-URI is transmitted in the format specified in section 3.2.1. …

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结 模糊图像增强技术之去噪声类滤波场景应用小结—【蘇小沐】 文章目录 【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结&#xff08;一&#xff09;去噪声类滤波器1、去块滤波器&#xff08;Deblo…

不同“chatGPT”比较

通过两个问题比较不同版本的 生成式 AI 国内免费: 【通义千问】https://tongyi.aliyun.com/qianwen 【文心一言】https://yiyan.baidu.com 【豆包】https://www.doubao.com/chat 【360 智脑】https://chat.360.com/chat 归属主体&#xff1a; 【阿里-通义千问-免费-国内可访…

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献&#xff0c;用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高&#xff0c;不少汽车巨头都已入局。但这项技术的难度不小&#xff0c;相信在未来几年里&#xff0c;无人驾驶汽车这项…

webpack从零开始搭建vue项目

webpack一步一步搭建vue项目 前提&#xff1a;node、git(可选)已安装。node我使用的版本是 16.13.1。本文基本上都是基础配置&#xff0c;更多特殊配置请看其他博客。 本项目包含内容&#xff1a; webapck vue sass postcss babel eslint typescript 项目源码地址&#xff1…

软考高级:软件架构风格-独立构件风格概念和例题

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

MySQL 索引的分类和优化

​ 优质博文&#xff1a;IT-BLOG-CN 索引是什么 &#xff1a; MySQL 官方对索引的定义&#xff1a;索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。可以得到索引的本质&#xff1a;索引是数据结构。索引的目的在于提高查询效率。可以简单理解为&#…

力扣爆刷第101天之hot100五连刷91-95

力扣爆刷第101天之hot100五连刷91-95 文章目录 力扣爆刷第101天之hot100五连刷91-95一、62. 不同路径二、64. 最小路径和三、5. 最长回文子串四、1143. 最长公共子序列五、72. 编辑距离 一、62. 不同路径 题目链接&#xff1a;https://leetcode.cn/problems/unique-paths/desc…

实现防抖函数并支持第一次立刻执行(vue3 + ts环境演示)

1、先看一效果&#xff1a; 2、实现思路&#xff1a; 使用定时器setTimeout和闭包实现常规防抖功能&#xff1b;增加immediate字段控制第一次是否执行一次函数&#xff08;true or false&#xff09;&#xff1b;增加一个flag标识&#xff0c;在第一次执行时&#xff0c;将标…

【go从入门到精通】for循环控制

前言 Go 语言提供了 for 循环语句&#xff0c;用于重复执行一段程序逻辑&#xff0c;直到循环条件不再满足时终止。 循环可以用于迭代各种数据结构&#xff08;例如切片、数组、映射或字符串&#xff09;中的元素 本文将很基础的for循环语法&#xff0c;循环嵌套&#…

二、阅读器的开发(初始)-- 1、阅读器简介及开发准备工作

1、阅读器工作原理及开发流程 1.1阅读器工作原理简介 电子书&#xff08;有txt、pdf、epub、mobi等格式&#xff09;->解析&#xff08;书名、作者、目录、封面、章节等&#xff09;->&#xff08;通过阅读器引擎&#xff09;渲染 -> 功能&#xff08;字号、背景色、…

PHP页面如何实现设置独立访问密码

PHP网页如果需要查看信息必须输入密码&#xff0c;验证后才可显示出内容的代码如何实现&#xff1f; 对某些php页面设置单独的访问密码,如果密码不正确则无法查看内容,相当于对页面进行了一个加密。 如何实现这个效果&#xff0c;详细教程可以参考&#xff1a;PHP页面如何实现…

谁将主导未来AI市场?Claude3、Gemini、Sora与GPT-4的技术比拼

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…

Milvus笔记

一、创建操作 1、python版本 from pymilvus import Collection, FieldSchema, DataType, CollectionSchema, connections from pymilvus.orm import utility, dbfrom knowledge_brain.milvus_sink import milvus_sink from study.connect import Connectclass MilvusOperatC:…

前后端分离项目springsecurity实现用户登录认证快速使用

目录 1、引入依赖 2、创建类继承WebSecurityConfigurerAdapter &#xff08;1&#xff09;重写里面的configure(HttpSecurity http)方法 &#xff08;2&#xff09;重写AuthenticationManager authenticationManagerBean() &#xff08;3&#xff09;密码加密工具 3、继承…