文章目录

  • 0 背景
  • 1 原理
    • 1.1 标准化
    • 1.2 信息熵
    • 1.3 权重
  • 1.4 计算评分
  • 2 代码实现

0 背景

因为最近在用python做数据科学方面的内容,在网上查看了很多Python的熵权法实现,没有发现一个令人满意的实现。很多都无法运行,或者是只针对正向指标,或者是只计算权重,没有计算综合评分。基于以上的原因,在参考一些博主的代码后,自己完善了上面的缺点。运行结果如下图所示,可以显示原始数据、归一化后的结果、参数的熵、每个物件的评分,平均评分、权重信息。

结果:

原始数据:        a       b       c       d
0  0.5537  0.3047  0.0000  0.3207
1  0.5221  0.4371  0.1851  0.3282
2  0.5133  0.3436 -0.0288  0.3321
3  0.5688  0.5225  0.3011  0.3365
4  0.5498  1.0353 -0.1522  0.3302
5  0.5104  0.9051  0.1549  0.3424
label:{'a': 1, 'b': 2, 'c': 1, 'd': 1}
标准化:          a         b         c         d
0  0.741438  1.000000  0.335760  0.000000
1  0.200342  0.818779  0.744099  0.345622
2  0.049658  0.946756  0.272226  0.525346
3  1.000000  0.701889  1.000000  0.728111
4  0.674658  0.000000  0.000000  0.437788
5  0.000000  0.178210  0.677476  1.000000
参数的熵          a         b         c         d
0  0.278099  0.274301  0.110828  0.000000
1  0.075145  0.224592  0.245613  0.113809
2  0.018626  0.259696  0.089857  0.172989
3  0.375080  0.192529  0.330081  0.239757
4  0.253051  0.000000  0.000000  0.144158
5  0.000000  0.048883  0.223622  0.329287
record:[56.16, 48.96, 39.51, 87.92, 32.54, 39.0]
record_average:50.68weight
a  0.353495
b  0.224368
c  0.223704
d  0.198433

1 原理

1.1 标准化

1.2 信息熵

1.3 权重

1.4 计算评分

2 代码实现

其实代码就是上面公式的实现,具体代码如下:

import pandas as pd
import numpy as np
import math
from numpy import array
import copy# 熵值法函数 求指标权重
def cal_entropy_weight(x, label = dict()):'''熵值法计算变量的权重'''print('原始数据:'+ str(x))# 获得表的列头x_header = x.keys()# 初始化默认的label:1为正向指标 2 为负向指标if len(label) == 0:for key in x_header:label[key] = 1print('label:'+str(label))# 标准化for key in label:# 得到列最大和最小maxium = np.max(x[key], axis=0)minium = np.min(x[key], axis=0)# print('maxium:' + str(maxium))# print('minium:' + str(minium))if label[key] == 1:# 正向指标x[key] = x.loc[:, key].apply(lambda x: ((x - minium) / (maxium - minium)))# x[key].apply(lambda x: ((x - maxium) / (np.max(x) - np.min(x))))elif label[key] == 2: # 负向指标x[key] = x.loc[:, key].apply(lambda x: ((maxium - x) / (maxium - minium)))else:print('输入的数据标签有误!')return# x_standardized.append(pd.DataFrame({key:temp_x}), ignore_index=True)# print('x_standardized:' + str(x))# 真向标准化# x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))))# 负向标准化# x = x.apply(lambda x: ((np.max(x) - x) / (np.max(x) - np.min(x))))# 获得标准化的表中的值x_standardized_data = list(x.to_dict().values())print('标准化:' + str(x))# 求krows = x.index.size  # 行cols = x.columns.size  # 列k = 1.0 / math.log(rows)lnf = [[None] * cols for i in range(rows)]# 矩阵计算--# 信息熵# p=array(p)x = array(x)lnf = [[None] * cols for i in range(rows)]lnf = array(lnf)# p_arry = array()temp_p_list = list()p_row_list = list()for i in range(0, rows):for j in range(0, cols):if x[i][j] == 0:lnfij = 0.0p_row_list.append(0.0000)else:p = x[i][j] / x.sum(axis=0)[j]# print(type(p))p_row_list.append(p)lnfij = math.log(p) * p * (-k)lnf[i][j] = lnfijtemp_p_list.append(copy.deepcopy(p_row_list))p_row_list.clear()# 行列转置p_list = [[r[col] for r in temp_p_list] for col in range(len(temp_p_list[0]))]p_dict = dict()p_num = 0for k in x_header:p_dict[k] = p_list[p_num]p_num += 1p_df = pd.DataFrame(p_dict)# print(p_list)print('参数的熵' + str(p_df))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# 计算各样本的综合得分,用标准化后的数据   record_row = 0.0record = list()record_sum = 0.00x_standardized_data =  [[r[col] for r in x_standardized_data] for col in range(len(x_standardized_data[0]))]# print('转置后的标准化:'+str(x_original_data))for i in range(len(x_standardized_data)):for j in range(len(x_standardized_data[i])):# print('x_original_data[i][j]' + str(x_original_data[i][j]))# print('w:' + str(w[i]))record_sum += x_standardized_data[i][j]*w[j]record_row += x_standardized_data[i][j]*w[j]# print('record_row:' + str(round(record_row, 2)))record.append(round(record_row * 100, 2))record_row = 0.0print('record:' + str(record))record_average = round(record_sum/len(record)*100, 2)print('record_average:' + str(record_average))w = pd.DataFrame(w)return w

测试数据:

