桂林小学网站建设,广州建设网站 公司,相册 wordpress,公司网站建设需要什么科目文章目录1. 多属性决策问题2. 熵#xff08;entropy#xff09;3. 信息熵4. 熵权法5. 熵权法的实现基于信息论的熵值法是根据各指标所含信息有序程度的差异性来确定指标权重的客观赋权方法#xff0c;仅依赖于数据本身的离散程度。熵用于度量不确定性#xff0c;指标的离散…
文章目录1. 多属性决策问题2. 熵entropy3. 信息熵4. 熵权法5. 熵权法的实现基于信息论的熵值法是根据各指标所含信息有序程度的差异性来确定指标权重的客观赋权方法仅依赖于数据本身的离散程度。熵用于度量不确定性指标的离散程度越大不确定性越大则熵值越大表明指标值提供的信息量越多则该指标的权重也应越大。
1. 多属性决策问题
熵权法多用于多属性决策问题中求解各个属性的权值。我们先简单介绍下多属性决策 多属性决策指的是在考虑多个属性的情况下对一组有限个备选方案进行排序或者择优。 主要包含以下几个组成部分 1获取属性信息。 2属性权重确定包括主观赋权法、客观赋权法、主客观结合的赋权法。 3多属性决策对决策所需的属性信息进行集结并基于相应策略对备选方案进行排序和择优。
这里假设我们的数据的样本数量为nnn每个样本有jjj个feature那么对于一个样本的一个feature的取值为 xijx_{ij}xij 其中 iii 第个样本 jjj 第个feature
假设有这样一个应用场景由于每一个样本都有很多feature我想把这个样本的这些feature总结为一个值应该怎么做即 我们有一万种方法能达到这个目的有了这个值我们就可以进行排名、比较等操作。所以这个值还得有点实际意义不能是瞎攒出来的一个数。
熵权法(EEM, entropy evaluation method)是根据指标信息熵的大小对指标客观赋值的一种方法信息熵越大代表该指标的离散程度很大包含的信息就多所赋予的权重就越大。也就是说这个方法实际上关注的是变量的取值的多样性取值大小差异越大的即离散程度越高的就说明这个feature的重要程度很大包含了更多的信息。
2. 熵entropy
熵的概念是由德国物理学家克劳修斯于1865年所提出。最初是用来描述“能量退化”的物质状态参数之一在热力学中有广泛的应用。
热力学第二定律又被称为”熵增“定律从它的描述中大家也能明白一二在自然状态下热量只会从热水杯传递给冷水杯这个过程是不可逆的而”熵“则是这个不可逆过程的度量。换而言之封闭系统的熵只会不变或增加不会减少。关于“热力学熵”最原始的宏观表达式是
那时的熵仅仅是一个可以通过热量改变来测定的物理量其本质仍没有很好的解释直到统计物理、信息论等一系列科学理论发展熵的本质才逐渐被解释清楚即熵的本质是一个系统“内在的混乱程度”。
3. 信息熵
信息熵是一个数学上颇为抽象的概念由大名鼎鼎的信息论之父——克劳德 • 香农提出。在这里不妨把信息熵理解成某种特定信息的出现概率离散随机事件的出现概率。一个系统越是有序信息熵就越低反之一个系统越是混乱信息熵就越高。信息熵也可以说是系统有序化程度的一个度量。
一般说来信息熵的表达式为
举例1
假设一个硬币投出正反两面的概率都是50%那么它的entropy为 也就是说一个公平的硬币其正反面概率都是50%的情况下熵最大化了。这件事推广到有多个面的骰子也是一样的每个事件出现的概率越接近样本的混乱程度就越高熵就越大。而如果某个事件的出现概率是压倒性的比其他所有事件出现概率加一起都高得多那么熵就会比较小。
举例2
假设4个元素每个元素的feature有1个特征x1并且它有个类型y即 我们发现一个很有趣的现象就是进行分组以后熵降低了。这实际上就是决策树的基本原理通过对属性进行分割从而降低整体的混乱程度。即对一个属性的不同取值进行分组以后每一组的混乱程度做个加权和整体混乱程度要比分组之前的混乱程度还要低也就是说每一组都更纯粹一些。
当然这里计算entropy的log2log_2log2是以2为底也可以以自然对数为底函数图像形状是基本不变的。
4. 熵权法
回到最开始我们问的问题就是我怎么对一大堆指标(feature)进行综合一下形成一个综合的值。当然我们就是用简单的加权和来做但是我们还希望这个值具有一定的代表性。这个代表性我们就视为该feature下取值的多样性或者说离散程度。
也就是说如果一张数据表有很多行数据每个数据又有很多feature**如果某个feature的取值大家都一样这实际上也说明这个feature可以丢掉了用什么数据训练模型它都没啥用。但如果这个feature的取值特别多那么这么指标对于决策更有用。**因此我们如果要综合一个指标的话我们就要给最多样化即离散程度最高的feature以最高的权重。
主要计算步骤如下
1归一化数据
这里对数据进行归一化主要是消除量纲的影响。可以采用 min-max归一化或者mean-std归一化方法。 数据归一化方法可以参考博客数据预处理——数据无量纲化归一化、标准化
这里以min-max归一化为例
这里有几点需要注意的
如果原始数据中不同属性的取值在相近的量级上xmaxx_{max}xmax和xminx_{min}xmin可以直接取所有数据的最大最小值。
X_std (X - np.min(X)) / (np.max(X) - np.min(X)如果原始数据中不同属性的取值量级相差较大可以考虑使用列归一化即xmaxx_{max}xmax和xminx_{min}xmin取列数据的列最大值和列最小值。
X_std (X - X.min(axis0)) / (X.max(axis0) - X.min(axis0))如果原始数据中某个属性的取值完全一样为xvx_{v}xvmin、max、x 均相等则基于min-max归一化方法计算分子分母均为0默认算出的该属性数据均为0。
该属性的取值大家都一样对于决策没有作用参与决策过程的权重理应很小很小。而归一化后的0值数据经过信息熵的计算后P1P1P1 log(P)0log(P)0log(P)0−P∗log(P)0-P * log(P) 0−P∗log(P)0E0E 0E0安全权重系数计算公式最后算出来的权值很大不符合实际情况。 这种情况下我们可以在数据归一化后给数据加上一个很小的数值比如1e-3来避免样本取值为0情况即x′′ijxij′0.001{x}_{ij}x_{ij} 0.001x′′ijxij′0.001
2只关注第jjj个feature计算每个样本x′′ij{x}_{ij}x′′ij在第个feature下所占的全部取值的比例。 这个比例其实就是视为概率了。 举个例子如果对于第jjj个feature我们的样本经过归一化以后取值为 我们可以理解为取值越大这个pijp_{ij}pij的值就越大。相当于我们自定义了一个概率将其与取值联系到了一起这么做是因为我们要计算的熵仅仅与概率有关而如果xijx_{ij}xij的取值特别多样化我们用它算出来的这个概率也会特别多样化有大有小从而降低熵。
3计算第jjj个feature的熵。 4计算第jjj个feature的差异系数。 这个差异系数的含义显而易见就是该feature的离散程度越高该差异系数越高。
5对差异系数归一化计算第个feature的权重
这样对于每个feature其离散程度越高所占比重就会越高。这样一来我们就有了每个feature的权重了下面我们用这个权重来算每个样本的指标
6计算最终的统计测度
5. 熵权法的实现
先定义基础数据
data pd.DataFrame({人均专著: [0.1, 0.2, 0.4, 0.9, 1.2], 生师比: [5, 6, 7, 10, 2], 科研经费: [5000, 6000, 7000, 10000, 400],逾期毕业率: [4.7, 5.6, 6.7, 2.3, 1.8]}, index[院校 i for i in list(ABCDE)])
【实现代码 1】
import numpy as npdef get_entropy_weight_1(data): # 熵权法需要使用原始数据作为输入data np.array(data)# 数据归一化# 这里可以根据需要选择mean-std归一化或者min-max归一化# 计算PijP data / data.sum(axis0) # 需要考虑分子为0的情况可以考虑加一个epsilon1e-3# 计算熵值E np.nansum(-P * np.log(P) / np.log(len(data)), axis0)# 计算权系数return (1 - E) / (1 - E).sum()get_entropy_weight_1(data)程序输出结果
array([ 0.41803075, 0.14492264, 0.28588943, 0.15115718])【实现代码 2】
def get_entropy_weight_2(data)::param data: dataframe类型:return: 各指标权重列表# 数据归一化# 这里可以根据需要选择mean-std归一化或者min-max归一化m,ndata.shape#将dataframe格式转化为matrix格式datadata.as_matrix(columnsNone)# 第一步计算kk1/np.log(m)#第二步:计算pijpijdata/data.sum(axis0)# 第三步计算每种指标的信息熵tmpnp.nan_to_num(pij*np.log(pij))ej-k*(tmp.sum(axis0))# 第四步计算每种指标的权重wi(1-ej)/np.sum(1-ej)wi_listlist(wi)return wi_listget_entropy_weight_2(data)[0.41803075156086411,0.14492263660659988,0.28588943395852595,0.15115717787401006]可以看到两个代码的输出结果一致且各个属性的权值加起来和为1。
这里有几个需要注意的点
数据归一化在原始数据量纲不一致时我们使用熵权法之前可以先对数据做归一化处理。这里可以根据数据的实际情况和业务需要选择mean-std归一化或者min-max归一化。不同的归一化方法对最后求出来的权值会有影响。可以在数据归一化后给数据加上一个很小的数值比如1e-3来避免样本取值为0情况即x′′ijxij′0.001{x}_{ij}x_{ij} 0.001x′′ijxij′0.001除数为0的情况上述计算过程涉及除法会遇到除数为0的情况。可以给除数加一个很小的数值如epsilon1e-3以避免除以0的情况发生。
【参考博客】
TOPSIS法(优劣解距离法)介绍及 python3 实现https://zhuanlan.zhihu.com/p/551107230