熵权法确定指标的权重——Python代码

        熵权法是目前最常用的确定评价指标权重的方法之一。熵是热力学的物理概念,是衡量一个体系混乱或无序度的度量,熵越大表示系统越混乱,所反映的信息越少,反之反映的信息越多。

熵权法计算权重可以分为以下几步:

第一步:计算第 项指标在第 个样本占该指标的比重及熵值,公式如下:

P_{ij} = \frac{Z_{ij}}{\sum\left ( Z _{ij}\right )}        (j = 1,2,…,m)

e_{j} = -k\cdot \sum_{i=1}^{n}(P_{ij}\ln (P_{ij})))

式中,Z_{ij}是标准化指标P_{ij}为第j项指标下第 年占该指标的比重,式中,k是系数,k=1/ln(n),且满足e_{j}> 0

第二步:计算第 项指标的差异系数:

g_{j} = 1 - e_{j}

对于第 项指标,指标值Z_{ij} 的差异越大,对目标评价的作用越大,熵值就越小,e_{j} 越大指标越重要。

第三步:确定指标权重

W_{j} = \frac{g_{j}}{\sum_{j=1}^{m}\left ( g_{j}\right )}

下面是利用熵权法确定权重的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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值