熵值法原理及Python实现的示例详解

目录
  • 1.简单理解 信息熵
  • 2.编制指标 (学术情景应用)
  • 3.python实现
    • 3.1 数据准备
    • 3.2 数据预处理
    • 3.3 熵值、权重计算
    • 3.4 编制综合评价指标

熵值法也称熵权法,是学术研究,及实际应用中的一种常用且有效的编制指标的方法。

1.简单理解 信息熵

机器学习中的决策树算法是对信息熵的一种典型的应用。

在信息论中,使用 熵 (Entropy)来描述随机变量分布的不确定性。

假设对随机变量X,其可能的取值有x1,x2,...,xn 。即有n种可能发生的结果。其对应发生的概率依次为p1,p2,...,pn,则事件pi对应的信息熵为:

信息熵中log的底数通常为2,理论上可以使用不同的底数。

如何理解信息熵呢,假设已知今天是周日,则对于“明天是周几”这件事,只有一种可能的结果:是周一,且p=1。则“明天是周几”的信息熵H(X)为−1×log1=0,取信息熵的最小值0。表示“明天是周几”这个话题的不确定性很低,明天周几很确定。

再比如抛一枚硬币,则结果为正面和反面的概率都是0.5。则信息熵为log2,相比“明天周几”这件事的信息熵稍大些了。

假设某事情有100中可能的结果,每种结果发生的概率为0.01。则H(X)=log100,对于等概率均匀分布的事件,不确定的结果种类越多,则熵越大。

2.编制指标 (学术情景应用)

迁移到编制指标的情形,通过下边一个简单的示例理解熵权法在学术研究中的应用。

以陈浩,刘媛华的论文《数字经济促进制造业高质量发展了吗?——基于省级面板数据和机器学习模型的实证分析》中部分内容展示为例:

对于离散型的随机变量,某指标在样本中出现的频率即可视为概率P,进而求出每个指标的熵值。

而对于上图中的连续型的随机变量,则在处理思想上与离散型随机变量有所不同。

通常可以先对数据做标准化处理,假设X指标中的第i个样本的标准化处理结果为Zi:(注意对正向指标和负)

则指标X中的第i个样本的权重为:

上边说到,指标的熵值计算公式为:

为了方便求变异系数,这里计算熵值的时候常常在该公式的基础上再乘以一个常数K,即

其中K=1/ln(n) ,n是样本的个数。易知,乘以常数后计算出的熵值,通常范围都是在区间[0,1]内的。

举个例子,假设一共有十个样本,且十个样本的连续型X指标数值非常相近,甚至完全一致。

对数的底数取10,则每个样本的权重都有接近或等于1/10。

通过公式

计算出的熵值则为1,然后引入一个新的指标“差异系数”来刻画数据之间的差异性大小(即使用1减去熵值得到所谓“差异系数”,不要跟变异系数混淆),第j个指标的差异系数dj​=1−Hj​(H_j为第j个指标的熵值)

计算可知差异系数为0。则说明该指标在数值上不存在任何差异(雀食如此)。

随着数据本身数值上的差距的提升,指标的熵值会逐步减小,差异系数逐渐增大。这样说相信很容易理解了。

指标的熵值越小(差异系数越大),则该指标在最终要编制的指标中所占的权重则越大。

具体的权重计算公式为:

即某指标差异系数占所有指标差异系数和的比重。

上图的情景中,作者首先对二级指标进行衡量,然后使用熵权法,求出每个二级指标的熵值,进而求出权重,分别计算出四个一级指标;

然后再对四个一级指标再次使用熵权法计算权重,进而得到最终指标:制造业高质量发展水平。

3.python实现

3.1 数据准备

为方便读者测试,这边手动生成一段数据作为示例。

将指标1,指标2,指标3,指标4,合并编制为一个“综合指标”。

import pandas as pd
import numpy as np

# 1. 初始数据 假设指标4是负向指标,其余三个为正向指标
df1 = pd.DataFrame({'指标1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                    '指标2': [2, 4, 6, 8, 10, 2, 4, 6, 8, 10],
                    '指标3': [1, 2, 1, 3, 2, 1, 3, 2, 3, 1],
                    '指标4': [3, 1, 2, 3, 5, 8, 7, 8, 8, 9]
                   })
print(df1)

数据为DataFrame格式,效果展示如下:

3.2 数据预处理

然后是数据预处理部分,这里定义一个泛用性较强的标准化处理函数,

该函数对于正向指标和负向指标(越大越好的指标和越小越好的指标),可以分别进行不同的处理。

(处理逻辑通过代码可以很容易看出)

同时该函数也可以兼容只进行其中一种处理的情景。

