我已经花了五天时间睡了一觉,现在我的智慧结束了。事实上,由于睡眠不足,我现在感到不适。
我已经使用两个类实现了ID3,例如YES/NO
,现在我的任务是拥有3倍可能结果的数据集。
数据的示例子集:
3.4,5.2,1.4,0.2,BarnOwl
2.3,4.5,1.3,0.3,BarnOwl
3.4,6,4.5,1.6,SnowyOwl
2.9,5.7,4.2,1.3,SnowyOwl
2.8,6.4,5.6,2.1,LongEaredOwl
3.2,6.4,5.3,2.3,LongEaredOwl
2.8,6.2,4.8,1.8,LongEaredOwl
2.3,5,3.3,1,SnowyOwl
我将数据混洗并将前100个条目作为训练数据,以便进行示例分析:
{'SnowyOwl': 32, 'BarnOwl': 35, 'LongEaredOwl': 33}
和计算
Entropy(32SO, 35BO, 33LO) =
= 1.58395
我编写了代码并检查了熵函数,而不是在范围
中得到结果 Entropy = [0..1]
我得到1.58395
我给出的公式与YES/NO
(对不起质量)非常吻合
确认我的功能正在计算正确的结果,尽管我使用的预期范围http://www.wolframalpha.com/
任何人都可以确认这个公式是否正确? 这就是为什么它超出了我的预期范围。
答案 0 :(得分:5)
n
- 值离散随机变量的熵位于[0, log2(n)]
范围内。这意味着对于3个结果,范围将为[0, \log2(3)] = [0, 1.58496250072]
。答案是肯定的,你的熵公式很好。
(要看到这一点,请注意,当所有结果的概率相同时,熵达到最大值,即1/n
。然后-1/n\log2(1/n) - ... -1/n\log2(1/n) = n * 1/n * \log2(n) = log2(n)
。另一方面,熵将当其中一个结果以概率1发生并且所有其他结果以概率0 1*log2(1) - 0*log2(0) - ... - 0*log2(0) = 0
发生时,取其最小值。这就是范围为[0, log2(n)]
的原因。我遗漏了证明熵真正达到最大值的原因注意我设置了0*log2(0):=0
,因为log2(0)
不存在。实际上,通常会确保总和超过p*log2(p)
{{}} p>0
1}}。)