weka实现TAN(树增强朴素贝叶斯)

本文介绍了朴素贝叶斯算法的局限性,并详细阐述了TAN算法的原理,包括五个步骤:计算互信息、构建有向无环图、获取最大生成树等。接着,通过Java代码展示了如何在Weka平台上实现TAN算法,包括创建TreeAugmentNaive类、初始化关键数据结构以及计算互信息矩阵等关键步骤。
摘要由CSDN通过智能技术生成

1  NaiveBayes的局限

朴素贝叶斯成立最关键的假设就是属性之间相互独立。然而,这在现实生活中几乎是不可能的。虽然利用属性之间相互独立的假设,可以获得令人意想不到很好的分类正确率,但是如果知道属性之间的依赖,那岂不是能获得更高的分类正确率。自然而然的想法就是建立属性之间的依赖关系。

但是过于复杂的依赖关系将导致计算机复杂度的提升,对于解决实际问题又是不可取的。计算机科学是关于“trade off”的艺术,所以就有了TAN算法,只需要建立属性之间最简单的依赖关系,即每个属性只有一个前驱依赖属性。这样既满足了计算复杂度简单的要求,又能提高分类准确率。

2  TAN算法的描述

TAN算法可以描述为五步:

1. 计算每对属性的互信息

2. 建立一个有向无环图,顶点是属性,互信息是权值

3. 获得最大生成树

4. 选择一个根节点

5. 将类属性和各属性之间加边(可选)

3.  TAN算法程序实现

使用Weka平台的API接口实现。

3.1  创建TreeAugmentNaive类继承weka的 AbstractClassifier并声明需要用到的变量

// 关键数据结构,[类][属性值][属性值],用来计算互信息矩阵

private int[][][] m_CondiCounts;

// 每个属性在矩阵中开始的索引

private int[] m_StartIndex;

// 每个属性的值个数

private int[] m_NumAttValues;

        // 互信息矩阵

        private double[][] m_InfoMatrix;

        // 训练数据集

        private Instances m_Instances;

        // 训练集实例数

        private int m_NumInstances;

        // 属性个数

        private int m_NumAttributes;

        // 不含类属性的取值的总个数,比如outlook3个取值,天气数据集10个取值

        private int m_SumAttrValues;

        // 类的数目(也就是类属性取值数目)

        private int m_NumClasses;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值