weka 源码分析

1.1模块划分
weka采用maven作为构建工具,从module划分的角度,是个单module系统,但是weka的从package划分上体现了“关注点分离”。

各package关注点(职责划分)如下:

分类    package name    职责
算法    associations    关联规则算法
attributeSelection    属性选择算法
classifiers    分类算法
clusterers    聚类算法
底层基础服务    core    
数据预处理    filters    数据过滤、变换
常见分布估计    estimators    
数据生成器    datagenerators    按照指定的规则生成数据
易用性部分    experiment    
gui    用户界面
Knowledgeflow    工作流支撑系统
1.2core package分析
1.2.1 数据表示
逻辑上,挖掘算法将数据集(DataSet)认为是“二维表”。

Weka中对应关系如下:

概念    Weka 实现    备注
属性    Attribute    
属性元信息    AttributeInfo    
行数据    Instance    
Header    Instance**s**    weka用一个class表示2个概念
整个数据集(Header+行数据集合)    Instance**s**    
1.2.2class diagram


1.2.3Attribute
1.2.3.1fields

注意:weka遵循了“匈牙利”命名法,fields都以“m_”开头。

field name    含义    备注
m_Name    属性名    
m_Type    属性类型    属性类型采用了int类型的字符常量,没有采用Enum,更没有采用Magic Number,数据类型为上图中绿框部分。
m_Index    该属性在Instances所有的属性中的顺序位置    
m_Weight    该属性的权重    
1.2.3.2 constructor

不同颜色代表构造不同的type的Attribute,主要有String、Nominal、Date、Numeric、Relational几种不同类型。

1.2.3.3 properties

Attribute的属性基本上是对其fields的封装,另外,它还对其聚合的AttributeMetaInfo和AttributeInfo的属性的2次封装。

1.2.4AttributeInfo
3个子类,分别处理不同的属性的编码和解码问题。

1. NominalAttributeInfo:处理Nominal类型的属性取值(String类型)到码值(int类型)的映射,以及处理过长属性取值的压缩问题。
2. DateAttributeInfo:处理Date的格式解析问题。
3. RelationalAttributeInfo:记录数据集的Header(Instances实例)

1.2.5AttributeMetaInfo

可以看出,定义了一些Numeric类型Attribute附加的属性,这些附加属性决定了能否对该属性进行额外的数学运算。
该类并不复杂,本可以将其fields全部都定义到Attribute类中,但是,其存在的意义在于:并不是每个Attribute都会有这么多的附加属性,单独抽取出来可以在需要的时候再创建,再与Attribute实例关联,降低Attribute类的复杂性。

1.2.4 Instance及其继承体系
表示数据集的“单行数据”, Instance只封装了数据,Instance并没有直接关联Attribute。那么Instance要获得每个index位置的数据的Attribute是如何操作的呢?这就需要通过Instance关联的Instances来间接查询。这样一个Instances只会关联一个Attribute集合,如果让每行数据Instance都关联一个Attribute实例,会浪费存储空间,也没有必要。
Instance是个Interface,定义了如下的接口:


总的来说,Instance接口定义了如下内容:
1. 遍历,以及通过下标获取、测试、设置Attribute的方法,对于类标号Attribute,定义了Convenient方法。
2. 按照下标或者Attribute来get和set对应Cell取值的方法。
3. 判断以及处理缺失值的方法。
4. 判断与Instance是否Header相同的接口(同规格的数据)。
5. 方便输出和调试的toString()方法。

1.2.6 AbstractInstance
1.2.6.1 fields

AbstractInstance是Instance最上层的实现,其定义的所有子类必须要有的fields,避免子类重复定义。

field name    字段含义    备注
m_Dataset    单行数据所在的整个数据集    之所以关联整个数据集,是因为Header整个数据集一份,单行数据需要通过Header来识别每个Cell数据
m_AttValues    Cell的取值集合    double类型表示每个Cell取值,非Numeric类型的取值,会通过编码映射到double
1.2.6.2 methods
基于其fields定义,AbstractInstance对Instance接口的方法,提供了默认实现,子类只有在有特殊需求时才会对其进行override。避免子类中代码重复。实际上,默认实现中大部分都是基于AbstractInstance内部关联的m_Dataset来实现的。

1.2.7 DenseInstance
DenseInstance用来处理“稠密”数据集的行数据(与之后的SparseInstance相对应),内部的double[]存储每一个Cell的值。它没有定义额外的fields。

1.2.7.1 fields
略过

1.2.7.2 methods

由于“稠密”行数据,获取、设置、判断、copy等都是逐个Cell进行的,与SparseInstance不同,根据其“稠密“存储的方式,实现了Instance接口中规定的剩余接口。

1.2.8 SparseInstance
SparseInstance用来处理“稀疏”数据集的行数据,稀疏行数据只存储其中的”非零值”。

1.2.8.1 fields

由于只存储非零值,需要额外采用int[] m_Indices来记录哪些下标位置是非零值,并且额外定义了一个int类型的m_NumAttributes来定义最大属性个数,即:最大非零值数组的长度。

1.2.8.2 methods

可以看出,SparseInstance与DenseInstance实现的方法基本一致,这是因为2者仅仅是Cell数据的存储方式不同,而这些存储方式的不同,直接影响了这些方法的实现,所以必须放到这2个子类中实现,不能pull-up到其父类AbstractInstance中。

1.2.9 BinarySparseInstance
存储二进制行数据,略过。

1.2.10 UnsafeInstance
用的不多,不分析了。

1.2.11 Instances
表示整个Dataset,含有所有的行数据和列数据(Attribute)定义

1.2.11.1 fields

除了聚合的Attribute集合m_Attributes和Instance集合m_Instances之外,还定义了方便进行内部查找的Covenient fields m_NamesToAttributeIndices;内部进行Arff文件加载并初始化Attribute集合和Instance集合时需要用到的当前已经读的文件的行数m_Lines;以及class类标号的下标m_ClassIndex。

1.2.11.2 methods

Instances定义的方法基本含有如下几类:
1. 2个数据集规格比较,equalsHeader
2. 行数据管理,swap、checkXXX、delete、first、last
3. 列(Attribute)管理,attributeXXX
4. 统计,variances、XXXStatsXXX、meanOrMode、numberOfDistinctValues、kSmallestValue
5. 构造CrossValidation数据集的,trainCV
6. 抽样,以resample开头的、stratify
7. 排序,xxxSort
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值