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

1 熵值法的原理

熵值法是一种客观赋权方法,常用于综合评价和多指标决策分析中。它的基本原理是通过计算每个指标的信息熵,衡量该指标在不同样本中的差异程度。信息熵越小,说明该指标在样本间差异越大,包含的信息越多,因此该指标的权重越大;反之,信息熵越大,差异越小,权重越小。

熵值法的步骤

数据标准化

各指标的数据量纲不同,需要先进行标准化处理。一般使用极差标准化法(Min-Max标准化),将所有数据归一化到 [0, 1] 区间。标准化公式为:

正向指标(越大越好):

Z_{ij} = \frac{X_{ij} - X_{j,\min}}{X_{j,\max} - X_{j,\min}}

逆向指标(越小越好):

Z_{ij} = \frac{X_{j,\max} - X_{ij}}{X_{j,\max} - X_{j,\min}}

其中,Xij是第j个指标的第i个样本数据,X_{j,\min}X_{j,\max}分别是第 j个指标的最小值和最大值。

2 计算各指标的比重值

对标准化后的数据按公式计算各指标在样本中的比重:

P_{ij} = \frac{Z_{ij}}{\sum_{i=1}^{m} Z_{ij}}

其中,Pij​ 表示第 j 个指标的第i个样本的比重值。

3 计算信息熵

根据各指标的比重值计算信息熵。信息熵公式为:

H_j = -\frac{1}{\ln(m)} \sum_{i=1}^{m} P_{ij} \ln(P_{ij})

其中,Hj​ 为第 j个指标的信息熵,m 是样本数量,且当 Pij=0 时,定义  P_{ij} \ln(P_{ij}) = 0

4 计算冗余度

冗余度是信息熵的补数,反映了指标的有效信息。公式为:

D_j = 1 - H_j

5 计算权重

各指标的权重由其冗余度的相对大小决定:

W_j = \frac{D_j}{\sum_{j=1}^{n} D_j}

其中,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值