多目标决策之熵权法

多目标决策 之 熵权法(综合评价)

  • 1 简介
  • 1 计算步骤
    • 1.1 将各指标数据进行 m i n − m a x min-max minmax标准化
    • 1.2 计算第 j j j 项指标在第 i i i 年度时的指标值所占比重 p i j p_{ij} pij
    • 1.3 计算第项指标的嫡值 H j H_j Hj
    • 1.4 计算第j项指标的差异系数 g j g_j gj
    • 计算指标比重、熵值及差异系数: 代码及注意事项
    • 1.5 计算第 j j j项指标的权重 ω j \omega_j ωj
    • 1.6 计算综合得分并评价

1 简介

指标权重的选择,直接影响评价指标体系的公正性及预测的准确性,因此指标权重的确定更需要讲究客观性。熵值权重法是一种客观确定权重的方法。

熵权法根据各指标的变异程度,利用信息熵计算出各指标的熵权,再通过熵权对各指标的权重进行修正,从而得到较为客观的指标权重。

在信息系统中的信息熵是信息无序度的度量,信息熵越大,信息的无序度越高,其信息的效用值越小;
反之,信息熵越小,信息的无序度越小,信息的效用值越大。因此可以运用信息熵评价所获系统信息的有序程度及信息的效用值。

在评价体系中,指标的信息熵越大,则其信息的效用值越小,因此赋予该指标较小的指标权重;
指标的信息熵越小,则其信息的效用值越大,因此赋予该指标较大的指标权重。

1 计算步骤

1.1 将各指标数据进行 m i n − m a x min-max minmax标准化

  • 正向指标:指标值越大,则评价就越好,也称为越大越优型指标
  • 负向指标:指标值越大,则评价就越差,也称为越小越优型指标
  • 举例:场均得分----越大越好----正向指标, 场均失误----越小越好----负向指标。
  • 某点最优型指标,一般不会谈到
正向指标 x i − min ⁡ { x i } max ⁡ { x i } − min ⁡ { x i } ( i = 1 , 2 , . . . n ) \frac{x_i-\min \left\{x_i\right\}}{\max \left\{x_i\right\}-\min \left\{x_i\right\}}(i=1,2, ... n) max{xi}min{xi}ximin{xi}(i=1,2,...n)
负向指标 max ⁡ { x i } − x i max ⁡ { x i } − min ⁡ { x i } ( i = 1 , 2 , . . . n ) \frac{\max \left\{x_i\right\}-x_i}{\max \left\{x_i\right\}-\min \left\{x_i\right\}}(i=1,2, ... n) max{xi}min{xi}max{xi}xi(i=1,2,...n)

min-max标准化也称离差标准化,本质上是对原始数据的一种线性变换,函数如下:
y i = x i − min ⁡ { x i } max ⁡ { x i } − min ⁡ { x i } ( i = 1 , 2 , . . . n ) y_i=\frac{x_i-\min \left\{x_i\right\}}{\max \left\{x_i\right\}-\min \left\{x_i\right\}}(i=1,2, ... n) yi=max{xi}min{xi}ximin{xi}(i=1,2,...n)
其中, x i {x_i} xi为原始序列, y i {y_i} yi为标准化后的序列,标准化后的新序列均落在[0,1]区间上,从而起到消除量级和量纲的作用。

import numpy as np
import pandas as pd
df=pd.read_excel('data_py.xlsx',sheet_name='广州',encoding='utf-8')
df.drop(columns="时间",axis=1,inplace=True)
df.set_index([[2010,2011,2012,2013,2014,2015,2016,2017,2018]],inplace=True)
print(df.shape)
print(df.head(5))

#下面是标准化
#正指标 (x-min)/(max-min)
#负指标 (max-x)/(max-min)
for i in list(df.columns):
   # 获取各个指标的最大值和最小值
    Max = np.max(df[i])
    Min = np.min(df[i])
    if (i == '二氧化硫年平均浓度') or (i == '二氧化氮年平均浓度'):
         df[i] = (Max - df[i])/(Max - Min)
    else:
         # 标准化
        df[i] = (df[i] - Min)/(Max - Min)

1.2 计算第 j j j 项指标在第 i i i 年度时的指标值所占比重 p i j p_{ij} pij

p i j = x i j ∑ i = 1 m x i j , 0 ≤ p i j ≤ 1 p_{i j}=\frac{x_{i j}}{\sum_{i=1}^m x_{i j}}, 0 \leq p_{i j} \leq 1 pij=i=1mxijxij,0pij1

并由此得到一个由各指标在不同年度下所占比重组成的标准化矩阵:
Y = { p i j } m × n Y=\left\{p_{i j}\right\}_{m \times n} Y={pij}m×n

1.3 计算第项指标的嫡值 H j H_j Hj

