建模笔记——熵权法(Python实现)
一、模型介绍
熵权法是一种通过对已知数据的处理,从而获得影响因子权重的方法,其基本思路是根据指标变异性的大小来确定客观权重。
熵权法的优点在于其根据各项指标指标值的变异程度来确定指标权数的,是一种客观赋权法,避免了人为因素带来的偏差。相对那些主观赋值法,精度较高客观性更强,能够更好的解释所得到的结果。
熵权法的缺点在于忽略了指标本身重要程度,有时确定的权重会与预期的结果相差甚远,同时熵值法不能减少评价指标的维数,也就是熵权法符合数学规律具有严格的数学意义,但往往会忽视决策者主观的意图。并且如果指标值的变动很小或者很突然地变大变小,熵权法使用时会存在一定的局限。
二、基本思路与步骤
(1)指标正向化
不同的指标代表含义不一样,有的指标越大越好,称为正向指标;有的指标越小越好,称为负向指标;而有些指标在某个点或者区间是最好的,称为适度指标。为方便评价,应把所有指标进行同向化处理。
正向指标:
负向指标:
适度指标:
(2)数据标准化
将指标按比例缩放,使它们落在特定的区间,从而可以去除量纲的影响,使得不同单位或者量级的指标能够进行比较、加权。
这里采用常用的离差标准化法对数据进行处理:
(3)计算信息熵
根据信息论中信息熵的定义,一组数据的信息熵计算公式为:
如果:
则:
(4)确定各指标的权重并计算得分
通过信息熵计算各指标的权重:
三、代码实现
数据表格式:
这里指标名后缀用Positive(正向指标)、Negative(负向指标)、Moderate(适度指标)来对指标类型进行标识。
Python代码如下:
import pandas as pd
import numpy as np
import re
#定义文件读取方法
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.valuesfor i in range((len(columns_name)-1)):name=columns_name[i+1]#print(name)#正向指标直接标准化if ('Positive' in name)==True:max=data_nor[columns_name[i+1]].max()min=data_nor[columns_name[i+1]].min()data_nor[columns_name[i+1]]=(data_nor[columns_name[i+1]]-min)/(max-min)#print(data_nor[columns_name[i+1]])#负向指标先正向化、在标准化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]])#正向化max=data_nor[columns_name[i+1]].max()min=data_nor[columns_name[i+1]].min()data_nor[columns_name[i+1]]=(data_nor[columns_name[i+1]]-min)/(max-min)#标准化#print(data_nor[columns_name[i+1]])#适度指标先正向化、在标准化if ('Moderate' in name)==True:try:val_range= re.search(r'.*[\((](.*),(.*)[\))]',name)val_down= float(val_range.group(1))val_up= float(val_range.group(2))val_op=(val_up+val_down)/2except:val_range= re.search(r'.*[\((](.*)[\))]',name)val_op= float(val_range.group(1))#print(val_op)data_nor[columns_name[i + 1]] = 1-(abs(data_nor[columns_name[i + 1]]-val_op)/(abs(data_nor[columns_name[i + 1]]-val_op).max())) #正向化max=data_nor[columns_name[i+1]].max()min=data_nor[columns_name[i+1]].min()data_nor[columns_name[i+1]]=(data_nor[columns_name[i+1]]-min)/(max-min)#标准化#print(data_nor[columns_name[i+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_sfile='data.xls'#声明数据文件地址
data=read_data(file)#读取数据文件
data_nor=data_normalization(data)#数据标准化、正向化,生成标准化后的数据data_nor
W=entropy_weight(data_nor)#计算熵权权重
data_s=entropy_score(data,W)#计算赋权后的得分,使用原数据计算
data_nor_s=entropy_score(data_nor,W)W.insert(0,'熵权法权重')#将结果保存为csv
W0=pd.DataFrame(W).T
data_s.to_csv('熵权法得分结果(原始数据).csv',index=0)
W0.to_csv('熵权法得分结果(原始数据).csv', mode='a', header=False,index=0)
data_nor_s.to_csv('熵权法得分结果(标准化数据).csv',index=0)
W0.to_csv('熵权法得分结果(标准化数据).csv', mode='a', header=False,index=0)
建模笔记——熵权法(Python实现)相关推荐
- 数学建模笔记-熵权法确定评价类问题指标的权重 清风课程笔记整理
评价类问题: 1.层次分析法入门学习: https://blog.csdn.net/weixin_47066458/article/details/113177117 2.Topsisi入门学习: h ...
- 建模笔记——熵值法熵权法(python)
熵值法&熵权法-python实现 时隔老久,重新整理一下笔记.仅供个人自学使用,读者自行参考 Reference: 存了不知道多久的本地文件 司守奎,python数学实验与建模,2020 ht ...
- 熵权法 —— python
目录 一.熵权法介绍 二.熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 四.实例分析 1.导入相关库 2.读取数据 2.指标正向化 2. ...
- 数学建模系列---熵权法
目录 一.简介 二.说明 1.正向指标: 2.信息量 3.信息熵 三.具体计算步骤 1.标准化矩阵 1.1该步骤的意义 1.2标准化的2种方法 2.计算各元素概率 3.计算各指标的权重 3.1计算每个 ...
- 数学建模之熵权法(EWM)matlab实例实现
本文参考http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html 熵权法是一种客观赋值的方法,即它通过数据所包含的信息量来确定权重,形象的说如果每个人考 ...
- 权重设计:客观赋权法的说明(熵权法/变异系数法/CRCIII法/TOPSIS法)
在数据分析中,我们经常会遇到多个特征对于结果造成不同影响的情况,如何识别这些特征各自的权重,对我们的后续结果评估,打分矩阵构建都具有重要意义.我们所说的赋权法是用于解决多指标综合评价问题中的各指标权重 ...
- 【建模算法】熵权法(Python实现)
[建模算法]熵权法(Python实现) 熵权法是通过寻找数据本身的规律来赋权重的一种方法. 熵是热力学单位,在数学中,信息熵表示事件所包含的信息量的期望.根据定义,对于某项指标,可以用熵值来判断某个指 ...
- 数学建模笔记——评价类模型之熵权法
嗯,这次讲一讲熵权法,一种通过样本数据确定评价指标权重的方法. 熵权法 之前我们提到了TOPSIS方法,用来处理有数据的评价类模型.TOPSIS方法还蛮简单的,大概就三步. 将原始数据矩阵正向化. 也 ...
- 数学建模笔记 Topsis和熵权法
Topsis法(Technique for Order Preference by Similarity to Ideal Solution)可翻译为逼近理想解排序法,国内常简称为优劣解距离法. ...
最新文章
- DIV+CSS 命名规范
- Blender中的多平面动画学习教程
- Java:关于main方法的10道面试题
- shell从oracle中获取变量,shell 如何读取环境变量的值
- 关于NSIS脚本的Demo
- 【ClickHouse】ClickHouse 同步 MySQL 数据库
- vSAN架构解析与6.7功能介绍
- springMVC中获取request 对象
- C++调用mask rcnn进行实时检测--opencv4.0
- 计算2+4+6...+100的值 python_Python100例核心知识,你知道多少
- 【项目|ICT】决赛记录
- Rasa 3.x 学习系列- 内网环境部署Docker及Rasa duckling、Redis
- 应试教育的死穴,恰在于堵死了孩子“犯错”的空间?
- 2019张小龙微信公开课精华整理(未完待续....)
- 黑客教父详解账号泄露全过程:1亿用户已泄露
- 微信小程序制作一个老虎机抽奖动画
- AI 实战篇 |十分钟学会【动物识别】,快去寻找身边的小动物试试看吧【送书】
- 一个北漂程序员在新年的反思
- 博客的美化配置(NexT主题)
- java FX 第一个测试