Weka源码分析(2)——core.converters package分析

来源:互联网 发布:mac 购买icloud空间 编辑:程序博客网 时间:2024/06/08 00:49

该package的主要目标是将外部存在的各种各式的数据与weka内部的数据表示进行相互转换,以解决数据的导入导出问题。主要含有Loader和Saver,一个负责加载,一个负责导出。

1. Loader及其继承体系

Loader的继承体系如下:
Loader继承体系
Loader是个Interface,其接口定义如下:
Loader的类图
Loader定义了3种数据加载的模式常量,NONE/BATCH/INCREMENTAL。另外,定义了设置2种类型的数据源,File/InputStream的方法。获取Header的方法getStructure和实际数据的方法getDataSet;和获取下一行数据的方法getNextInstance

1.1 AbstractLoader

AbstactLoader类图
提供了所有Loader的默认实现,内部定义了m_retrieval field,用来保存Loader中定义的三种retrieval模式之一。对2个setSource方法提供了默认实现,该实现直接抛出异常,避免子类误用,这2个方法是为基于File的Loader子类设置的。
AbstractFileLoader是所有基于File的Loader的父类,其定义了如下fields:

field name 作用 备注 m_File CWD,当前工作路径 m_structure 解析后的header m_sourceFile 存储数据的文件 m_useRelativePath 如何解释m_sourceFile的路径 m_env 用来将形如”${}”的变量替换成实际值 以增加系统的可移植性

1.2 AbstractFileLoader的子类

所有File-based Loader的实现:

Class 职责 备注 ArffLoader 加载Arff格式文件 XRFFLoader 加载XML形式的Arff文件 C45Loader 加载C4.5格式的文件 .names和.data文件分开 CSVLoader CSV格式的文件 JSONLoader JSON格式的文件 LibSVMLoader 加载LibSVM需要的格式文件 参见libSVM网站 SVMLightLoader 加载svm light格式的文件 参见svmLight网站 MatlabLoader 加载Matlab格式文件 SerializedInstancesLoader 加载java ObjectStream序列化之后的Instances

1.3 DatabaseLoader

基于JDBC的,从数据库中加载数据的Loader子类。

1.3.1 fields

DatabaseLoader的fields定义
DatabaseLoader的field主要含有如下几类:
1. 与数据库connection相关的属性,m_URL、m_User、m_Password、m_CustomPropsFile
2. 读取模式控制字段,m_pseudoIncremental(实际是批量加载到内存,但是对weka是透明的)、m_checkForTable、m_nominalToStringLimit
3. 读取表数据时用到查询和字段,m_query、m_Keys、m_orderBy、m_idColumn、
4. 读取过程中的状态数据,m_firstTime、m_counter
5. 读取到的结果数据,m_structure、m_datasetPseudoInc、m_oldStructure、m_nominalStrings

1.3.2 methods

DatabaseLoader方法定义
这里需要注意的是,DatabaseLoader并没有override AbstractLoader中的setSource(File)和setSource(InputStream)方法,因为它是从数据库中加载,不是面向File和InputStream的,这也是AbstractLoader中为这2个方法提供的默认实现都直接throw exeption的原因——避免DatabaseLoader这样的子类误用这些方法。
DataBase中的数据类型到不同type的Attribute之间的映射关系如下,参见readInstance(ResultSet)方法:

DataBase Type Attribute Type 备注 STRING String/Nominal 实际Instance中存储码值,int类型,具体String还是nominal,受参数nominalToStringLimit参数控制,超过该值weka认为是取值过多,是String类型 TEXT String/Nominal BOOL Nominal true:1.0,false:0.0 BYTE Numeric up cast to double SHORT Numeric up cast to double INTEGER Numeric up cast to double LONG Numeric up cast to double DATE Date 存储Date.getTime()值 TIME Date 存储Time.getTime()值

1.4 TextDirectoryLoader

从一个含有text文件的目录中加载Arff文件的AbstractLoader的实现类。由于用的不多,不做过多分析。

1.4.1 fields

TextDirectoryLoader字段定义

1.4.2 methods

TextDirectoryLoader方法定义

2 Saver

Saver的继承体系如下,可以看出,基本与Loader的继承体系一一对应。
Saver继承体系
Saver类图
同Loader理,Save也定义了3种写入模式,NONE/BATCH/INCREMENTAL,该模式会影响写入的执行过程。Loader接口还定义set写入目的地的基于File和Stream的方法,以及关键的执行写入的writeBatch和writeIncremental方法。

2.1 AbstractSaver

2.1.1 fields

AbstractSaver字段定义

2.1.2 methods

略过

3 Capability

算法和数据的适应性能力匹配的类。
Capability类图
Capabilities内部定义了一个Enum,用来枚举可供检测的Capability,如果不匹配,应该Fail-Fast。
Capability内部定义的Enum

0 0
原创粉丝点击