# 2.数据预处理 定义标准化处理函数
def Standardization(data,cols1=None, cols2=None):
    """
    :param data:目标数据
    :param cols1: 需要处理的正向指标列名列表,类型为列表或None [col1, col2, col3]
    :param cols2: 需要处理的负向指标列名列表,类型为列表或None [col1, col2, col3]
    :return: 输出处理结果
    """
    if cols1 == None and cols2 == None:
        return data
    elif cols1 != None and cols2 == None:
        return (data[cols1] - data[cols1].min())/(data[cols1].max()-data[cols1].min())
    elif cols1 == None and cols2 != None:
        return (data[cols2].max - data[cols2])/(data[cols2].max()-data[cols2].min())
    else:
        a = (data[cols1] - data[cols1].min())/(data[cols1].max()-data[cols1].min())
        b = (data[cols2].max() - data[cols2])/(data[cols2].max()-data[cols2].min())
        return pd.concat([a, b], axis=1)

调用函数,进行标准化处理:

df2 = Standardization(df1, cols1=['指标1', "指标2", "指标3"], cols2=['指标4'])
print(df2)

处理结果如下:

3.3 熵值、权重计算

然后定义一个通过熵值计算权重,及样本评分的函数。

def Weightfun(data):
    """
    :param data: 预处理好的数据
    :return: 输出权重。
    """
    K = 1/np.log(len(data))
    e = -K*np.sum(data*np.log(data))
    d = 1-e
    w = d/d.sum()
    return w

该函数的返回值有两个,w是权重,score是评分

调用函数,计算出各个指标的权重:

w = Weightfun(df2)
print(w)

各个指标权重如下图所示:

3.4 编制综合评价指标

直接将DataFrame格式的数据与求出的权重相乘,并求和,即得到通过熵值法编制出的综合指标,代码及结果如下图所示:

df3= df2 * w
df3['综合指标'] = df3.sum(axis=1)

