什么是“熵和信息增益”?


338

我正在读这本书(NLTK),这很令人困惑。 定义为

熵是每个标签的概率乘以同一标签的对数概率的总和

如何在文本挖掘方面应用最大熵?有人可以给我一个简单的例子(视觉)吗?


1
一个很好的和直观的解决方案math.stackexchange.com/questions/331103/...
拉维ģ

漂亮和直观的答案thsi问题math.stackexchange.com/questions/331103/...
拉维摹

一段简单易懂的视频
Grijesh Chauhan

Answers:


1048

我认为在构建决策树的上下文中提到了熵。

为了说明这一点,想象的任务学习分类第一名称为男性/女性群体。给出了一个名称列表,每个名称都用m或标记f,我们想学习一个适合数据的模型,并可以用来预测新的看不见的名字的性别。

name       gender
-----------------        Now we want to predict 
Ashley        f              the gender of "Amro" (my name)
Brian         m
Caroline      f
David         m

第一步是确定数据的哪些特征与我们要预测的目标类别相关。一些示例功能包括:首字母/后字母,长度,元音数量,以元音结尾等。因此,在提取特征后,我们的数据如下所示:

# name    ends-vowel  num-vowels   length   gender
# ------------------------------------------------
Ashley        1         3           6        f
Brian         0         2           5        m
Caroline      1         4           8        f
David         0         2           5        m

目标是建立决策树。一棵树的例子是:

length<7
|   num-vowels<3: male
|   num-vowels>=3
|   |   ends-vowel=1: female
|   |   ends-vowel=0: male
length>=7
|   length=5: male

基本上,每个节点都代表对单个属性执行的测试,我们根据测试结果向左或向右移动。我们不断遍历树,直到到达包含类预测(mf)的叶节点

因此,如果我们在这棵树下运行名称Amro,我们首先测试“ 是否length <7? ”,答案是,因此我们沿该分支向下进行。在分支之后,下一个测试“ 元音的数量是否<3? ”再次求值为true。这导致标记为的叶节点m,因此预测是男性的(我碰巧是男性,因此树正确地预测了结果)。

决策树以自上而下的方式构建,但问题是如何选择在每个节点上拆分哪个属性?答案是找到一种功能,该功能可以将目标类最好地拆分为可能的最纯子节点(即,不包含男性和女性混合的节点,而只有一个类的纯节点)。

这种纯度的度量称为信息。它代表了预期的量的信息,将需要指定一个新的实例(直呼其名)是否应归类男性或女性,因为到达节点的例子。我们根据节点上男性和女性类别的数量进行计算。

另一方面,杂质的量度(相反)。它是为具有/值的二进制类定义的:ab

Entropy = - p(a)*log(p(a)) - p(b)*log(p(b))

下图描述了此二进制熵函数(随机变量可以采用两个值之一)。当概率为时p=1/2,它达到最大值,这意味着p(X=a)=0.5或类似地p(X=b)=0.5有50%/ 50%的概率为ab(不确定性最大)。当概率为p=1p=0具有完全确定性(p(X=a)=1p(X=a)=0分别暗示p(X=b)=1)时,熵函数为零最小值。

https://zh.wikipedia.org/wiki/文件:Binary_entropy_plot.svg

当然,熵的定义可以推广到具有N个结果(不只是两个)的离散随机变量X:

熵

log公式中的通常是以2为底的对数


回到我们的名称分类任务,让我们看一个例子。想象一下在构建树的过程中的某个时候,我们正在考虑以下拆分:

     ends-vowel
      [9m,5f]          <--- the [..,..] notation represents the class
    /          \            distribution of instances that reached a node
   =1          =0
 -------     -------
 [3m,4f]     [6m,1f]

如您所见,在拆分之前,我们有9位男性和5位女性,即P(m)=9/14P(f)=5/14。根据熵的定义:

Entropy_before = - (5/14)*log2(5/14) - (9/14)*log2(9/14) = 0.9403

接下来,我们将其与考虑两个子分支的拆分后计算出的熵进行比较。在的左分支中ends-vowel=1,我们有:

Entropy_left = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.9852

和的右分支ends-vowel=0,我们有:

Entropy_right = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.5917

我们使用每个分支下的实例数作为权重因子来组合左/右熵(权重为7个实例,右边为7个实例),并在拆分后获得最终熵:

Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885

现在,通过比较拆分前后的熵,我们可以获得信息增益的度量,或者通过使用该特定功能进行拆分可以获取多少信息:

Information_Gain = Entropy_before - Entropy_after = 0.1518

您可以按以下方式解释上述计算:通过对end-vowels特征进行拆分,我们能够将子树预测结果的不确定性减少少量0.1518(以单位作为信息单位)。

