SuperParent算法-一种半朴素贝叶斯网络算法

来源:互联网 发布:unity3d难学吗 编辑:程序博客网 时间:2024/05/19 17:51

朴素贝叶斯设定了一个假设前提:输入实例的各个属性之间是相互独立的,其结构图如下图所示
朴素贝叶斯结构图
但是在现实中很多时候这种假设是不成立的,本文要介绍的SuperParent是对朴素贝叶斯的一种扩展,打破了这种属性之间相互独立的假设,属性之间可以有依赖关系。

先给出3个概念。
1. 孤儿节点:如果一个节点除了类节点之外没有别的节点指向他(意味着其没有父节点),则称它是一个孤儿节点;
2. SuperParent(超父)节点:如果一个节点指向了所有的孤儿节点,则称其为超父(SuperParent)节点,例如下图
SuperParent节点示意图
上图中的A1就是一个超父节点;
3. 最喜爱的子节点:对于SuperParent节点指向孤儿节点的线我们称为弧(arc),在所有生成的弧中,如果有一条弧对分类器精度提高最大(必须比当前最好的分类器效果好),则称被指向的这个孤儿节点是超父节点最喜爱的子节点。
下面描述一下算法的过程。

  1. 使用朴素贝叶斯初始化贝叶斯网络(当前最好 的分类器为朴素贝叶斯分类器),计算分类精度(可以使用Leave-One-Out来计算错误数或者正确数来量化)
  2. 使每个属性节点依次作为超父节点,并依次计算每个节点作为超父节点时的分类精度,选择作为超父时对分类精度提高最大的节点作为本轮的超父节点,更新当前最好分类精度。
  3. 为2中选出的超父节点选择最喜爱的子节点,即从此超父节点出发依次向各个孤儿节点临时添加一条弧,每临时添加一条弧计算其分类精度,如果分类精度最高的那条弧相比当前分类器提高了分类精度,则添加那条弧,此弧指向的孤儿节点即为最喜爱的子节点,此时,此节点也从孤儿节点集合中删除,更新当前最好分类精度,然后返回步骤2;否则,算法结束,返回当前最好的分类器
    若当前孤儿节点数<=1,算法也结束,返回当前分类器

最后说一下Leave-One-Out,这是一种交叉验证方法,假设有N条实例,分为N份,将N-1条份用于训练,剩下的1份作测试,循环N次,每份实例参与且仅参与测试一次,且参与训练的实例不参与测试。
附上代码地址:SuperParent代码地址