到此这篇关于熵值法原理及Python实现的示例详解的文章就介绍到这了,更多相关Python熵值法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python编写softmax函数、交叉熵函数实例

    python代码如下: import numpy as np # Write a function that takes as input a list of numbers, and returns # the list of values given by the softmax function. def softmax(L): pass expL = np.exp(L) sumExpL = sum(expL) result = [] for i in expL: result.appen

  • Python实现计算信息熵的示例代码

    目录 一:数据集准备 二:信息熵计算 三:完整源码分享 四:方法补充 一:数据集准备 如博主使用的是: 多层感知机(MLP)实现考勤预测二分类任务(sklearn)对应数据集 导入至工程下 二:信息熵计算 1 导包 from math import log import pandas as pd 2 读取数据集 dataSet = pd.read_csv('dataSet.csv', header=None).values.tolist() 3 数据统计 numEntries = len(dat

  • Python计算信息熵实例

    计算信息熵的公式:n是类别数,p(xi)是第i类的概率 假设数据集有m行,即m个样本,每一行最后一列为该样本的标签,计算数据集信息熵的代码如下: from math import log def calcShannonEnt(dataSet): numEntries = len(dataSet) # 样本数 labelCounts = {} # 该数据集每个类别的频数 for featVec in dataSet: # 对每一行样本 currentLabel = featVec[-1] # 该样

  • Python机器学习pytorch交叉熵损失函数的深刻理解

    目录 1.交叉熵损失函数的推导 2. 交叉熵损失函数的直观理解 3. 交叉熵损失函数的其它形式 4.总结 说起交叉熵损失函数「Cross Entropy Loss」,脑海中立马浮现出它的公式: 我们已经对这个交叉熵函数非常熟悉,大多数情况下都是直接拿来使用就好.但是它是怎么来的?为什么它能表征真实样本标签和预测概率之间的差值?上面的交叉熵函数是否有其它变种? 1.交叉熵损失函数的推导 我们知道,在二分类问题模型:例如逻辑回归「Logistic Regression」.神经网络「Neural Ne

  • 熵值法原理及Python实现的示例详解

    目录 1.简单理解 信息熵 2.编制指标 (学术情景应用) 3.python实现 3.1 数据准备 3.2 数据预处理 3.3 熵值.权重计算 3.4 编制综合评价指标 熵值法也称熵权法,是学术研究,及实际应用中的一种常用且有效的编制指标的方法. 1.简单理解 信息熵 机器学习中的决策树算法是对信息熵的一种典型的应用. 在信息论中,使用 熵 (Entropy)来描述随机变量分布的不确定性. 假设对随机变量X,其可能的取值有x1,x2,...,xn .即有n种可能发生的结果.其对应发生的概率依次为

  • C++之值传递&指针传递&引用传递的示例详解

    目录 1.函数基础 2.值传递 3.指针传递 4.引用传递 1.函数基础 一个函数由以下四部分组成: 返回类型 函数名 参数(0个或多个) 函数体 其中,函数的参数叫做形参,函数执行的操作的语句块叫做函数体 2.值传递 像一个这样swap函数,调用的时候,会用实参初始化swap函数对应的形参 void Swap(int a, int b) { int tmp = a; a = b; b = tmp; } 在内存中会拷贝一份实参的值,但是修改形参的值并不影响实参的值 测试用例 #include <

  • python支付宝支付示例详解

    本文实例为大家分享了python支付宝支付示例代码,供大家参考,具体内容如下 项目演示: 1.输入金额 2.扫码支付: 3.支付完成: 一.注册账号 https://openhome.alipay.com/platform/appDaily.htm?tab=info 二.设置应用公钥 三.代码实现 1.项目结构: 2.把生成的     应用私钥     和    支付宝的公钥       放入keys目录下: 注意: 支付宝公钥 商户私钥 --- 配置商户应用私钥--copy到key目录下 --

  • Python selenium find_element()示例详解

    selenium有以下定位方式: driver.find_element_by_id('id') driver.find_element_by_xpath('xpath') driver.find_element_by_link_text('link_text') driver.find_element_by_partial_link_text('partial_link_text') driver.find_element_by_name('name') driver.find_element

  • iOS中的应用启动原理以及嵌套模型开发示例详解

    程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示. (3)通过[UIApplicationsharedApplication]可以获得这个单例对象 (4) 一个iOS程序启动后创建的第一个对象就是UIAp

  • Python ini配置文件示例详解

    目录 INI介绍 关于configparser INI文件格式 读取配置文件 写入配置文件 总结 INI介绍 INI是英文“初始化”(initialization)的缩写,被用来对操作系统或特定程序初始化或进行参数设置.由节(section). 键(key).值(value)构成.在windows系统中有很多INI文件,例如“System32.ini”和“Win.ini”,相信大家并不陌生.Python 中操作配置文件的模块为configparser,这个模块可以用来解析与Windows上INI

  • Python 字典的使用详解及实例代码

    目录 字典长什么样 字典内能放什么 访问字典内容 修改字典内容 删除字典数据 字典内置函数 字典是Python实现散列表数据结构的形式,表现映射的关系,一对一. 字典长什么样 {}这是一个空字典,可以看出字典是由两个花括号组成的. 在看这个{'a':1},这里面装了一对数据,'a'可称为键,1称为值 这个{'键1':'值1', '键2':'值2'}每一对数据 字典内能放什么 字典内的健是唯一的,在字典内所有内容中只存在一个,但值可以重复出现. 健只能是不变的值,比如字符串,数字,元组 值可以随意

  • python四则运算表达式求值示例详解

    目录 四则运算表达式求值 思路说明 算法步骤 代码 四则运算表达式求值 思路说明 使用双栈来实现——存放数值的栈 nums 与存放运算符的栈 ops. 算法步骤 对原始表达式字符串 exp 进行预处理, 将其转为一个元素对应一个数值或运算符的列表 explist. 遍历 explist , 每个元素依次压入对应的栈中. 每次压入后, 判断当前两栈顶是否可进行乘除运算.栈顶可进行乘除运算的充要条件是, ops 栈顶为<*> ,</> 之一, 且 nums 中的元素比 ops 中的元素

  • Python实现二值掩膜影像去噪与边缘强化方法详解

    目录 前言 一.方法 二.代码 三.效果测试 前言 这篇博客主要解决的一个问题是掩膜图像的噪声去除和边缘强化,如下图1所示.可以看到掩膜图像上有很多的斑点噪声,而且掩膜的轮廓也不够清晰.所以我们的目标就是一方面尽可能把这些斑点噪声去除,另一方面尽量突出掩膜边界.另外处理后的掩膜可以比真值大一些,但最好不能小. 图1 原始二值化影像 一.方法 因为之前有做过相关的工作,所以对于保留边界的斑点噪声消除第一反应是使用中值滤波.但很显然对于我们这个应用,单纯中值滤波是不够的.所以就想着那就采用多步处理,

  • Python之str操作方法(详解)

    1. str.format():使用"{}"占位符格式化字符串(占位符中的索引号形式和键值对形式可以混合使用). >>> string = 'python{}, django{}, tornado{}'.format(2.7, 'web', 'tornado') # 有多少个{}占位符就有多少个值与其对应,按照顺序"填"进字符串中 >>> string 'python2.7, djangoweb, tornadotornado'

随机推荐