文章目录
熵权法
一般来说,若某个指标的概率越大,不确定程度越小,信息熵越小,指标离散程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的指标的概率越小,不确定程度越小,信息熵越大,表明指标值得离散程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。
而熵权法是统计学领域,与信息学领域对熵值的解释有所不同。简言之,在统计学领域中,当数据越分散时,熵值越小,可认为该数据包含信息越多,因此权重越大,这也是熵权法的解释;而在信息学领域中,数据越分散,计算熵值越小,数据中的信息越不可靠,可以说数据包含的信息越少。
算法步骤
假设有 m m m个研究对象, n n n个指标:
i = 1 , 2 , … , m , j = 1 , 2 , … , n i=1,2,\dots,m,j=1,2,\dots,n i=1,2,…,m,j=1,2,…,n
X = [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋱ ⋮ x m 1 x m 2 ⋯ x m n ] X=\begin{bmatrix} {x_{11}}&{x_{12}}&{\cdots}&{x_{1n}}\\ {x_{21}}&{x_{22}}&{\cdots}&{x_{2n}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {x_{m1}}&{x_{m2}}&{\cdots}&{x_{mn}}\\ \end{bmatrix} X=
x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1nx2n⋮xmn
指标标准化。
对于正向指标: x i j = x i j − min ( x j ) max ( x j ) − min ( x j ) x_{ij}=\frac{x_{ij}-\min(x_j)}{\max(x_j)-\min(x_j)} xij=max(xj)−min(xj)xij−min(xj).
对于负向指标: x i j = max ( x j ) − x i j max ( x j ) − min ( x j ) x_{ij}=\frac{\max(x_j)-x_{ij}}{\max(x_j)-\min(x_j)} xij=max(xj)−min(xj)max(xj)−xij.
计算第 i i i个研究对象下第 j j j项指标的比重 p i j p_{ij} pij
p i j = x i j ∑ i m x i j p_{ij}=\frac{x_{ij}}{\sum\limits_{i}^mx_{ij}} pij=i∑mxijxij
计算第j项指标的熵值
e j = − k ∑ i m p i j ln p i j e_j=-k\sum\limits_i^mp_{ij}\ln p_{ij} ej=−ki∑mpijlnpij, k = 1 ln m k=\frac{1}{\ln m} k=lnm1
计算第 j j j项指标的差异系数 g j g_j gj
差异系数越大越好,表示该指标对于研究对象所起的作用越大,该指标较好。
g j = 1 − e j g_j=1-e_j gj=1−ej
给指标赋权,定义权重 w j w_j wj
w j = g j ∑ j n g j w_j=\frac{g_j}{\sum\limits_j^ng_j} wj=j∑ngjgj
通过权重计算样本评价值,第 i i i个研究对象下第 j j j项指标的评价值为:
F i j = a j x i j F_{ij}=a_jx_{ij} Fij=ajxij
则第 i i i个研究对象的总体评价值为:
F i = ∑ j n F i j F_i=\sum\limits_j^nF_{ij} Fi=j∑nFij
数据./data.csv:
车型,油耗,功率,费用,安全性,维护性,操作性
本田,5,1.4,6,3,5,7
奥迪,9,2,30,7,5,9
桑塔纳,8,1.8,11,5,7,5
别克,12,2.5,18,7,5,5
程序:
#!/usr/bin/env python
# coding: utf-8
import numpy as np
import pandas as pd
#定义数据标准化函数。为了避免求熵值时对数无意义,对数据进行平移,对标准化后的数据统一加了常数0.001
def std_data(value,flag):
for i in range(len(indicator)):
#print(flag[i])
if flag[i]=='+':
value[:,i]=(value[:,i]-np.min(value[:,i],axis=0))/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.001
elif flag[i]=='-':
value[:,i]=(np.max(value[:,i],axis=0)-value[:,i])/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.001
return value
#定义熵值法函数、熵值法计算变量的权重
def cal_weight(indicator,project,value):
p= np.array([[0.0 for i in range(len(indicator))] for i in range(len(project))])
print(p)
for j in range(len(indicator)):
p[:,j]=value[:,j]/np.sum(value[:,j],axis=0)#沿轴
print(p)
e=-1/np.log(len(project))*sum(p*np.log(p)) #计算熵值
g=1-e # 计算一致性程度
w=g/sum(g) #计算权重
return w
if __name__ == '__main__':
##读取数据
data=pd.read_csv('./data.csv',encoding='utf-8',index_col=0)
data.dropna()
indicator=data.columns.tolist() ##指标个数
project=data.index.tolist() ##方案数、评价主体
value=data.values
print(indicator)
print(project)
print(value)
print(data.head())
##数据标准化
flag=["-","+","-","+","+","+"] ##表示指标为正向指标还是反向指标
std_value=std_data(value,flag)
std_value.round(3)
##结果
w=cal_weight(indicator,project,std_value)
w=pd.DataFrame(w,index=data.columns,columns=['权重'])
print("#######权重:#######")
print(w)
score=np.dot(std_value,w).round(2)
score=pd.DataFrame(score,index=data.index,columns=['综合得分']).sort_values(by =['综合得分'],ascending = False)
print(score)
熵权法的优缺点
1.优点
首先,熵权法是客观确定权重的方法,相较于层次分析法等主观法而言具有一定的精确性;
其次,该方法确定出的权重可以进行修正,从而决定了其适应性较高的特点。
2.缺点
该方法的应用范围有限,仅适于计算权重。
参考:
https://www.zhihu.com/question/274997106/answer/1222518795
https://blog.csdn.net/ziyin_2013/article/details/116496411