H j = − K ∑ j = 1 m ( p i j ln ⁡ p i j ) , 0 ⩽ H j ⩽ 1 H_j=-K \sum_{j=1}^m\left(p_{ij} \ln p_{ij}\right), 0 \leqslant H_j \leqslant 1 Hj=Kj=1m(pijlnpij),0Hj1
其中,常数 K K K与评价体系中的考察年度数 m m m有关。对于一个信息完全无序的系统,其有序度为零,则熵值达到最大。此时 H j = 1 H_j=1 Hj=1,且 m m m个考察年度处于完全无序状态,则
p i j = 1 m p_{ij}=\frac{1}{m} pij=m1
H j = − K ∑ i = 1 m ( 1 m ln ⁡ 1 m ) = K ∑ i = 1 m ( 1 m ln ⁡ m ) = K ln ⁡ m = 1 H_j=-K \sum_{i=1}^m\left(\frac{1}{m} \ln \frac{1}{m}\right)=K \sum_{i=1}^m\left(\frac{1}{m} \ln m\right)=K \ln m=1 Hj=Ki=1m(m1lnm1)=Ki=1m(m1lnm)=Klnm=1
K = 1 ln ⁡ m K=\frac{1}{\ln m} K=lnm1
则此时第 j j j项指标的熵值 H j H_j Hj,可表示为:
H j = − 1 ln ⁡ m ∑ i = 1 m ( p i j ln ⁡ p i j ) , 0 ≤ H j ≤ 1 H_j=-\frac{1}{\ln m} \sum_{i=1}^m\left(p_{i j} \ln p_{i j}\right), \quad 0 \leq H_j \leq 1 Hj=lnm1i=1m(pijlnpij),0Hj1

1.4 计算第j项指标的差异系数 g j g_j gj

由于信息熵 H j H_j Hj用来度量 j j j项指标的信息(指标的数据)的效用价值,当完全无序时, H j = 1 H_j=1 Hj=1,此时, H j H_j Hj的信息(也就是指标的数据)对综合评价的效用值为零。因此,某项指标的信息效用价值取决于该指标的信息熵 H j H_j Hj与1的差值 g j g_j gj
g j = 1 − H j g_j=1-H_j gj=1Hj

计算指标比重、熵值及差异系数: 代码及注意事项

注意
在标准化过程中,若当前指标值是正指标且是最小值、或负撞标且是最大值时,则根据标准化公式会算出指标值所占比重 p i j = 0 pij=0 pij=0。而当下一步计算熵值 H j H_j Hj 时,需要对 p i j pij pij 取对数 l n ln ln,而若此时 p i j = 0 pij=0 pij=0,则得出的值就会是无穷大∞,在程序中体现就是nan值,因此,在此处计算指标值所占比重 p i j pij pij 时,若遇到计算结果等于0的情况,则将值稍微调大一点,调整为 1 × 1 0 − 6 1×10^{-6} 1×106

#下面求指标比重
def bizhong(df_bizhong):
    for column in df_bizhong.columns:
        sigma_xij = sum(df_bizhong[column])
        df_bizhong[column] = df_bizhong[column].apply(lambda x_ij: x_ij / sigma_xij if x_ij / sigma_xij != 0 else 1e-6)

    return df_bizhong
df_bizhong=bizhong(df)

#下面求熵值Hi
#先算K值
k=1/ np.log(9)           #考察年度为九年
# print(k)
h_j  = (-k) * np.array([sum([pij*np.log(pij) for pij in df_bizhong[column]]) for column in df_bizhong.columns])
h_js = pd.Series(h_j, index=df_bizhong.columns, name='指标的熵值')

#下面求差异系数
df_bianyi=pd.Series(1-h_j, index=df_bizhong.columns, name='差异系数')

1.5 计算第 j j j项指标的权重 ω j \omega_j ωj

由上式可以看出,利用熵值法估算各指标的权重,其本质是利用该指标信息的价值系数来计算的,其价值系数越高,对评价的重要性就越大(或称对评价结果的贡献越大),因此第 j j j项指标的权重可表示为:
ω j = g j ∑ j = 1 n g j \omega_j=\frac{g_j}{\sum_{j=1}^n g_j} ωj=j=1ngjgj

#下面计算指标权重
df_Weight = df_bianyi / sum(df_bianyi)
df_Weight.name = '指标权重'

1.6 计算综合得分并评价

多目标决策之熵权法_第1张图片
这里用到的数据应该给是正向化、标准化后的无量纲数据,去乘以权重;

思考:不然的话,原始数据的维度(量级)会对最后的得分情况有影响!


ref1:知乎 --> data_py数据文件
ref2:代码实战1
ref3:有B站视频
ref4:仅原理讲述
ref5:对应ref4的matlab代码
ref6:综合评价之熵值法+TOPSIS

你可能感兴趣的:(Python数学算法,Python精华,数学建模,python,数据分析)