我正在读这本书(NLTK)而且令人困惑。 熵是defined as:
熵是每个标签概率的总和 乘以同一标签的对数概率
如何在文本挖掘方面应用 entropy 和最大熵?有人可以给我一个简单的例子(视觉)吗?
答案 0 :(得分:1025)
我认为在构建decision trees的背景下提到了熵。
为了说明这一点,想象一下learning到classify名字对男/女群体的任务。这是一个名称列表,每个名称都标有m
或f
,我们希望学习适合数据的model,并可用于预测新看不见的性别-name。
name gender
----------------- Now we want to predict
Ashley f the gender of "Amro" (my name)
Brian m
Caroline f
David m
第一步是deciding数据的features与我们想要预测的目标类相关。一些示例功能包括:第一个/最后一个字母,长度,元音数量,以元音结尾等等。因此,在提取特征之后,我们的数据如下所示:
# 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
目标是建立一个decision tree。 tree的一个例子是:
length<7
| num-vowels<3: male
| num-vowels>=3
| | ends-vowel=1: female
| | ends-vowel=0: male
length>=7
| length=5: male
基本上每个节点代表对单个属性执行的测试,我们根据测试结果向左或向右移动。我们继续遍历树,直到我们到达包含类预测的叶节点(m
或f
)
因此,如果我们在这棵树上运行名称 Amro ,我们首先测试“是长度&lt; 7?”,答案是是,所以我们走下那个分支。在分支之后,下一个测试“是元音的数量&lt; 3?”再次评估为 true 。这导致标记为m
的叶节点,因此预测是 male (我恰好是,因此树预测结果correctly)。
决策树是built in a top-down fashion,但问题是如何选择在每个节点拆分哪个属性?答案是找到最能将目标类拆分为最纯粹的子节点的功能(即:不包含男性和女性混合的节点,而只包含一个类的纯节点)。
纯度的衡量标准称为information。它表示expected量的information,用于指定新实例(名字)是应该分类为男性还是女性,给定到达节点的示例。我们计算它 根据节点上男女班的数量。
另一方面, Entropy是杂质的衡量标准(相反)。它的定义为binary class,其值为a
/ b
:
Entropy = - p(a)*log(p(a)) - p(b)*log(p(b))
这个binary entropy function如下图所示(随机变量可以取两个值中的一个)。当概率为p=1/2
时,它达到最大值,这意味着p(X=a)=0.5
或类似p(X=b)=0.5
的概率为a
或b
的概率为50%/ 50% (不确定性最大)。当概率为p=1
或p=0
且完全确定(p(X=a)=1
或p(X=a)=0
时,熵函数最小为零,后者暗示p(X=b)=1
)。
当然,对于具有N个结果的离散随机变量X(不仅仅是两个),熵的定义可以推广:
(公式中的log
通常被视为logarithm to the base 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/14
和P(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
我们使用每个分支下的实例数量将左/右熵组合为weight factor(剩下7个实例,右边7个实例),并在分割后获得最终熵:
Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885
现在通过比较分割前后的熵,我们得到information gain的度量,或者通过使用该特定特征进行分割获得的信息量:
Information_Gain = Entropy_before - Entropy_after = 0.1518
您可以将上述计算解释如下:通过使用end-vowels
特征进行拆分,我们能够将子树预测结果的不确定性减少0.1518(在bits为units of information)。
在树的每个节点处,对每个要素执行此计算,并以greedy方式选择具有最大信息增益的要素进行拆分(因此有利于特征)产生纯分裂,具有低不确定性/熵)。此过程以递归方式从根节点向下应用,并在叶节点包含所有具有相同类的实例(无需进一步拆分)时停止。
请注意,我跳过了一些超出此帖范围的details,包括如何处理numeric features,missing values,overfitting和pruning树木等。
答案 1 :(得分:39)
首先,最好理解the measure of information
。
measure
信息?当不太可能发生的事情发生时,我们说这是个大新闻。而且,当我们说出可预测的东西时,它并不是真的很有趣。因此,要量化此interesting-ness
,函数应满足
one bit
信息。满足约束条件的一个自然措施是
I(X) = -log_2(p)
其中 p 是事件X
的概率。单位在bit
,与计算机使用的位数相同。 0或1。
公平硬币翻转:
我们可以从一枚硬币翻转中获得多少信息?
答案:-log(p) = -log(1/2) = 1 (bit)
如果流星明天袭击地球,p=2^{-22}
那么我们就可以获得22位信息。
如果太阳明天上升,p ~ 1
那么它就是0位信息。
因此,如果我们对事件interesting-ness
的{{1}}采取预期,那么它就是熵。
即熵是事件兴趣的预期值。
Y
更正式地说,熵是事件的预期位数。
Y = 1:事件X以概率p
发生Y = 0:事件X不会以概率1-p
发生H(Y) = E[ I(Y)]
记录所有日志的基础2。
答案 2 :(得分:20)
我不能给你图形,但也许我可以给出清楚的解释。
假设我们有一个信息通道,例如每天闪烁一次红色或绿色的灯。它传达了多少信息?第一个猜测可能是每天一点。但是如果我们添加蓝色,那么发送者有三个选项呢?我们希望有一些信息可以处理除2的幂之外的其他信息,但仍然是可加性的(将可能的消息数乘以2的方式添加一位)。我们可以通过记录log 2 (可能的消息数量)来做到这一点,但事实证明这是一种更通用的方式。
假设我们回到红色/绿色,但红色灯泡烧坏了(这是常识),因此灯泡必须始终闪烁绿色。频道现在没用了,我们知道下一个闪光灯将是什么所以闪光灯没有传达信息,没有新闻。现在我们修理灯泡,但规定红灯泡可能不会连续两次闪光。当指示灯闪烁红色时,我们知道下一个闪光灯会是什么。如果你尝试通过这个通道发送一个比特流,你会发现你必须使用比你有更多的闪存编码它(事实上多50%)。如果你想描述一系列闪光,你可以用更少的比特来完成。如果每个闪存是独立的(无上下文),则同样适用,但绿色闪烁比红色更常见:概率越多,描述序列所需的位越少,所包含的信息越少,一直到全绿色,灯泡烧毁限制。
事实证明,有一种方法可以根据不同符号的概率来测量信号中的信息量。如果接收符号x i 的概率为p i ,则考虑数量
-log pi
较小的p i ,该值越大。如果x i 变为两倍的可能性,则该值增加固定量(log(2))。这应该提醒您在消息中添加一位。
如果我们不知道符号是什么(但我们知道概率)那么我们可以通过总结不同的可能性来计算这个值的平均值,我们将得到多少:
I = -Σ pi log(pi)
这是一次性的信息内容。
Red bulb burnt out: pred = 0, pgreen=1, I = -(0 + 0) = 0 Red and green equiprobable: pred = 1/2, pgreen = 1/2, I = -(2 * 1/2 * log(1/2)) = log(2) Three colors, equiprobable: pi=1/3, I = -(3 * 1/3 * log(1/3)) = log(3) Green and red, green twice as likely: pred=1/3, pgreen=2/3, I = -(1/3 log(1/3) + 2/3 log(2/3)) = log(3) - 2/3 log(2)
这是邮件的信息内容或熵。当不同的符号是等概率时,它是最大的。如果您是物理学家,则使用自然日志,如果您是计算机科学家,则使用log 2 并获取位。
答案 3 :(得分:8)
我真的建议你阅读有关信息理论,贝叶斯方法和MaxEnt的内容。最开始的地方是David Mackay的这本书(免费在线):
http://www.inference.phy.cam.ac.uk/mackay/itila/
这些推理方法实际上远比文本挖掘更通用,我无法真正设计如何在不学习本书或其他机器学习入门书籍中的一些基本知识的情况下学习如何将其应用于NLP和MaxEnt贝叶斯方法。
熵和概率理论与信息处理和存储之间的联系确实非常深刻。为了体验它,香农有一个定理,即通过噪声通信信道可以无错误地传递的最大信息量等于噪声过程的熵。还有一个定理可以连接您可以压缩一块数据以占用计算机中最小可能内存的数量与生成数据的过程的熵。
我认为你没有必要去学习关于传播理论的所有定理,但是如果不学习关于什么是熵,它是如何计算的,与信息的关系是什么的基础知识,就不可能学到这一点。推理等...
答案 4 :(得分:4)
当我实施算法计算图像的熵时,我找到了这些链接,请参阅here和here。
这是我使用的伪代码,你需要调整它来处理文本而不是图像,但原则应该是相同的。
//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)
我从某处获得了这段代码,但我无法挖掘出这个链接。
答案 5 :(得分:3)
熵是信息或知识的可用性,信息的缺乏将导致对未来的预测困难,这是高熵(文本挖掘中的下一个单词预测),而信息/知识的可用性将帮助我们对未来的预测更为现实(低熵)。
任何类型的相关信息都将减少熵,并帮助我们预测更现实的未来,即信息可以是单词“ meat”出现在句子中,或者单词“ meat”不出现。这称为信息增益
熵缺乏可预测性的顺序
答案 6 :(得分:0)
当你正在阅读一本关于NLTK的书时,你会读到有关MaxEnt分类器模块http://www.nltk.org/api/nltk.classify.html#module-nltk.classify.maxent
的信息。对于文本挖掘分类,步骤可以是:预处理(标记化,蒸汽,使用信息增益进行特征选择......),转换为数字(频率或TF-IDF)(我认为这是关键步骤)理解当使用文本作为只接受数字的算法的输入然后用MaxEnt进行分类时,确定这只是一个例子。