利用熵值法确定指标权重---原理及Python实现

背景

在进行一些综合评估类项目时,需要给一些指标确定一个合理的权重,用来计算综合得分,这种综合评估类项目在实际的业务中有很多应用,比如:学生奖学金评定方法、广告效果综合评估、电视节目满意度综合评估、用户满意度综合评估等。计算权重的方法比较多,下面主要介绍利用熵值法来确定确定。

一些名词解释

  • 个案
    一个个案,一条记录,也就是一个样本,在矩阵里面就是一行数据,不同地方叫法不一样
  • 属性
    属性就是样本所拥有的特性,也就是特征,在矩阵里面就是一列数据

熵值法概念

熵值法原理: 熵的概念源于热力学,是对系统状态不确定性的一种度量。在信息论中,信息是系统有序程度的一种度量。而熵是系统无序程度的一种度量,两者绝对值相等,但符号相反。根据此性质,可以利用评价中各方案的固有信息,通过熵值法得到各个指标的信息熵,信息熵越小,信息的无序度越低,其信息的效用值越大,指标的权重越大

熵是不确定性的度量,如果用 P i P_{i} Pi表示第 i i i个信息的不确定度(也就是出现的概率),则整个信息(设有 n n n个)的不确定度量如下所示:
S = − K ∑ i = 1 n P i l n P i S=-K\sum_{i=1}^{n}P_{i}lnP_{i} S=Ki=1nPilnPi
这就是熵,其中 K K K为正常数,当各个信息发生的概率相等时,即 P i = 1 n P_{i}=\frac{1}{n} Pi=n1 S S S取值最大,此时熵最大,也就是信息无序度最大,各个信息都发生可能性一样

熵值法步骤

    1. 可利用信息熵的概念确定权重,假设多属性决策矩阵如下:
      M = A 1 A 2 ⋮ A n [ x 11 x 12 ⋯ x 1 m x 21 x 22 ⋯ x 2 m ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x n m ] M= \begin{matrix} A_{1} \\ A_{2} \\ \vdots \\ A_{n} \end{matrix} \left[ \begin{matrix} x_{11} & x_{12} & \cdots & x_{1m}\\ x_{21} & x_{22} & \cdots & x_{2m}\\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \cdots & x_{nm} \end{matrix}\right] M=A1A2Anx11x21xn1x12x22xn2x1mx2mxnm
      则用 P i j = x i j ∑ i = 1 n x i j P_{ij}=\frac{x_{ij}}{\sum_{i=1}^{n}x_{ij}} Pij=i=1nxijxij 表示第 j j j个属性下第 i i i个方案 A i A_{i} Ai的贡献度
    1. 可以用 E j E_j Ej来表示所有方案对属性 X j X_j Xj的总贡献度:
      E j = − K ∑ i = 1 n P i j l n P i j E_j=-K \sum_{i=1}^{n}P_{ij}lnP_{ij} Ej=Ki=1nPijlnPij 其中,常数 K = 1 l n ( n ) K=\frac{1}{ln(n)} K=ln(n)1,这样,就能保证 0 = < E j < = 1 0=<E_j<=1 0=<Ej<=1,即 E j E_j Ej最大 1
      由式中可以看出,当某个属性各个方案(样本)的贡献度趋于一致时, E j E_j Ej趋于1

      那么各个方案(样本)的贡献度全相等时,就应该不考虑该属性在决策中的作用,也就是该属性的权重应该为0
    1. 这样可以看出属性的权重系数大小由各方案差异大小来决定,为此可定义 d j d_j dj为第 j j j属性的各方案贡献度的一致性程度
      d j = 1 − E j d_j=1-E_j dj=1Ej
    1. 进行归一化后,各属性权重如下:
      W j = d j ∑ j = 1 m d j W_j=\frac{d_j}{\sum_{j=1}^{m}d_j} Wj=j=1mdjdj d j = 0 d_j=0 dj=0时,第 j j j属性可以剔除,其权重等于0
    1. 如果决策者事先已有一些经验的主观估计权重 λ j \lambda_j λj,则可借助上述的 W j W_j Wj来对 λ j \lambda_j λj进行修正
      W j ∗ = λ j W j ∑ j = 1 m λ j W j W_{j}^{*}=\frac{\lambda_j W_j}{\sum_{j=1}^{m}\lambda_{j} W_{j}} Wj=j=1mλjWjλjWj