a = {'1': 0.5537, '2': 0.5221, '3': 0.5133, '4': 0.5688, '5': 0.5498, '6': 0.5104}
b = {'1': 0.3047, '2': 0.4371, '3': 0.3436, '4': 0.5225, '5': 1.0353, '6': 0.9051}
c = {'1': 0.0000, '2': 0.1851, '3': -0.0288, '4': 0.3011, '5': -0.1522, '6': 0.1549}
d = {'1': 0.3207, '2': 0.3282, '3': 0.3321, '4': 0.3365, '5': 0.3302, '6': 0.3424}
deal_b= dict()
for key, value in b.items():deal_b[key] = abs(b[key] - 1)
data = {'a':list(a.values()), 'b':list(b.values()), 'c':list(c.values()), 'd':list(d.values())}
label = {'a':1, 'b':2, 'c':1, 'd':1}# # 求熵权法
df = pd.DataFrame(data)
df.dropna()
w = cal_entropy_weight(df, label)  # 调用cal_weight
w.index = df.columns
w.columns = ['weight']
print(w)

Python实现熵权法(正负指标)并计算综合评分—————附增完整代码和测试用例相关推荐

  1. df满足条件的值修改_如何用python实现熵值法求指标权重(实例)

    权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...

  2. 利用熵权法确定指标权重

    利用熵权法确定指标权重 1. 熵权法的基本原理 熵权法的基本思路是根据指标变异性的大小来确定客观权重. 一般来说,若某个指标的信息熵越小,表明指标值得变异程度越大,提供的信息量越多,在综合评价中所能起 ...

  3. python中是什么意思权重_如何用python实现熵值法求指标权重(实例)

    权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...

  4. 评价方法-熵权法确定指标权重

    评价方法根据确定权重的方法,大体上可分为主观赋权,客观赋权:主观赋权依赖于"专家"的权重或较多独立个体的评判偏好,如层次分析法,功效系数法,模糊综合评价法,综合指数法:客观赋权法根 ...

  5. 【综合评价方法 熵权法】指标权重确定方法之熵权法

    参考链接:http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html 实战例子: 某医院为了提高自身的护理水平,对拥有的11个科室进行了考核,考核标准包括 ...

  6. Python小案例(六)通过熵权法计算指标权重

    Python小案例(六)通过熵权法计算指标权重 在日常业务中,产品运营需要综合多个指标进行判断,如果没有目标变量进行监督训练的话,很难人为地判断哪个指标更好,综合起来哪个类别更优秀. 这里介绍一种基于 ...

  7. 帮我用python写一个程序 输入三个列表数据 使用熵权法计算这三组数据的权重并输出...

    好的,以下是用Python实现熵权法计算三组数据权重的代码: import numpy as np# 定义熵权法函数 def entropy_weight(x):x = np.array(x)# 计算 ...

  8. 数据运营系列(三):熵权法如何确定指标权重构建评价体系

    1. 熵权法 信息论基本原理解释信息是系统有序性的度量单位,而熵可以度量系统的无序程度:如果某个指标的信息熵越小,该指标提供的信息量越大,指标变异程度(方差)高,因此在综合评价中所起作用理当越大,权重 ...

  9. 《零基础数学建模》——TOPSIS+熵权法

    目录 ​ 前言 一.TOPSIS法(优劣解距离法) 1.模型原理 2.建模步骤 二.模型实现 第一步:将原始矩阵正向化 第二步:正向化矩阵标准化 第三步:计算得分并归一化 四.TOPSIS模型的总结与 ...

  10. [数据分析][评价方法]打分式评价-信息熵理论与熵权法

    前言: 信息熵是一种用于衡量系统内部信息量的度量.在信息论中,信息是系统有序程度的一种度量. 信息是确定性的增加,不确定性的减少(香农定理).而信息熵是系统无序程度的一种度量,是系统不确定性的量度.两 ...

最新文章

  1. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
  2. 【Eclipse】推荐UML插件Green UML、AmaterasUML
  3. 大牛整理:java去掉字符串中的逗号
  4. 【问链财经-区块链基础知识系列】 第二十六课 隐私保护方法:多方安全计算和区块链
  5. Android----Fragments详解
  6. Java并发教程–锁定:显式锁定
  7. python.day05
  8. php 判断 跳转url参数,怎么通过链接获取跳转后的url参数
  9. 技术支持和研发哪个好_考拉海购技术支持的前世今生,聊聊家常“黑历史”
  10. linux ext4,ext3的特点和区别
  11. python 物联网服务器_python+树莓派实现IoT(物联网)数据上传到服务器
  12. Dubbo视频教程《基于Dubbo的分布式系统架构视频教程》--课程列表
  13. Cortex-M3 (NXP LPC1788)之IIS控制器
  14. 超棒工具8个高质量图标搜索引擎
  15. SpringCloud与微服务Ⅷ --- Hystrix断路器
  16. javaweb指导书
  17. 渗透测试 | IP信息收集
  18. 图片怎么加水印?添加水印其实很简单
  19. Educoder 机器学习 决策树使用之使用决策树预测隐形眼镜类型
  20. 基于python和md5的相同图片查重

热门文章

  1. serializer嵌套序列化
  2. 最全公司章程自由规定事项
  3. 【带着问题学PMP】【4.1】制定项目章程
  4. svm手写数字识别python_SVM之Mnist手写数字识别
  5. Informatic 9.0 client和server 安装配置
  6. 2020年度美国最受市场欢迎的十大编程语言
  7. **带I2C的LCD1602液晶显示51单片机程序**
  8. Web前端:一些用于Web开发的最佳精选IDE和代码编辑器
  9. 菜鸟的JavaScript自学笔记整理
  10. tpadmin的坑收集 nginx下配置tp5失败