作用
熵是指物质的分散程度,熵越大,说明物质越没有条理。同理,用在数据的指标上,当熵越大时,说明该数据越散乱,数据就越没有价值。
当给一组数据不同权重,让这组数据共同表示出该数据的特征时,该组数据的熵越大,说明数据越没有条理,对于指标的特征表示价值就越小。
因此通过熵权法对判定每组数据的每个类型权重是有一定指导作用的。
内容
-
将数据归一化处理,选择最常用的最大最小归一化,处理数据。
-
将处理好的数据,分别求出该数据在该类型中的占比情况,形成占比矩阵
-
利用求熵公式,分别求出每一类信息的熵
- 该公式需要注意所有熵之和为1,即每个类型的熵相加=1,p值一纸,k值可求
- 该公式需要注意所有熵之和为1,即每个类型的熵相加=1,p值一纸,k值可求
-
通过熵值,算出权重,即该类型数据在该比重中的占比
代码实现
由于没有相关库,所以代码自己进行实现,其中代码利用了pandas、numpy对数据进行操作
def cal_weight(x):
'''熵值法计算变量的权重'''
# 归一化
x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))))
# 对数据信息收集
rows = x.index.size # 行
cols = x.columns.size # 列
# 计算k值
k = 1.0 / math.log(rows)
# 计算logm值
lnf = [[None] * cols for i in range(rows)]
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