熵值法最大的特点是直接利用决策矩阵所给出的信息计算权重,而没有引入决策者的主观判断,完全是依靠数据来决定

案例

购买汽车的一个决策矩阵,给出了四个方案供我们进行选择,每个方案中均有相同的六个属性,我们需要利用熵值法求出各属性的权重

车型油耗功率费用安全性维护性操作性
本田51.46357
奥迪9230759
桑塔纳81.811575
别克122.518755
计算步骤
    1. 求第 j j j个属性下第 i i i个方案 A i A_i Ai的贡献度,公式为:
      P i j = x i j ∑ i = 1 n x i j P_{ij}=\frac{x_{ij}}{\sum_{i=1}^{ n}x_{ij}} Pij=i=1nxijxij在excel中的话,先求出各列的和,然后用每行的数值比上列和,形成新的矩阵
车型油耗功率费用安全性维护性操作性
本田51.46357
奥迪9230759
桑塔纳81.811575
别克122.518755
总计347.765222226

P P P矩阵:

车型油耗功率费用安全性维护性操作性
本田5/341.4/7.76/653/225/227/26
奥迪9/342/7.730/657/225/229/26
桑塔纳8/341.8/7.711/655/227/225/26
别克12/342.5/7.718/657/225/225/26
    1. 求出所有方案对属性 X j X_{j} Xj 的贡献总量,公式为:

E j = − K ∑ i = 1 n P i j l n P i j E_j=-K\sum_{i=1}^{n}P_{ij}lnP_{ij} Ej=Ki=1nPijlnPij

在excel操作中,将刚才生成的矩阵每个元素变成每个元素与该元素自然对数的乘积

只列出油耗计算过程,其他属性同理

车型油耗
本田5/34 * ln(5/34)
奥迪9/34 * ln(9/34)
桑塔纳8/34 * ln(8/34)
别克12/34 * ln(12/34)
总计5/34* ln(5/34) + 9/34* ln(9/34) + 8/34* ln(8/34) + 12/34* ln(12/34)

求出常数 k k k k k k 1 / l n ( 方 案 数 ) 1/ln(方案数) 1/ln(),本例中有 4 个方案,所以求得 k k k 1 / l n ( 4 ) 1/ln(4) 1/ln(4),再求 k k k与新矩阵每一列和的乘积,这样获得的 6 个积为所有方案对属性 x j x_j xj的贡献度

车型油耗
本田5/34 * ln(5/34)
奥迪9/34 * ln(9/34)
桑塔纳8/34 * ln(8/34)
别克12/34 * ln(12/34)
总计5/34* ln(5/34) + 9/34* ln(9/34) + 8/34* ln(8/34) + 12/34* ln(12/34)
E j E_j Ej1/ln(4) * [ 5/34* ln(5/34) + 9/34* ln(9/34) + 8/34* ln(8/34) + 12/34* ln(12/34) ]

至此所有的 E j E_j Ej就求出来了

    1. d j d_j dj为第 j j j属性下各方案贡献度的一致性程度,公式为:
      d j = 1 − E j d_j=1-E_j dj=1Ej利用上面求得的 E j E_j Ej,可以得到 d j d_j dj
