python 实现熵权法确定各指标的权重

python 实现熵权法确定各指标的权重

熵权法是一种客观赋权方法,计算步骤如下:
a.构建各年份各评价指标的判断矩阵:
b.将判断矩阵进行归一化处理, 得到归一化判断矩阵:
c.根据熵的定义,根据各年份评价指标,可以确定评价指标的熵。
d.定义熵权。定义了第n个指标的熵后,可得到第n个指标的熵权。
f.计算系统的权重值.

要求表格形式

表格整理格式如下,但是下面的代码中没有设置不读取第一列,所以需删除第一列的名称(此列为字符串格式,不能列入计算范围)
数据表整理格式

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@author: xiaosu
"""
import pandas as pd
import numpy as np
import math
from numpy import array
 
# 1读取数据
df = pd.read_excel('表格名.xlsx', encoding='gb2312')
# 2数据预处理 ,去除空值的记录
df.dropna()
 
#定义熵值法函数
def cal_weight(x):
    '''熵值法计算变量的权重'''
    # 标准化
    x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))))
    '''
    如果数据实际不为零,则赋予最小值
    if x==0:
        x=0.00001
    else:
        pass
    '''
    # 求k
    rows = x.index.size  # 行
    cols = x.columns.size  # 列
    k = 1.0 / math.log(rows)
 
    lnf = [[None] * cols for i in range(rows)]
 
    # 矩阵计算--
    # 信息熵

    x = array(x)
    lnf = [[None] * cols for i in range(rows)]
    lnf = array(lnf)
    for i in range(0, rows):
        for j in range(0, cols):
            if x[i][j] == 0:
                lnfij = 0.0
            else:
                p = x[i][j] / x.sum(axis=0)[j]
                lnfij = math.log(p) * p * (-k)
            lnf[i][j] = lnfij
    lnf = pd.DataFrame(lnf)
    E = lnf
 
    # 计算冗余度
    d = 1 - E.sum(axis=0)
    # 计算各指标的权重
    w = [[None] * 1 for i in range(cols)]
    for j in range(0, cols):
        wj = d[j] / sum(d)
        w[j] = wj
        # 计算各样本的综合得分,用最原始的数据
    
    w = pd.DataFrame(w)
    return w

if __name__ == '__main__':
    # 计算df各字段的权重
    w = cal_weight(df)  # 调用cal_weight
    w.index = df.columns
    w.columns = ['weight']
    print(w)            #输出权重
    print('熵权法计算权重运行完成!')

数据计算结果如下图:(只是部分截图)
部分计算权重截图
关于程序中的部分说明:
1.本文中所用的是 min-max标准化(Min-Max Normalization)
2.遇到负向指标: 归一化是将数据变成0-1之间的小数,将有量纲变成无量纲。所以负向指标中的数据提前加上负号(但是计算出来的权重可能不是小于零的)(本人涉及不深,今后会逐步补充完善)
3.关于负向指标的标准化,貌似有不同的计算中(印象中),再看到就加进去

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小酥muse

不想填问卷,打赏1元获得提取码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值