Python实现熵权法(正负指标)并计算综合评分—————附增完整代码和测试用例
文章目录
- 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实现熵权法(正负指标)并计算综合评分—————附增完整代码和测试用例相关推荐
- df满足条件的值修改_如何用python实现熵值法求指标权重(实例)
权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...
- 利用熵权法确定指标权重
利用熵权法确定指标权重 1. 熵权法的基本原理 熵权法的基本思路是根据指标变异性的大小来确定客观权重. 一般来说,若某个指标的信息熵越小,表明指标值得变异程度越大,提供的信息量越多,在综合评价中所能起 ...
- python中是什么意思权重_如何用python实现熵值法求指标权重(实例)
权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...
- 评价方法-熵权法确定指标权重
评价方法根据确定权重的方法,大体上可分为主观赋权,客观赋权:主观赋权依赖于"专家"的权重或较多独立个体的评判偏好,如层次分析法,功效系数法,模糊综合评价法,综合指数法:客观赋权法根 ...
- 【综合评价方法 熵权法】指标权重确定方法之熵权法
参考链接:http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html 实战例子: 某医院为了提高自身的护理水平,对拥有的11个科室进行了考核,考核标准包括 ...
- Python小案例(六)通过熵权法计算指标权重
Python小案例(六)通过熵权法计算指标权重 在日常业务中,产品运营需要综合多个指标进行判断,如果没有目标变量进行监督训练的话,很难人为地判断哪个指标更好,综合起来哪个类别更优秀. 这里介绍一种基于 ...
- 帮我用python写一个程序 输入三个列表数据 使用熵权法计算这三组数据的权重并输出...
好的,以下是用Python实现熵权法计算三组数据权重的代码: import numpy as np# 定义熵权法函数 def entropy_weight(x):x = np.array(x)# 计算 ...
- 数据运营系列(三):熵权法如何确定指标权重构建评价体系
1. 熵权法 信息论基本原理解释信息是系统有序性的度量单位,而熵可以度量系统的无序程度:如果某个指标的信息熵越小,该指标提供的信息量越大,指标变异程度(方差)高,因此在综合评价中所起作用理当越大,权重 ...
- 《零基础数学建模》——TOPSIS+熵权法
目录 前言 一.TOPSIS法(优劣解距离法) 1.模型原理 2.建模步骤 二.模型实现 第一步:将原始矩阵正向化 第二步:正向化矩阵标准化 第三步:计算得分并归一化 四.TOPSIS模型的总结与 ...
- [数据分析][评价方法]打分式评价-信息熵理论与熵权法
前言: 信息熵是一种用于衡量系统内部信息量的度量.在信息论中,信息是系统有序程度的一种度量. 信息是确定性的增加,不确定性的减少(香农定理).而信息熵是系统无序程度的一种度量,是系统不确定性的量度.两 ...
最新文章
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
- 【Eclipse】推荐UML插件Green UML、AmaterasUML
- 大牛整理:java去掉字符串中的逗号
- 【问链财经-区块链基础知识系列】 第二十六课 隐私保护方法:多方安全计算和区块链
- Android----Fragments详解
- Java并发教程–锁定:显式锁定
- python.day05
- php 判断 跳转url参数,怎么通过链接获取跳转后的url参数
- 技术支持和研发哪个好_考拉海购技术支持的前世今生,聊聊家常“黑历史”
- linux ext4,ext3的特点和区别
- python 物联网服务器_python+树莓派实现IoT(物联网)数据上传到服务器
- Dubbo视频教程《基于Dubbo的分布式系统架构视频教程》--课程列表
- Cortex-M3 (NXP LPC1788)之IIS控制器
- 超棒工具8个高质量图标搜索引擎
- SpringCloud与微服务Ⅷ --- Hystrix断路器
- javaweb指导书
- 渗透测试 | IP信息收集
- 图片怎么加水印?添加水印其实很简单
- Educoder 机器学习 决策树使用之使用决策树预测隐形眼镜类型
- 基于python和md5的相同图片查重