车型油耗
本田5/34 * ln(5/34)
奥迪9/34 * ln(9/34)
桑塔纳8/34 * ln(8/34)
别克12/34 * ln(12/34)
总计5/34* ln(5/34) + 9/34* ln(9/34) + 8/34* ln(8/34) + 12/34* ln(12/34)
E j E_j Ej1/ln(4) * [ 5/34* ln(5/34) + 9/34* ln(9/34) + 8/34* ln(8/34) + 12/34* ln(12/34) ]
d j d_j dj1 - 1/ln(4) * [5/34* ln(5/34) + 9/34* ln(9/34) + 8/34* ln(8/34) + 12/34* ln(12/34) ]

    1. 利用下面公式进行归一化后,即可求得各属性的权重:

W j = d j ∑ j = 1 m d j W_j=\frac{d_j}{\sum_{j=1}^{m}d_j} Wj=j=1mdjdj

经过计算后各属性的权重为:

车型油耗功率费用安全性维护性操作性
权重0.140.070.490.160.040.10

所以在购买汽车时,据所提供信息,利用熵值法计算得出的权重为油耗占 14%,功率占 7%,费用占 49%,安全性占 16%,维护性占 4%,操作性占 10%。故我们在进行购买决策时,更多是考虑车型的价格和安全性等重要因素,这是从权重角度考虑的。

利用Python实现熵值法:

代码如下:(可左右滑动查看)

import pandas as pd
import numpy as np
import math
from numpy import array

# 定义熵值法函数  熵值法计算变量的权重
def cal_weight(df):
    #求k
    rows = df.index.size  # 行
    cols = df.columns.size  # 列
    k = 1.0 / math.log(rows)

   

    # 矩阵计算、信息熵
    x = array(df)
    lnf = [[None] * cols for i in range(rows)]
    lnf = array(lnf)
    for i in range(0, rows):
        for j in range(0, cols):
            if x[i][j] == 0:
                lnfij = 0.0
            else:
                p = x[i][j] / np.sum(x, axis=0)[j]
                lnfij = math.log(p) * p * (-k)
            lnf[i][j] = lnfij
    lnf = pd.DataFrame(lnf)
    E = lnf

    # 计算一致性程度
    d = 1 - E.sum(axis=0)

    # 计算各指标的权重
    w = [[None] * 1 for i in range(cols)]
    for j in range(0, cols):
        wj = d[j] / sum(d)
        w[j] = wj

    w = pd.DataFrame(w)
    w.index = df.columns
    w.columns = ['权重']
    
    return w

以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号,不定期分享纯干货

  • 12
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
熵值法是一种常用的多指标决策方法,可以用来求解多个指标权重。下面是使用Python实现熵值法指标权重的基本思路: 1. 首先,需要准备好一个评价矩阵,其中包含了各个评价指标的得分情况。评价矩阵可以使用NumPy库中的数组来表示。 2. 然后,需要将评价矩阵标准化,使得各个指标得分在相同的范围内。标准化可以使用最大-最小规范化的方法,即将每个指标的得分都归一化到[0,1]的范围内。 3. 接着,需要计算每个指标权重计算权重的方法是先计算每个指标对应的信息熵,再计算每个指标的熵权。信息熵可以使用熵值法公式来计算,熵权则是指标的信息熵与各个指标信息熵之和的比值。 4. 最后,将各个指标的熵权作为其权重,即可得到每个指标权重值。 以下是Python代码示例: ```python import numpy as np # 定义评价矩阵 eval_matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 对评价矩阵进行标准化 norm_matrix = (eval_matrix - eval_matrix.min(axis=0)) / (eval_matrix.max(axis=0) - eval_matrix.min(axis=0)) # 计算每个指标对应的信息熵 entropy = -np.sum(norm_matrix * np.log(norm_matrix), axis=0) # 计算每个指标的熵权 entropy_weight = entropy / np.sum(entropy) # 输出每个指标权重值 print(entropy_weight) ``` 以上代码中,我们首先定义了一个评价矩阵eval_matrix,然后对其进行了标准化得到了norm_matrix,接着计算了每个指标对应的信息熵entropy,最后计算了每个指标的熵权entropy_weight并输出了结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据人阿多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值