熵值法&熵权法-python实现
时隔老久,重新整理一下笔记。仅供个人自学使用,读者自行参考
Reference:
存了不知道多久的本地文件
司守奎,python数学实验与建模,2020
https://www.zhihu.com/question/357680646/answer/943628631
https://www.jianshu.com/p/638cb1eaec43
先说区别
一开始迷惑的不行以为是两个东西,结果比照很多资料发现这好像就是同一个玩意,没懂当初翻译的搞两个名字干嘛,捂脸。
基本原理
在信息论中,熵是对不确定性的一种度量。一般来说,信息量越大,不确定性就越小,熵也就越小,信息的效用值越大;信息量越小,不确定性越大,熵也越大,信息的效用值越小。而熵值法就是通过计算各指标观测值的信息熵。根据各指标的相对变化程度对系统整体的影响来确定指标权重的一种赋权方法。
基本步骤
-
数据标准化
指标的标准化处理:异质指标同质化
由于各项指标的计量单位并不统一,因此在用它们计算综合指标前,我们先要对它们进行标准化处理,即把指标的绝对值转化为相对值,并令
,从而解决各项不同质指标值的同质化问题。而且,由于正向指标和负向指标数值代表的含义不同(正向指标数值越高越好,负向指标数值越低越好) ,因此,对于高低指标我们用不同的算法进行数据标准化处理。其具体方法如下:
正向指标:
负向指标:
则
为第i个国家的第j个指标的数值。(i=1,2…,n; j=1,2,…,m)。为了方便起见,仍记数据
但一般只用正向指标处理。
-
计算在第j项指标下第i各评价对象的特征比重
设第 i 个评价对象的第 j 个观测值的标准化数据,计算第 j 项指标下第 i 个评价对象的特征比重为
-
计算第j项指标的熵值为
,其中
不难看出,如果第 j 项指标的观测值差异越大,熵值越小;反之,熵值越大。 -
计算第j项指标的差异系数为
如果第 j 项指标的观测值越大,则差异系数 gi 就越大,第 j 项指标也就越重要
-
确定第j项指标的权重系数
-
计算第i个评价对象的综合评价值
总结
优点
- 能深刻反映出指标的区分能力,进而确定权重
- 是一种客观赋权法,相对主管赋权具有较高的可信度和精确度
- 算法简单,实现容易
缺点
- 不够智能,没有考虑指标与指标之间的影响,如:相关性、层级关系等
- 若无业务经验指导,权重可能失真,需要自行判断
- 对样本的依赖性较大,随着建模样本不断变化,权重会发生一定波动
适用范围
当业务经验不会使得权重发生失真,则比较适用于熵权法;反之,若经常发生权重失真的情况,则需要结合专家打分或评判才能较好的发挥熵权法的优势。同时,确定权重前需要确定指标对目标得分的影响方向,对非线性的指标要进行预处理或者剔除。
最大熵原理
最大熵原理就是找一个概率分布,使和已有的关于状态集合的信息(可理解为先验信息)一致,并且没有太大的误差。最容易想到的概率分布就是使熵达到最大的并且满足约束条件的概率分布,因为从最小二乘法或最小距离的原理考虑,比较平坦的分布比有峰的分布满足已知的信息体例的可能性更大。当没有任何关于状态集合的先验信息时,利用最大熵准则得到的概率分布与等概率原则得到的结果一致。
最大熵原理是对客观物理系统的某种实际分析分布的估计,虽然计算熵时所用的概率分布带有一定的主观性,但在最大熵原理下所给出的解完全是一个客观的量,因为这一解只与一组数学期望值有关,而这组数学期望值可以客观测量得到。所以最大熵给出的解完全是一个客观量,没有主观因素。因此,基于最大熵原理得出的用于评价指标权重的熵权法是一种客观评价法。
这也证明了最大熵可以使得评价的熵权失去主观性。
基础代码
import numpy as np
import pandas as pd
#文件路径
fp="d:/shangquan.xlsx"
#参数自行调参
data=pd.read_excel(fp,index_col=None,header=None,encoding='utf8')
#标准化数据,这里一行代码处理简直玄学
data = (data - data.min())/(data.max() - data.min())
m,n=data.shape
#第一步读取文件,如果未标准化,则标准化
data=data.as_matrix(columns=None)
#将dataframe格式转化为matrix格式
k=1/np.log(m)
yij=data.sum(axis=0)
pij=data/yij
#第二步,计算pij
test=pij*np.log(pij)
test=np.nan_to_num(test)
ej=-k*(test.sum(axis=0))
#计算每种指标的信息熵
wi=(1-ej)/np.sum(1-ej)
#计算每种指标的权重