• [数据分析][评价方法]打分式评价-信息熵理论与熵权法


    前言:

    信息熵是一种用于衡量系统内部信息量的度量。在信息论中,信息是系统有序程度的一种度量。

    信息是确定性的增加,不确定性的减少(香农定理)。而信息熵是系统无序程度的一种度量,是系统不确定性的量度。两者绝对值相等,但符号相反。一个系统的信息熵越小,该系统所含的信息量越大。

    信息熵被广泛用于计算机编码,通信理论,博弈论等与“信息量”和“不确定性”相关的理论模型中。

    熵权法就是一个通过信息熵理论确定系统中各指标权值的赋值方法,能够较为精确客观地判断系统中各指标对总评价的贡献大小。

    信息熵的概念

      信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量
      直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题。信息熵这个词是C.E.香农从热力学中借用过来的。热力学中的热熵是表示分子状态混乱程度的物理量。香农用信息熵的概念来描述信源的不确定度
      信息论之父克劳德·艾尔伍德·香农第一次用数学语言阐明了概率与信息冗余度的关系。
     
      信息论之父 C. E. Shannon 在 1948 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中, Shannon 指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。
      Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。
      
    信息熵具有以下特点:

    • 单调性,即发生概率越高的事件,其所携带的信息熵越低。极端案例就是“太阳从东方升起”,因为为确定事件,所以不携带任何信息量。从信息论的角度,认为这句话没有消除任何不确定性。

    • 非负性,即信息熵不能为负。这个很好理解,因为负的信息,即你得知了某个信息后,却增加了不确定性是不合逻辑

    • 累加性,即多随机事件同时发生存在的总不确定性的量度是可以表示为各事件不确定性的量度的和。

    熵权法介绍

      熵最先由香农引入信息论,目前已经在工程技术、社会经济等领域得到了非常广泛的应用。

      熵权法的基本思路是根据指标变异性的大小来确定客观权重。

      熵权法相对于其他打分评价模型来说,具有精确客观的优点。基于信息熵所计算得出的权重能够较为精确地反应不同指标间的差别。但是相对应的,由于该模型的本质是用有限个决策样本去“估计”指标的信息熵,在样本量过少的情况下,基于熵权法所计算得出的权重则有可能出现较大误差。一般来讲,样本决策数必须大于等于指标数

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

    熵权法赋权步骤

    数据标准化

      将各个指标的数据进行标准化处理。

      假设给定了k个指标,其中假设对各指标数据标准化后的值为,那么

    求各指标的信息熵

      根据信息论中信息熵的定义,一组数据的信息熵     ,

    (近似写为:,n取e为底数) ,其中   

     

    如果   则定义  再带入。

    确定各指标权重

      根据信息熵的计算公式,计算出各个指标的信息熵为。通过信息熵计算各指标的权重:

    熵权法赋权实例

    背景介绍

      某医院为了提高自身的护理水平,对拥有的11个科室进行了考核,考核标准包括9项整体护理,并对护理水平较好的科室进行奖励。下表是对各个科室指标考核后的评分结果。

    表1  11个科室9项整体护理评价指标得分表

      但是由于各项护理的难易程度不同,因此需要对9项护理进行赋权,以便能够更加合理的对各个科室的护理水平进行评价。

    熵权法进行赋权

    1.数据标准化

      根据原始评分表,对数据进行标准化后可以得到下列数据标准化表

    2  11个科室9项整体护理评价指标得分表标准化表

    2.求各指标的信息熵

      根据信息熵的计算公式,可以计算出9项护理指标各自的信息熵如下:

    3  9项指标信息熵表

     

    3.计算各指标的权重

      根据指标权重的计算公式,可以得到各个指标的权重如下表所示:

    4  9项指标权重表

    4.对各个科室进行评分

      根据计算出的指标权重,以及对11个科室9项护理水平的评分。设Zl为第l个科室的最终得分,则 ,各个科室最终得分如下表所示:

    5  11个科室最终得分表

    实现过程

    数据源:

     

     python3代码:
     1 # -*- encoding=utf-8 -*-
     2 
     3 import warnings
     4 warnings.filterwarnings("ignore")
     5 import pandas as pd
     6 import numpy as np
     7 
     8 
     9 def get_score(wi_list,data):
    10     """
    11     :param wi_list: 权重系数列表
    12     :param data:评价指标数据框
    13     :return:返回得分
    14     """
    15 
    16     #  将权重转换为矩阵
    17 
    18     cof_var = np.mat(wi_list)
    19 
    20     #  将数据框转换为矩阵
    21     context_train_data = np.mat(data)
    22 
    23     #  权重跟自变量相乘
    24     last_hot_matrix = context_train_data * cof_var.T
    25     last_hot_matrix = pd.DataFrame(last_hot_matrix)
    26 
    27     #  累加求和得到总分
    28     last_hot_score = list(last_hot_matrix.apply(sum))
    29 
    30     #  max-min 归一化
    31 
    32     # last_hot_score_autoNorm = autoNorm(last_hot_score)
    33 
    34     # 值映射成分数(0-100分)
    35 
    36     # last_hot_score_result = [i * 100 for i in last_hot_score_autoNorm]
    37 
    38     return last_hot_score
    39 
    40 
    41 
    42 def get_entropy_weight(data):
    43     """
    44     :param data: 评价指标数据框
    45     :return: 各指标权重列表
    46     """
    47     # 数据标准化
    48     data = (data - data.min())/(data.max() - data.min())
    49     m,n=data.shape
    50     #将dataframe格式转化为matrix格式
    51     data=data.as_matrix(columns=None)
    52     k=1/np.log(m)
    53     yij=data.sum(axis=0)
    54     #第二步,计算pij
    55     pij=data/yij
    56     test=pij*np.log(pij)
    57     test=np.nan_to_num(test)
    58 
    59     #计算每种指标的信息熵
    60     ej=-k*(test.sum(axis=0))
    61     #计算每种指标的权重
    62     wi=(1-ej)/np.sum(1-ej)
    63 
    64     wi_list=list(wi)
    65 
    66 
    67     return  wi_list
    68 
    69 
    70 
    71 if __name__ == '__main__':
    72 
    73 
    74     data0 = pd.read_excel("C:\Users\Oreo\Desktop\test2.xlsx", encoding='utf8')
    75 
    76     data = data0.iloc[:, 1:10]
    77     mm=data
    78     wi_list=get_entropy_weight(data)
    79     score_list=get_score(mm,wi_list)
    80     mm['score']=score_list
    81     mm['科室']=data0['科室']
    82     # 然后对数据框按得分从大到小排序
    83     result = mm.sort_values(by='score', axis=0, ascending=False)
    84     result['rank'] = range(1, len(result) + 1)
    85 
    86     print(result)
    87 
    88     # 写出csv数据
    89     result.to_csv('C:\Users\Oreo\Desktop\test2_result.csv', index=False)
    数据结果:

    GitHub地址

    Entropy_Weight_Method

    参考链接

     

  • 相关阅读:
    聊聊C#中的Visitor模式
    数据库软件哪个好用(目前最靠谱的10个数据库软件)
    微软加入开放 3D 基金会,将推动开源 3D 引擎发展
    三小工具构建Modbus调试环境
    世界六大顶尖的软件强国
    ThinkPad哪个产品系列比较好?
    echarts 中Canvas和SVG的区别
    15K Star!Github 上最火的低代码开发平台!
    valueOf 是基于毫秒为单位的
    fullPage.js: 月收一万五千美元的开源JavaScript组件
  • 原文地址:https://www.cnblogs.com/-oreo/p/10328465.html
Copyright © 2020-2023  润新知