在树的每个节点上,对每个特征都执行此计算,并且以贪婪的方式为分割选择具有最大信息增益的特征(因此倾向于生成具有低不确定性/熵的分割的特征)。从根节点开始递归应用此过程,当叶节点包含所有具有相同类的实例时,该过程将停止(无需进一步拆分)。

请注意,我跳过了一些超出本文范围之外的细节,包括如何处理数字特征缺失值过度拟合修剪树等。


1
@ all3fox:在上一段中对此进行了解释,如果该过程到达了一个节点(所有实例都属于同一个类的叶节点,因此无法进一步拆分),则该过程应针对该特定分支停止。因此,该节点将预测它包含的唯一类
。– Amro

3
@ all3fox:实际上,一直到纯节点会产生相当深的决策树,这些树会过度拟合(即,树太适合训练数据,但不能很好地推广到训练集中未表示的其他数据)。因此,当到达叶节点中一定数量的最小实例时(通常只是预测多数类),和/或执行某种修剪(请参阅上面提供的Wikipedia链接以了解更多信息),我们通常会停止。
2015年

3
@Jas:这在这里很好地解释了: en.wikipedia.org/wiki/…–
Amro

1
@Rami:是的,为避免过拟合之类的问题,较小的树比较大的树更可取(例如,通过较少的测试来达成决策)。请注意,选择分裂特征的启发式算法是一种贪婪的搜索算法,因此,不能保证生成的树是所有可能的树中最小的树(也不保证是全局最优的一个wrt分类错误) )。这实际上是一个NP完全问题...
Amro,2015年

1
@Rami:有趣的是,有一些整体学习方法采用了不同的方法。一种想法是通过在每个候选分割处选择特征的随机子集,然后构建一堆这些随机树并将其结果取平均值,来使学习算法随机化。同样值得一看的算法,例如随机森林
安罗(Amro)

45

首先,最好先了解一下the measure of information

我们如何measure获得信息?

当不太可能的事情发生时,我们说这是个大新闻。另外,当我们说出可预测的内容时,这并不是很有趣。因此要对此进行量化interesting-ness,功能应满足

  • 如果事件的概率为1(可预测),则函数给出0
  • 如果事件的概率接近于0,则该函数应给出较高的数字
  • 如果发生0.5个事件的概率,它将提供one bit信息。

满足约束条件的一种自然措施是

I(X) = -log_2(p)

其中p是事件的概率X。并且单位在bit,同一位计算机使用。0或1。

例子1

公平的硬币翻转:

一掷硬币就能获得多少信息?

答: -log(p) = -log(1/2) = 1 (bit)

例子2

如果明天有一颗流星袭击地球, p=2^{-22}那么我们可以获得22位信息。

如果明天太阳升起 p ~ 1则它是0位信息。

因此,如果我们对interesting-ness事件的期望Y,那么它就是熵。即,熵是事件的趣味性的期望值。

H(Y) = E[ I(Y)]

更正式地说,熵是事件的预期位数。

Y = 1:事件X发生的概率为p

Y = 0:事件X发生的概率为1-p

H(Y) = E[I(Y)] = p I(Y==1) + (1-p) I(Y==0) 
     = - p log p - (1-p) log (1-p)

所有日志的日志基数为2。


22

我不能给你图形,但是也许我可以给你一个清晰的解释。

假设我们有一个信息通道,例如每天闪烁一次红色或绿色的指示灯。它传达多少信息?第一个猜测可能是每天一次。但是,如果我们添加蓝色,以便发送方具有三个选项,该怎么办?我们希望有能够处理比二的幂其他事物的信息的措施,但仍是添加剂(即由两种可能的消息的数量相乘的方式增加了一个位)。我们可以通过获取日志2(可能的消息数)来做到这一点,但事实证明,这是一种更通用的方法。

假设我们回到红色/绿色,但是红色灯泡已经烧尽(这是常识),因此灯泡必须始终闪烁绿色。现在该频道已无用,我们知道下一次闪烁是什么因此闪烁不传达任何信息,也没有新闻。现在,我们修理了灯泡,但强加了一个规则,使红色灯泡不能连续闪烁两次。当指示灯闪烁红色时,我们知道下一次闪烁是什么。如果您尝试通过此通道发送位流,则会发现必须用比位更多的闪存对其进行编码(实际上要多50%)。而且,如果您要描述一系列闪烁,则可以用更少的位来描述。如果每个闪烁都是独立的(无上下文),则同样适用,但绿色闪烁比红色闪烁更常见:概率越偏斜,描述序列所需的位数就越少,并且包含的​​信息越少,全绿色,灯泡烧坏极限。

事实证明,有一种方法可以根据不同符号的概率来测量信号中的信息量。如果接收到符号x i的概率为p i,则考虑数量

-log p 

p i越小,该值越大。如果x i变为不可能的两倍,则此值增加固定量(log(2))。这应该提醒您在邮件中添加一位。

