weka源码分析

本文详细介绍了Weka的源码获取与导入Eclipse的步骤,以及Weka在分类、聚类和规则挖掘中的实现原理。通过分析Weka的C4.5决策树算法,展示了从构建分类器、节点折叠到剪枝的过程,揭示了算法的内部工作机制。
摘要由CSDN通过智能技术生成

 

weka源码获得与导入

1、下载weka3.7,解压其中的weka-src.jar的文件,包含lib,src,META-INF三个文件夹和另外两个文件;

2、在Eclipse下新建java project,命名为weka,在src下新建名为weka的包;

3、在此项目下import-->File System-->选择.../weka/src/main/java/weka,并全部导入;

4、项目导入库文件,biuldpath-->add external jar-->选择lib里的 java-cup.jar  JFlex.jar  junit.jar;

5、运行weka.gui.main成功;

 

WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归、聚类、关联规则以及在新的交互式界面上的可视化。

Weka是一个开源的软件,阅读并理解其源代码可以帮助我们更好的理解算法的细节,同时也能够扩展其算法以获得更广泛的应用。但是现在公开的资料中对weka源代码分析的内容很少,所以本博客推出weka源代码分析系列,将针对weka中实现各种算法分析器实现细节。

本系列根据weka功能的划分主要分析器分类算法、聚类算法、规则挖掘等,分别介绍其中的各个算法,最后介绍如何对weka进行扩展。

本系列主要分析weka3.7.6版本

本文首先概要列出分类、聚类以及规则挖掘等主要实现的算法以及类结构关系,以便有个大致的了解。

分类:

所有的分类器都继承自抽象类AbstractClassifier而AbstractClassifier继承自接口Classifier。集成关系如下图所示:


而类Classifier中主要包含以下接口:

public abstract voidbuildClassifier(Instances data) throws Exception;

该方法主要用于根据样本数据data训练出分类器;

public double classifyInstance(Instanceinstance) throws Exception;

该方法是对样本instance进行分类并返回最有可能的类;

public double[] distributionForInstance(Instanceinstance) throws Exception;

对样本instance进行分类,如果分类成功则返回的数组值包含该类别,否则数组元素全为0;

 

所有的classifier必须实现classifyInstance或distributionForInstance。

 

聚类:

所有的聚类算法都集成自AbstractClusterer,而AbstractClusterer继承自接口Clusterer,主要调用关系如下:



Clusterer主要实现的接口如下:

voidbuildClusterer(Instances data) throws Exception;

根据样本数据训练聚类算法;

intclusterInstance(Instance instance) throws Exception;

public double[]distributionForInstance(Instance instance) throws Exception;

为实例归类;

intnumberOfClusters() throws Exception;

返回聚类个数;

同样所有的聚类算法都必须实现clusterInstance或distributionForInstance。

 

规则挖掘:

关联规则主要实现的算法有Apriori,Fpgrowth等,

类关系如下:



Associator中主要实现

voidbuildAssociations(Instances data) throws Exception;

该方法主要用于生成规则生成器。

对于以上所列的算法的实现细节以及其他的诸如数据预处理、可视化等的代码后面会一一详细列出。

 

 

weka分类器-C4.5决策树

1.     算法概述

 C4.5,是机器学习算法中的另一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法,是相对于ID3算法的改进,主要改进点有:

1.      用信息增益率来选择属性。C4.5克服了ID3用信息增益选择属性时偏向选择取值多的属性的不足。

2.      在树构造过程中进行剪枝。

3.      对非离散数据也能处理。

4.      能够对不完整数据进行处理。

 

2.     算法过程

统计好样本集S,属性集A,分别求出属性集中每个属性的信息增益率,选中增益率最大的属性P,假设P总有n种情况的取值(连续变量要离散化),那么分别统计好第i种情况时样本集Si和除去P的属性集Pi,递归生成相对应的子树。

2.1 主要步骤

1  读取文件信息,统计数目

2  建立决策树

如果样本集为空,则生成一个信息数目都为0的树节点返回

如果样本均为同一类别,则生成一个叶子节点返回

计算节点正负样本的数目

如果属性值只有那个类别的属性,则生成一个叶子节点,并赋值类型索引

如果以上都不是,则选择一个增益率最大的属性(连续属性要用增益率离散化),按那个属性的取值情况从新定义样本集和属性集,建造相关子树

3  事后剪枝(采用悲观错误率估算)

4  输出决策树

5  移除决策时

 

3.     算法实现分析

3.1 训练分类器

public voidbuildClassifier(Instances instances) throws Exception {

 

      ModelSelectionmodSelection;

 

      if (m_binarySplits)

         modSelection= newBinC45ModelSelection(m_minNumObj, instances, m_useMDLcorrection);

      else

         modSelection= newC45ModelSelection(m_minNumObj, instances, m_useMDLcorrection);

      if (!m_reducedErrorPruning)

         m_root = newC45PruneableClassifierTree(modSelection, !m_unpruned,

                m_CF, m_subtreeRaising, !m_noCleanup, m_collapseTree);

      else

         m_root = newPruneableClassifierTree(modSelection, !m_unpruned,

                m_numFolds, !m_noCleanup, m_Seed);

      m_root.buildClassifier(instances);

   }

第一个if判断是否对nominal属性进行二分裂,第二个if是判断是否对tree进行剪枝。

modSelection后面会被用于选择足有的分裂模型。

m_root是该树的根节点。

上面比较重要的是最后一句m_root.buildClassifier(instances);用于在各节点中构建分类器。下面我们看看其代码:

(C45PruneableClassifierTree.java)

public voidbuildClassifier(Instances data) throws Exception {

 

……

      buildTree(data,m_subtreeRaising);

      if (m_collapseTheTree){

         collapse();

      }

      if (m_pruneTheTree) {

         prune();

      }

      if (m_cleanup) {

         cleanup(new Instances(data, 0));

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值