熵值法是一种客观赋权法,其根据各项指标观测值所提供的信息的大小来确定指标权重。指标值的差距越大,则该指标在综合评价中所起的作用越大;如果某项指标的指标值全部相等,则该指标在综合评价中不起作用。
在信息论中,熵是对不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性就越大,熵也越大。根据熵的特性,我们可以通过计算熵值来判断一个方案的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响越大。因此,可根据各项指标的变异程度,利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。
算法实现过程
数据矩阵如下:
步骤1:数据的非负数化处理
由于熵值法计算采用的是各个方案某一指标占同一指标值总和的比值,因此不存在量纲的影响,不需要进行标准化处理,若数据中有负数,就需要对数据进行非负化处理!此外,为了避免求熵值时对数的无意义,需要进行数据平移:
对于越大越好的指标:
对于越小越好的指标:
代码实现如下:
#定义熵值法函数
def cal_weight(x):
'''熵值法计算变量的权重'''
# 数据MinMax标准化
import numpy as np
import math
x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))))
# 求k
rows = x.index.size # 行
cols = x.columns.size # 列
k = 1.0 / math.log(rows)
lnf = [[None] * cols for i in range(rows)]
# 矩阵计算--
# 信息熵
# p=array(p)
import math
from numpy import array
x = array(x)
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] / x.sum(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)
return w
import pandas as pd
address = "SYSTEM/oracle@localhost:1521/ORCL"
sql33 = "select * from hr2"
dfhr2 = visitOracle(address , sql33)
x = dfhr2[['SATISFACTION_LEVEL' , 'NUMBER_PROJECT' , 'AVERAGE_MONTHLY_HOURS' , 'TIME_SPEND_COMPANY' , 'WORK_ACCIDENT' ]]
w = cal_weight(x) # 调用cal_weight]
print(w)