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;