目录
- 一、熵
- 二、熵的计算
- 三、熵权法
一、熵
1、定义
在信息论中,熵的公式为
其中p为每一种可能的情况发生的概率,对数的底数决定了信息上的单位。不同的底对应不同的单位。在信息论里通常以2为底,单位为bit;在热力学中以10为底,单位为Hartley;理论推导过程中通常以e为底,单位为nat。
2、含义
在信息论里,熵并不直接表示信息的多少,而是表示不确定性的大小。如果要消除这种不确定性,熵越大需要输入的信息越多,因此也有说法为熵越大信息越大。
二、熵的计算
熵的计算可以通过numpy和scipy库来计算,也可以使用numpy直接写公式计算,各类计算效率基本一致,包括使用numba也无较大提速,计算时需注意以下2点:
注意1:熵的单位,也就是log的底选择多少,也就是下面代码中的base。
注意2:自己写公式需要注意边界条件,如输入的序列中只有一个数的时候熵为0。如果如下面代码这个通过调用scipy库的entropy函数则无需考虑。
注意3:scipy的entropy函数输入的是一个概率序列,但是函数自带归一化功能,输入非否序列会自动计算每个值的概率,因此输入计数序列即可无需计算每个值出现的概率再输入。
import numpy as np
from scipy.stats import entropy
def entropy1(labels, base=2):
value,counts = np.unique(labels, return_counts=True)
return entropy(counts, base=2)
当输入数据是pandas的Series时可以优化为
import pandas as pd
import scipy.stats
def ent(data):
"""data是 `pd.Series`
"""
p_data = data.value_counts()
entropy = scipy.stats.entropy(p_data)
return entropy
三、熵权法
熵权法是一种计算权重的方法,计算权重的方法分为主关法和客观法,常见的有8种,参考资料如下。
https://zhuanlan.zhihu.com/p/112667852 https://www.zhihu.com/question/357680646/answer/1748591262 熵权法的原理参考
https://zhuanlan.zhihu.com/p/434372508
注意1:在计算时主要需要注意正向指标和负向指标的区分,对于负向指标可以在归一化时改变改变公式计算为正向,也可以数据预处理时提前对指标正向化,如可以把失败率正向化为1-失败率。
注意2:熵权法的熵的计算公式和信息熵的计算公式不同,计算概率时不是每个值出现的次数除以总次数,而是直接用值除以值的求和,即使用某个值的量除以总量。
具体计算方法可以使用mcdm库,这个库即可以计算熵权法也可以计算其他综合指标方法。