如果我们不知道符号将是什么(但是我们知道概率),那么我们可以通过总结不同的可能性来计算该值的平均值,我们将得到多少:

我=-Σp i log(p i

这是一瞬间的信息内容。

红色灯泡烧坏:p red = 0,p绿色 = 1,I =-(0 + 0)= 0
红色和绿色等概率:p 红色 = 1/2,p 绿色= 1/2,I =-(2 * 1/2 * log(1/2))= log(2)
等概率的三种颜色:p i = 1/3,I =-(3 * 1/3 * log(1/3))= log(3)
绿色和红色,绿色的可能性是两倍:p 红色 = 1/3,p 绿色 = 2/3,I =-(1/3 log(1/3)+ 2/3 log(2/3))= log( 3)-2/3 log(2)

这是消息的信息内容或熵。当不同的符号相等时,它是最大的。如果您是物理学家,则使用自然对数;如果您是计算机科学家,则使用对数2并获取位。


10

我真的建议您阅读有关信息论,贝叶斯方法和MaxEnt的文章。起点是大卫·麦凯(David Mackay)的这本书(可在线免费获得):

http://www.inference.phy.cam.ac.uk/mackay/itila/

这些推理方法确实比文本挖掘更通用,我无法真正设计出一种方法,而无需学习本书或其他有关机器学习和MaxEnt贝叶斯入门书籍中的一些通用基础知识,就可以学习如何将其应用于NLP。方法。

熵和概率论与信息处理和存储之间的联系确实非常深。为了体会一下,香农(Shannon)提出了一个定理,该定理指出,您可以通过一个嘈杂的通信通道无错误地传递的最大信息量等于噪声过程的熵。还有一个定理,将您可以压缩一条数据以占用计算机中最小可能内存的量与生成数据的过程的熵联系起来。

我认为没有必要去学习所有关于传播理论的定理,但是如果不学习有关熵,计算方法,与信息和推理之间的关系等基础知识,就不可能学到这些。 ...


有同样的想法拉斐尔。这就像问堆栈溢出时的量子物理学是什么,这是一个非常广阔的领域,没有很好地概括为一个答案。
Mark Essel

5

当我实现一种算法来计算图像的熵时,我发现了这些链接,请参见此处此处

这是我使用的伪代码,您需要对其进行调整以使其适用于文本而不是图像,但是原理应相同。

//Loop over image array elements and count occurrences of each possible
//pixel to pixel difference value. Store these values in prob_array
for j = 0, ysize-1 do $
    for i = 0, xsize-2 do begin
       diff = array(i+1,j) - array(i,j)
       if diff lt (array_size+1)/2 and diff gt -(array_size+1)/2 then begin
            prob_array(diff+(array_size-1)/2) = prob_array(diff+(array_size-1)/2) + 1
       endif
     endfor

//Convert values in prob_array to probabilities and compute entropy
n = total(prob_array)

entrop = 0
for i = 0, array_size-1 do begin
    prob_array(i) = prob_array(i)/n

    //Base 2 log of x is Ln(x)/Ln(2). Take Ln of array element
    //here and divide final sum by Ln(2)
    if prob_array(i) ne 0 then begin
        entrop = entrop - prob_array(i)*alog(prob_array(i))
    endif
endfor

entrop = entrop/alog(2)

我从某个地方获得了此代码,但无法挖掘链接。


图像有太多不同的entropy()函数,但是预览效果不佳?您如何将您的代码与Matlab自己的entropy()以及此处的代码进行比较mathworks.com/matlabcentral/fileexchange/28692-entropy在后者中,开发人员说这是针对一维信号的,但用户仍将其扩展为二维。--您的熵函数假定原始信号为2位,并且非常简单。假定它是MIT-BIH心律失常心电图信号(11位),但是为2D图像生成的。我认为您不能在这里使用简单的2位基数。
莱奥波德·赫兹(LéoLéopoldHertz)2016年

5

非正式地

是信息或知识的可用性,信息的缺乏将导致对未来的预测困难,即高熵(文本挖掘中的下一个单词预测),而信息/知识的可用性将帮助我们对未来进行更现实的预测(低熵)。

任何类型的相关信息都将减少熵,并帮助我们预测更现实的未来,即信息可以是句子中存在“肉”一词,也可以是不存在“肉”一词。这称为信息增益


正式地

缺乏可预测性的顺序


0

当您阅读有关NLTK的书时,阅读MaxEnt分类器模块会很有趣 http://www.nltk.org/api/nltk.classify.html#module-nltk.classify.maxent

对于文本挖掘分类,步骤可能是:预处理(令牌化,汽蒸,通过信息增益进行特征选择...),转换为数字(频率或TF-IDF)(我认为这是使用时要理解的关键步骤文本作为仅接受数字的算法的输入),然后使用MaxEnt进行分类,请确保这只是一个示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.