熵权法实现

熵权法

一般来说,若某个指标的概率越大,不确定程度越小,信息熵越小,指标离散程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的指标的概率越小,不确定程度越小,信息熵越大,表明指标值得离散程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。

而熵权法是统计学领域,与信息学领域对熵值的解释有所不同。简言之,在统计学领域中,当数据越分散时,熵值越小,可认为该数据包含信息越多,因此权重越大,这也是熵权法的解释;而在信息学领域中,数据越分散,计算熵值越小,数据中的信息越不可靠,可以说数据包含的信息越少。

算法步骤

假设有 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= x11x21xm1x12x22xm2x1nx2nxmn

指标标准化。

对于正向指标: 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)xijmin(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=imxijxij

计算第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=kimpijlnpij 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=1ej

给指标赋权,定义权重 w j w_j wj

w j = g j ∑ j n g j w_j=\frac{g_j}{\sum\limits_j^ng_j} wj=jngjgj

通过权重计算样本评价值,第 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=jnFij

数据./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

猜你喜欢

转载自blog.csdn.net/philosophyatmath/article/details/129176222