@20171107
1 熵权法的原理
1.1 信息熵(Information Entropy)
熵是热力学的一个物理概念,是体系混乱度或无序度的度量,熵越大表示系统越乱(即携带的信息越少),熵越小表示系统越有序(即携带的信息越多)。信息熵借鉴了热力学中熵的概念,用于描述平均而言事件信息量的大小,所以在数学上,信息熵是事件所包含的信息量的期望(mean,或称均值,或称期望,是试验中每次可能结果的概率乘以其结果的总和),根据期望的定义,可以设想信息熵的公式大概是:
每种可能事件包含的信息量与这一事件的不确定性有关,换言之,与事件发生的概率有关,概率越大则信息量越小。例如,小明考上清华大学的概率是0,。。。。。
每种可能事件包含的信息量的计算采用不确定性函数 f f :
采用不确定性函数,一方面可以保证信息量是概率P的单调递减函数,另一方面可以保证两个独立事件所产生的不确定性应等于各自不确定性纸和,即具备可加性。
将不确定性函数带入开始时设想的公式:
H H 是熵,是所有可能事件的集合,有 n n 中取值:,对应概率为: P1,...,Pi,...,Pn P 1 , . . . , P i , . . . , P n ,对数的底一般为2。
1.2 熵权法
根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其熵值越小,指标的离散程度越大,该指标对综合评价的影响(即权重)就越大,如果某项指标的值全部相等,则该指标在综合评价中不起作用。
2 熵权法的计算步骤
2.1 确定指标体系
2.2 数据预处理
数据预处理即冗余数据处理、异常值处理等
2.3 归一化处理
归一化是将不同量纲的指标同量纲化,通常有两种方法:
1. 0-1归一化(或称临界值法),例如第
i
i
个用户的第个指标是
xij
x
i
j
,归一化后为
x′ij
x
i
j
′
,有如下两个公式:
若指标为正向指标,则选用第一个公式,若指标为福祥指标,则选用第二个公式。 min(xj) m i n ( x j ) 是第 j j 个指标的最小值,是第 j j 个指标的最大值。
2. Z-score归一化
2.4 计算指标的熵和权
- 先计算第 i i 个用户的第个指标的比重: yij=x′ij∑mi=1x′ij y i j = x i j ′ ∑ i = 1 m x i j ′
- 计算第 j j 个指标的信息熵,其中, K K 为常数,
- 计算第 j j 个指标的权重
2.5 指标加权计算得分
利用加权求和公式计算样本的分数或评价值 S=∑j100∗yijwj S = ∑ j 100 ∗ y i j w j ,其中 S S 为综合得分,为第 j j <script type="math/tex" id="MathJax-Element-54">j</script>个指标的权重。
3 总结
优点
- 能深刻反映出指标的区分能力,进而确定权重
- 是一种客观赋权法,相对主管赋权具有较高的可信度和精确度
- 算法简单
缺点
- 不够智能,没有考虑指标与指标之间的影响,如:相关性、层级关系等
- 若无业务经验指导,权重可能失真
- 对样本的依赖性较大,随着建模样本不断变化,权重会发生一定波动
适用范围
当业务经验不会使得权重发生失真,则比较适用于熵权法;反之,若经常发生权重失真的情况,则需要结合专家打分或评判才能较好的发挥熵权法的优势。同时,确定权重前需要确定指标对目标得分的影响方向,对非线性的指标要进行预处理或者剔除。
4 示例
stu = [['学生5',100,90],['学生3',97,89],['学生13',88,98],['学生7',77,100],['学生2',80,96],
['学生12',98,76],['学生9',99,56],['学生14',88,56],['学生6',90,43],['学生11',89,32],
['学生8',88,32],['学生4',90,24],['学生15',88,21],['学生16',99,1],['学生1',89,11],['学生10',89,2]]
stu = pd.DataFrame(stu);stu.columns=['name','math','sport'];stu.index=stu['name'];stu=stu[stu.columns[1:]]
# 01标准化处理
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() # (0,1)标准化
stu[['math','sport']] = scaler.fit_transform(stu[['math','sport']])
# 计算熵和权
import numpy as np
yij = stu.apply(lambda x: x / x.sum(), axis=0) # 第i个学生的第j个指标值的比重yij = xij/sum(xij) i=(1,m)
K = 1/np.log(len(stu)) # 常数
tmp = yij*np.log(yij)
tmp=np.nan_to_num(tmp)
ej = -K*(tmp.sum(axis=0)) # 计算第j个指标的信息熵
wj = (1 - ej) / np.sum(1 - ej) # 计算第j个指标的权重
score = yij.apply(lambda x: np.sum(100 * x * wj), axis=1)
top5 = heapq.nlargest(5,score)
score