parent
c1ba30f537
commit
77fabfef87
|
@ -16,18 +16,25 @@
|
|||
|
||||
**熵**这个概念最早起源于物理学,在物理学中是用来度量一个热力学系统的无序程度,而在信息学里面,熵是对不确定性的度量。在**1948**年,**香农**引入了**信息熵**,将其定义为离散随机事件出现的概率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它的信息熵就越高。所以信息熵可以被认为是系统有序化程度的一个度量。
|
||||
|
||||
假如一个随机变量 X 的取值为 X={x1,x2,...xn},每一种取到的概率分别是 {p1,p2,...,pn},那么 X 的熵定义为
|
||||
H(X) = -sum(i=1, n, pi*log2(pi))
|
||||
假如一个随机变量 X 的取值为 X={x1,x2,...xn},每一种取到的概率分别是 {p1,p2,...,pn},那么 X 的熵定义为
|
||||
|
||||
```math
|
||||
H(X) = -sum(i=1, n, pi*log2(pi))
|
||||
```
|
||||
|
||||
意思是一个变量的变化情况可能越多,那么它携带的信息量就越大。
|
||||
|
||||
对于**分类系统**来说,类别 C 是变量,它的取值是 C1,C2,...,Cn,而每一个类别出现的概率分别是
|
||||
|
||||
P(C1),P(C2),...,P(Cn)
|
||||
```math
|
||||
P(C1),P(C2),...,P(Cn)
|
||||
```
|
||||
|
||||
而这里的 n 就是类别的总数,此时分类系统的熵就可以表示为
|
||||
|
||||
H(C) = -sum(i=1, n, P(Ci)*log2(P(Ci)))
|
||||
```math
|
||||
H(C) = -sum(i=1, n, P(Ci)*log2(P(Ci)))
|
||||
```
|
||||
|
||||
以上就是信息熵的定义,接下来介绍**信息增益**。
|
||||
|
||||
|
@ -54,7 +61,9 @@
|
|||
|
||||
可以看出,一共14个样例,包括9个正例和5个负例。那么当前信息的熵计算如下
|
||||
|
||||
Entropy(S) = -9/14*log2(9/14)-5/14*log2(5/14) = 0.940286
|
||||
```math
|
||||
Entropy(S) = -9/14*log2(9/14)-5/14*log2(5/14) = 0.940286
|
||||
```
|
||||
|
||||
在决策树分类问题中,信息增益就是决策树在进行属性选择划分前和划分后信息的差值。假设利用属性 Outlook 来分类,那么如下图
|
||||
|
||||
|
@ -62,21 +71,29 @@
|
|||
|
||||
划分后,数据被分为三部分了,那么各个分支的信息熵计算如下
|
||||
|
||||
Entropy(sunny) = -2/5*log2(2/5)-3/5*log2(3/5) = 0.970951
|
||||
Entropy(overcast) = -4/4*log2(4/4)-0*log2(0) = 0
|
||||
Entropy(rainy) = -3/5*log2(3/5)-2/5*log2(2/5) = 0.970951
|
||||
```math
|
||||
Entropy(sunny) = -2/5*log2(2/5)-3/5*log2(3/5) = 0.970951
|
||||
Entropy(overcast) = -4/4*log2(4/4)-0*log2(0) = 0
|
||||
Entropy(rainy) = -3/5*log2(3/5)-2/5*log2(2/5) = 0.970951
|
||||
```
|
||||
|
||||
那么划分后的信息熵为
|
||||
|
||||
Entropy(S|T) = 5/14*0.970951+4/14*0+5/14*0.970951 = 0.693536
|
||||
```math
|
||||
Entropy(S|T) = 5/14*0.970951+4/14*0+5/14*0.970951 = 0.693536
|
||||
```
|
||||
|
||||
Entropy(S|T) 代表在特征属性 T 的条件下样本的条件熵。那么最终得到特征属性 T 带来的信息增益为
|
||||
|
||||
IG(T) = Entropy(S)-Entropy(S|T) = 0.24675
|
||||
```math
|
||||
IG(T) = Entropy(S)-Entropy(S|T) = 0.24675
|
||||
```
|
||||
|
||||
**信息增益的计算公式**如下
|
||||
|
||||
IG(S|T) = Entropy(S)-sum(value(T), , |Sv|/S*Entropy(Sv))
|
||||
```math
|
||||
IG(S|T) = Entropy(S)-sum(value(T), , |Sv|/S*Entropy(Sv))
|
||||
```
|
||||
|
||||
其中 S 全部样本集合,value(T) 是属性 T 所有取值的集合,v 是 T 的其中一个属性值,Sv 是 S 中属性 T 的值为 v 的样例集合,|Sv| 为 Sv 中所含样例数。
|
||||
在决策树的每一个非叶子结点划分之前,先计算每一个属性所带来的信息增益,选择最大信息增益的属性来划分,因为信息增益越大,区分样本的能力就越强,越具有代表性,很显然这是一种自顶向下的贪心策略。以上就是ID3算法的核心思想。
|
||||
|
@ -93,7 +110,9 @@ Entropy(S|T) 代表在特征属性 T 的条件下样本的条件熵。那么最
|
|||
|
||||
接下来开始用 C++ 实现 ID3 算法,包括以下文件
|
||||
|
||||
ID3.cpp ID3.h main.cpp Makefile Test
|
||||
```sh
|
||||
ID3.cpp ID3.h main.cpp Makefile Test
|
||||
```
|
||||
|
||||
```cpp
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue