1 熵值法的原理
熵值法是一种客观赋权方法,常用于综合评价和多指标决策分析中。它的基本原理是通过计算每个指标的信息熵,衡量该指标在不同样本中的差异程度。信息熵越小,说明该指标在样本间差异越大,包含的信息越多,因此该指标的权重越大;反之,信息熵越大,差异越小,权重越小。
熵值法的步骤
1 数据标准化
各指标的数据量纲不同,需要先进行标准化处理。一般使用极差标准化法(Min-Max标准化),将所有数据归一化到 [0, 1] 区间。标准化公式为:
正向指标(越大越好):
逆向指标(越小越好):
其中,Xij是第j个指标的第i个样本数据, 和 分别是第 j个指标的最小值和最大值。
2 计算各指标的比重值
对标准化后的数据按公式计算各指标在样本中的比重:
其中,Pij 表示第 j 个指标的第i个样本的比重值。
3 计算信息熵
根据各指标的比重值计算信息熵。信息熵公式为:
其中,Hj 为第 j个指标的信息熵,m 是样本数量,且当 Pij=0 时,定义 。
4 计算冗余度
冗余度是信息熵的补数,反映了指标的有效信息。公式为:
5 计算权重
各指标的权重由其冗余度的相对大小决定:
其中,Wj是第 jjj 个指标的权重,n 是指标的总数。
2 Python实现熵值法
1 输入数据文件夹
data中的原始数据
2 python实现代码
import pandas
import math
filename = "data.xlsx" #输入excel
path = "C:/Users/Administrator/Desktop/熵值法/"
data = pandas.read_excel(path+filename,sheet_name=0)
#保留原始数据
data_yuanshi = data.copy()
print(data)
max = data.max()
min = data.min()
cols = data.columns
#归一化数据
for i in range(data.shape[0]):
for j in range(data.shape[1]):
data.iloc[i,j] = (float(data.iloc[i,j])-float(min[cols[j]]))/(float(max[cols[j]])-float(min[cols[j]]))
data_guiyi = data.copy()
print(data)
#存储每一条记录的熵
result_sum_col = []
for j in range(data.shape[1]):
sum_col = data[cols[j]].sum()
# print(sum_col)
for i in range(data.shape[0]):
if data.iloc[i,j] == 0:
#计算Log(0)是会报错,需要特殊处理
data.iloc[i, j] = 0
else:
data.iloc[i,j] = -1*(data.iloc[i,j]/sum_col)*math.log10((data.iloc[i,j]/sum_col))
#该指标的熵等于各记录熵的和除以Log(n),n为记录的条数
result_sum_col.append(data[cols[j]].sum()/math.log10(data.shape[0]))
# print(result_sum_col)
print(data)
weight = []
weight_sum = 0.0
for i in result_sum_col:
weight_sum += i
'''
i表示各个维度的熵,n表示维度的个数
各维度计算公式为(1-i)/(n-sum_i)
'''
for i in result_sum_col:
weight.append((1-i)/(float(data.shape[1])*1-weight_sum))
print(weight)
#计算各记录最终得分并另存文件(归一化数据文件)
cores2 = []
for i in range(data_guiyi.shape[0]):
result_core = 0
for j in range(data_guiyi.shape[1]):
result_core += float(data_guiyi.iloc[i,j])*weight[j]
cores2.append(result_core)
print(cores2)
data_guiyi["最终评分"] = cores2
print(data_guiyi)
'''
熵文件中不用计算最终得分,但要写入指标权重
'''
data.loc["权重"] = weight
print(data)
#保存文件
file02 = filename.split(".")[0]+"归一化.xlsx"
file03 = filename.split(".")[0]+"熵.xlsx"
data_guiyi.to_excel(path+file02,index=False)
data.to_excel(path+file03)
3 输出数据
输出数据中包含2个xlsx表
data熵表格中包含了每个指标的熵值,并在最后一行输出了每个指标的权重
data归一化表格中包含各个指标归一化后的数据,以及最终得分