What is “entropy and information gain”?
我正在读这本书(NLTK),它让人困惑。熵定义为:
Entropy is the sum of the probability of each label
times the log probability of that same label
号
如何在文本挖掘中应用熵和最大熵?有人能给我一个简单的例子吗?
我假设熵是在构建决策树的上下文中提到的。好的。
举例来说,想象一下学习将名字分为男性/女性组的任务。它给出了一个名字列表,每个名字都用
1 2 3 4 5 6 | name gender ----------------- Now we want to predict Ashley f the gender of"Amro" (my name) Brian m Caroline f David m |
第一步是确定哪些数据特征与我们想要预测的目标类相关。一些示例特征包括:第一个/最后一个字母、长度、元音数、是否以元音结尾等。因此,在特征提取之后,我们的数据看起来像:好的。
1 2 3 4 5 6 | # 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 |
号
目标是建立一个决策树。树的一个例子是:好的。
1 2 3 4 5 6 7 | length<7 | num-vowels<3: male | num-vowels>=3 | | ends-vowel=1: female | | ends-vowel=0: male length>=7 | length=5: male |
基本上,每个节点表示对单个属性执行的测试,我们根据测试结果向左或向右移动。我们不断地遍历树,直到到达包含类预测(
因此,如果我们在这棵树上运行amro这个名称,我们首先测试"长度是否小于7?"答案是肯定的,所以我们沿着那个分支往下走。在分支之后,下一个测试"元音的数目是否小于3?"再次计算为真。这导致了一个叶子节点,标记为
决策树是以自顶向下的方式构建的,但问题是如何选择要在每个节点上拆分的属性?答案是找到最能将目标类分割成最纯粹的子节点的特性(即:不同时包含男节点和女节点的节点,而只包含一个类的纯节点)。好的。
这种纯度的度量称为信息。它表示在到达节点的示例中,需要指定新实例(名字)是男性还是女性分类所需的预期信息量。我们计算它基于节点上的男类和女类的数量。好的。
另一方面,熵是杂质的度量(相反)。它是为值为
1 | Entropy = - p(a)*log(p(a)) - p(b)*log(p(b)) |
。
这个二元熵函数如下图所示(随机变量可以取两个值中的一个)。当概率为
。好的。
当然,熵的定义可以推广到具有n个结果的离散随机变量x(而不仅仅是两个结果):好的。
氧化镁好的。
(公式中的
回到我们的名称分类任务,我们来看一个例子。想象一下,在构建树的过程中的某个时刻,我们正在考虑以下分割:好的。
1 2 3 4 5 6 | ends-vowel [9m,5f] <--- the [..,..] notation represents the class / \ distribution of instances that reached a node =1 =0 ------- ------- [3m,4f] [6m,1f] |
如你所见,在分裂之前,我们有9只雄性和5只雌性,即
1 | Entropy_before = - (5/14)*log2(5/14) - (9/14)*log2(9/14) = 0.9403 |
号
接下来,我们将其与通过查看两个子分支考虑拆分后计算的熵进行比较。在
1 | Entropy_left = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.9852 |
在江户十一〔3〕的右支,我们有:好的。
1 | Entropy_right = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.5917 |
。
我们使用每个分支下的实例数作为权重因子(7个实例向左,7个实例向右)组合左/右熵,并在分割后得到最终的熵:好的。
1 | Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885 |
现在,通过比较分割前后的熵,我们可以获得一个信息增益的度量,或者通过使用该特定特性进行分割获得的信息量:好的。
1 | Information_Gain = Entropy_before - Entropy_after = 0.1518 |
。
您可以将上述计算解释为:通过使用
在树的每个节点上,对每个特征进行计算,并以贪婪的方式选择信息增益最大的特征进行分割(从而有利于产生不确定性/熵较低的纯分割的特征)。这个过程从根节点向下递归应用,当一个叶节点包含所有具有相同类的实例时停止(不需要进一步拆分它)。好的。
请注意,我跳过了一些超出本文范围的细节,包括如何处理数字特性、缺少值、过度拟合和修剪树等。好的。好啊。
首先,最好理解
当一些不太可能发生的事情发生时,我们说这是个大新闻。而且,当我们说一些可预测的事情时,它并不是真正有趣的。因此,为了量化这个
- 如果事件的概率为1(可预测),则函数给出0
- 如果事件的概率接近0,那么函数应该给出高数值
- 如果发生概率为0.5的事件,它将提供
one bit 的信息。
满足约束条件的一个自然措施是
1 | I(X) = -log_2(p) |
式中,p是事件发生的概率
公平硬币翻转:
一次抛硬币能获得多少信息?
答:
如果一颗流星明天撞击地球,那么我们可以得到22位信息。
如果明天太阳升起,那么它是0位信息。
熵因此,如果我们对事件
1 | H(Y) = E[ I(Y)] |
号
更正式地说,熵是事件的预期位数。
例子y=1:事件x发生概率p
y=0:事件x不以概率1-p发生。
1 2 | H(Y) = E[I(Y)] = p I(Y==1) + (1-p) I(Y==0) = - p log p - (1-p) log (1-p) |
所有日志以2为基数。
我不能给你图形,但也许我可以给你一个清楚的解释。
假设我们有一个信息通道,比如每天闪烁一次的红色或绿色灯。它传达了多少信息?第一个猜测可能是每天一点点。但是如果我们添加蓝色,这样发送者有三个选项呢?我们希望有一个能够处理除二次幂以外的事物的信息度量,但仍然是可加的(将可能的消息数乘以二加一位的方法)。我们可以通过记录2(可能的消息数)来做到这一点,但事实证明有一种更通用的方法。
假设我们回到红色/绿色,但是红色灯泡已经烧坏了(这是常识),所以灯必须始终闪烁绿色。这个频道现在没用了,我们知道下一个闪光灯会是什么,所以闪光灯不传达任何信息,也不传递任何新闻。现在我们修理灯泡,但有一条规则,那就是红色灯泡不能连续闪烁两次。当灯闪烁红色时,我们知道下一次闪烁是什么。如果你试图通过这个通道发送一个比特流,你会发现你必须用比比特更多的闪光来编码它(事实上比比特多50%)。如果你想描述一系列的闪光,你可以用更少的比特来描述。如果每个闪光灯都是独立的(上下文无关),则同样适用,但绿色闪光灯比红色闪光灯更常见:概率越大,描述序列所需的位就越少,包含的信息就越少,一直到全绿色灯泡烧坏极限。
事实证明,有一种方法可以根据不同符号的概率来测量信号中的信息量。如果接收符号xi的概率为pi,则考虑数量
1 | -log p<sub>i</sub> |
号
pi越小,该值越大。如果xi变为不太可能的两倍,则该值增加一个固定值(log(2))。这应该提醒您在消息中添加一位。
如果我们不知道符号是什么(但我们知道概率),那么我们可以通过求和不同的可能性来计算这个值的平均值,我们将得到多少:
1 | I = -Σ p<sub>i</sub> log(p<sub>i</sub>) |
这是一瞬间的信息内容。
1 2 3 4 | Red bulb burnt out: p<sub>red</sub> = 0, p<sub>green</sub>=1, I = -(0 + 0) = 0 Red and green equiprobable: p<sub>red</sub> = 1/2, p<sub>green = 1/2</sub>, I = -(2 * 1/2 * log(1/2)) = log(2) Three colors, equiprobable: p<sub>i</sub>=1/3, I = -(3 * 1/3 * log(1/3)) = log(3) Green and red, green twice as likely: p<sub>red</sub>=1/3, p<sub>green</sub>=2/3, I = -(1/3 log(1/3) + 2/3 log(2/3)) = log(3) - 2/3 log(2) |
。
这是消息的信息内容或熵。当不同的符号是相等的时,它是最大的。如果你是一个物理学家,你可以使用自然的日志,如果你是一个计算机科学家,你可以使用log2和get bits。
我真的建议你读一下信息论,贝叶斯方法和Maxent。开始的地方是大卫麦凯的这本(免费在线)书:
http://www.interrusion.phy.cam.ac.uk/mackay/itila/
这些推理方法实际上比文本挖掘更为普遍,我无法真正设计出一个人如何在不学习本书或其他机器学习和Maxent Bayesian方法入门书中包含的一些一般基础知识的情况下学习如何将其应用于NLP。
熵和概率论与信息处理和存储之间的联系真的很深。为了体验一下,香农提出了一个定理,它指出,通过一个有噪声的通信信道,你可以毫无错误地传递的最大信息量等于噪声过程的熵。还有一个定理,它将你能压缩多少数据以占用计算机中可能的最小内存与生成数据的过程的熵联系起来。
我不认为你真的有必要去学习所有关于传播理论的定理,但是如果不学习熵是什么,它是如何计算的,它与信息和推理的关系是什么等基本知识,就不可能去学习这些定理。
当我实现一个计算图像熵的算法时,我发现了这些链接,请看这里和这里。
这是我使用的伪代码,您需要对其进行调整,以便与文本而不是图像一起使用,但原则应该是相同的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //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) |
我从某个地方得到了这个代码,但我找不到链接。
非正式地
熵是信息或知识的可用性,信息的缺乏将导致未来预测的困难,即高熵(文本挖掘中的下一个词预测),信息/知识的可用性将帮助我们更现实地预测未来(低熵)。
任何类型的相关信息都会降低熵,帮助我们预测更现实的未来,信息可以是单词"meat"出现在句子中,也可以是单词"meat"不存在。这叫做信息增益
正式地熵缺乏可预测性
当你读一本关于NLTK的书时,你会很感兴趣地读到关于Maxent分类器模块的书http://www.nltk.org/api/nltk.classify.html module-nltk.classify.maxent
对于文本挖掘分类,步骤可以是:预处理(标记化技术、蒸汽处理、带信息增益的特征选择…)、转换为数字(频率或tf-idf)(我认为这是使用文本作为只接受数字的算法的输入时要理解的关键步骤),然后用maxent分类,确保这只是一个例子。