熵权法是目前最常用的确定评价指标权重的方法之一。熵是热力学的物理概念,是衡量一个体系混乱或无序度的度量,熵越大表示系统越混乱,所反映的信息越少,反之反映的信息越多。
熵权法计算权重可以分为以下几步:
第一步:计算第 j 项指标在第 i 个样本占该指标的比重及熵值,公式如下:
(j = 1,2,…,m)
式中,是标准化指标为第j项指标下第 i 年占该指标的比重,式中,k是系数,k=1/ln(n),且满足。
第二步:计算第 j 项指标的差异系数:
对于第 j 项指标,指标值 的差异越大,对目标评价的作用越大,熵值就越小, 越大指标越重要。
第三步:确定指标权重
下面是利用熵权法确定权重的Python代码:
# -*- coding: utf-8 -*-
#加载包
import pandas as pd
import numpy as np
#定义归一化计算函数,最小-最大值方法对指标数据进行归一化处理
def positiveIndex_fun(x):#正向指标
return (x-x.min())/(x.max()-x.min())
def negativeIndex_fun(x):#负向指标
return (x.max()-x)/(x.max()-x.min())
#计算熵值
def entropy_fun(z):
p = z/sum(z)
n = len(p) # 获取输入向量p的长度
lnp = np.zeros(n) # 创建一个长度为n,元素都为0的新数组lnp
for i in range(n): # 对向量p的每一个元素进行循环
if p[i] == 0: # 如果当前元素的值为0
lnp[i] = 0 # 则在lnp中对应位置也设置为0,因为log(0)是未定义的,这里我们规定为0
else:
lnp[i] = np.log(p[i]) # 如果p[i]不为0,则计算其自然对数并赋值给lnp的对应位置
entropy = -sum(p*lnp)/np.log(n)
return entropy # 返回计算后的对数数组
#计算差异系数
def CoefVar(e):
g = 1-e
return g
#加载数据,csv格式数据。数据格式为:每列表示每个指标,每行表示每个样本
data = pd.read_csv(r'Your_data.csv')
#为了便于书写,将指标名称进行编号
data.columns = ['Index1','Index2','Index3','Index4','Index5']#假设有5个指标
#将正向指标和负向指标分开计算
negativeIndex = data2[['Index1','Index2']]#假设第一和第二个指标为负向指标
positiveIndex =data2.drop(['Index1','Index2'],axis=1)#删除两列负向指标,剩下正向指标
#计算归一化数据
nor_negIndex = negativeIndex.apply(negativeIndex_fun)
nor_posIndex = positiveIndex.apply(positiveIndex_fun)
normal_data = pd.concat([nor_negIndex,nor_posIndex],axis=1)#将归一化数据进行合并
###计算权重
#计算熵值
entropy_df = normal_data.apply(entropy_fun)#对每一列计算熵值
entr_data = np.array(entropy_df).T#对数据进行转置
#计算指标的差异系数
CoVar = CoefVar(entr_data)
#计算权重
Weights = CoVar/sum(CoVar)
标签:权重,Python,lnp,指标,entropy,计算,fun,data,权法
From: https://blog.csdn.net/weixin_54435620/article/details/143260400