基于香农熵的决策树算法

来源:互联网 发布:百度快速排名软件 编辑:程序博客网 时间:2024/06/05 07:36

基于香农熵的决策树算法


《机器学习实战》一书中有介绍构造决策树的算法。
所谓决策树就是已知一些项特征的信息和项最终分类,求通过特征判断项最终分类的递归决策树。例如书中的例子是判断一个动物是不是鱼类,下面为一个数据集。

def createDataSet():    dataSet = [\        [1, 1, 'yes'],        [1, 1, 'yes'],        [1, 0, 'no'],        [0, 1, 'no'],        [0, 1, 'no']]    labels = ['no surfacing', 'flippers']    return dataSet, labels

书里举的另一个例子是隐形眼镜的问题。书里提供了绘图引擎用于绘制决策树。


算法大致流程是:
1.获得数据集
2.找到一个好的特征划分数据集为两部分
3.递归这一过程直到数据集内全部为同种类
4.打印由上述划分确定的树状结构


那么如何划分数据集,也就是如何确定最佳划分状态?当然是信息量大的划分。信息量可以用香农熵刻画。
U(s)=Σ(pilogpi2)P(s=si)=pi{si}s

具体严格的数学推导我觉得可以用性质刻画定义(数学上很多函数都是先给出性质再解函数方程获得唯一定义,于是干脆用性质代替定义)。
显然U(s)有性质信息量等于各部分信息量之和:U(s)=ΣU(si)
并定义初值条件U(B(112))=1(bit)
那么,只需要求出U(s_i)即可,下面假设f(P(si))=U(si),只需要求出f(x)(0<x<1)

先考虑一个简单的问题,p=12k时,2k个状态信息量之和为U=2kf(p)=k(bit),因为由定义1bit信息可以解决一个二分问题。那么f(p)=k2k=plogp2,当然这仅仅解决了1p=2k情形。

然后利用相同手法可以得到性质(函数方程)f(x)x+f(f)y=f(x+y)x+y且有初值条件f(12)=12

这就是一个中规中规中矩的函数方程了,依次解决1p是整数,有理数情况,最后用连续条件(Cauchy法)推广到实数即可。

可以得到信息量的表示方法,也就是香农熵,注意与热力学熵推导过程一模一样,除了常数不同。


决策树代码略

0 0
原创粉丝点击