信息熵很亮的是在你知道一个事件的结果后,平均会带给你多大的信息量,当事件的不确定性越大,那么要搞清它所需要的信息量也就越大,也就是信息熵越大,是无序性,不确定性的度量指标。
信息熵的计算:
-p[i]logp[i],底数为2
public static double calcEntropy(int p[]) { double entropy = 0; // 用来计算总的样本数量,p[i]/sum即i的概率 double sum = 0; int len = p.length; for (int i = 0; i < len; i++) { sum += p[i]; } for (int i = 0; i < len; i++) { entropy -= p[i] / sum * log2(p[i] / sum); } return entropy; }
给定一个样本数组,先一轮循环计算出样本总量,后面即可得出每个样本的概率,就可以套用公式计算了
信息增益就是信息熵的变化值,信息熵下降最快的节点就可以作为决策树的根节点,缩短树的高度
一个属性A相对样本集S的信息增益为:
gain(S,A) = H(S) - A属性为已知值的加权信息熵
outlook | temperature | humidity | windy | play |
sunny | hot | high | FALSE | no |
sunny | hot | high | TRUE | no |
overcast | hot | high | FALSE | yes |
rainy | mild | high | FALSE | yes |
rainy | cool | normal | FALSE | yes |
rainy | cool | normal | TRUE | no |
overcast | cool | normal | TRUE | yes |
sunny | mild | high | FALSE | no |
sunny | cool | normal | FALSE | yes |
rainy | mild | normal | FALSE | yes |
sunny | mild | normal | TRUE | yes |
overcast | mild | high | TRUE | yes |
overcast | hot | normal | FALSE | yes |
rainy | mild | high | TRUE | no |
如上图数据所示,根据该数据,构造出一颗决策树,将来可以根据不同的天气情况决定是否出去玩play
先计算在不知任何天气情况下的信息熵,直接看play列,yes的有9个,no的有5,所以套用公式计算信息熵
H = -9/14*log(9/14)-5/14*log(5/14) = 0.940
然后依次计算每个属性的信息熵,先看outlook属性,当outlook为已知值的时候,计算该信息熵
1、当outlook=sunny时,看play列,yes的有2个,no的有3个,计算信息熵为
H = -2/5*log(2/5)-3/5*log(3/5) = 0.971
2、当outlook=overcast时,看play列,yes的有4,no的有0,计算信息熵
H = 0
3、当outlook=rainy时,看play列,yes的有3个,no的有2个,计算信息熵
H = 0.971
再看当outlook为sunny,overcast,rainy时的概率分别为5/14,4/14,5/14
所以当outlook为已知值的时候,信息熵为5/14*0.971+4/14*0+5/14*0.971 = 0.693
所以得出outlook属性的信息增益gain=0.940-0.693 = 0.247
同理我们再计算temperature,humidity,windy的信息增益分别为0.029,0.152,0.048
由此得知,信息增益最大的属性为outlook,所以选择该节点为决策树的根节点
outlook | temperature | humidity | windy | play | |||||||||
yes | no | yes | no | yes | no | yes | no | yes | no | ||||
sunny | 2 | 3 | hot | 2 | 2 | high | 3 | 4 | FALSE | 6 | 2 | 9 | 5 |
overcast | 4 | 0 | mild | 4 | 2 | normal | 6 | 1 | TRUR | 3 | 3 | ||
rainy | 3 | 2 | cool | 3 | 1 |
分支Overcast的所有样例都是正例,所以成为目标分类为Yes的叶结点。