指标权重的选择,直接影响评价指标体系的公正性及预测的准确性,因此指标权重的确定更需要讲究客观性。熵值权重法是一种客观确定权重的方法。
熵权法根据各指标的变异程度,利用信息熵计算出各指标的熵权,再通过熵权对各指标的权重进行修正,从而得到较为客观的指标权重。
在信息系统中的信息熵是信息无序度的度量,信息熵越大,信息的无序度越高,其信息的效用值越小;
反之,信息熵越小,信息的无序度越小,信息的效用值越大。因此可以运用信息熵评价所获系统信息的有序程度及信息的效用值。
在评价体系中,指标的信息熵越大,则其信息的效用值越小,因此赋予该指标较小的指标权重;
指标的信息熵越小,则其信息的效用值越大,因此赋予该指标较大的指标权重。
正向指标 | 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}xi−min{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}xi−min{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)
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,0≤pij≤1
并由此得到一个由各指标在不同年度下所占比重组成的标准化矩阵:
Y = { p i j } m × n Y=\left\{p_{i j}\right\}_{m \times n} Y={pij}m×n
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=1∑m(pijlnpij),0⩽Hj⩽1
其中,常数 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=1∑m(m1lnm1)=Ki=1∑m(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=1∑m(pijlnpij),0≤Hj≤1
由于信息熵 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=1−Hj
注意
:
在标准化过程中,若当前指标值是正指标且是最小值、或负撞标且是最大值时,则根据标准化公式会算出指标值所占比重 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×10−6
#下面求指标比重
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='差异系数')
由上式可以看出,利用熵值法估算各指标的权重,其本质是利用该指标信息的价值系数来计算的,其价值系数越高,对评价的重要性就越大(或称对评价结果的贡献越大),因此第 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 = '指标权重'
这里用到的数据应该给是正向化、标准化后的无量纲数据,去乘以权重;
思考:不然的话,原始数据的维度(量级)会对最后的得分情况有影响!
ref1:知乎 --> data_py数据文件
ref2:代码实战1
ref3:有B站视频
ref4:仅原理讲述
ref5:对应ref4的matlab代码
ref6:综合评价之熵值法+TOPSIS