熵值法的原理及python实现(处理excel数据)

admin 9440次浏览

摘要:1 熵值法的原理 熵值法是一种客观赋权方法,常用于综合评价和多指标决策分析中。它的基本原理是通过计算每个指标的信息熵,衡量该指标在

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归一化表格中包含各个指标归一化后的数据,以及最终得分

3 原始数据链接:https://drive.google.com/drive/folders/1U5zXKxGxTlei0yf0k6iJWE327s26Y4rc?usp=drive_link

相关文章
友情链接