`

工厂模式+单例模式封装封装WekaFactory来构造Weka中各种对象

 
阅读更多


 摘要:更方便更简单起见,封装了Weka

 

 

 

 

 

 

// 测试WekaFactory

package cn.edu.xmu.bdm.wekainjava.utils;

import java.io.File;

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.trees.J48;
import weka.core.Instances;

public class TestWekaFactory {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		File trainFile = new File(
				"C:\\Program Files\\Weka-3-6\\data\\cpu.with.vendor.arff");
		File testFile = new File(
				"C:\\Program Files\\Weka-3-6\\data\\cpu.with.vendor.arff");
		/**
		 * 1. 获取weka工厂类
		 */
		WekaFactory wi = WekaFactoryImpl.getInstance();
		/**
		 * 2. 从工厂中获取分类器 具体使用哪一种特定的分类器可以选择 这样就构建了一个简单的分类器
		 */
		Classifier j48 = (Classifier) wi.getClassifier(J48.class);

		/**
		 * 3. 从工厂中获取训练样本和测试样本实例
		 */
		Instances instancesTrain = wi.getInstance(trainFile);
		instancesTrain.setClassIndex(0);

		Instances instancesTest = wi.getInstance(testFile);
		instancesTest.setClassIndex(0);

		/**
		 * 4.使用训练样本训练分类器
		 */
		j48.buildClassifier(instancesTrain);

		/**
		 * 5. 从工厂中获取使用Evaluation,测试样本测试分类器的学习效果
		 */
		double sum = instancesTrain.numInstances();
		Evaluation testingEvaluation = wi.getEvaluation(j48, instancesTest);
		int length = instancesTest.numInstances();
		for (int i = 0; i < length; i++) {
			// 通过这个方法来用每个测试样本测试分类器的效果
			testingEvaluation.evaluateModelOnceAndRecordPrediction(j48,
					instancesTest.instance(i));
		}

		System.out.println("分类器的正确率:" + (1 - testingEvaluation.errorRate()));
	}

}

 

 


 

 

工厂模式封装的优点:
    1. 良好的封装性,代码结构清晰
    2. 扩展性很好
    3. 屏蔽产品类
    4. 典型的解耦框架

单例模式的优点:
   1. 减少内存开支
    2. 减少系统性能开销
    3. 避免对资源的多重占用
    4. 可以在系统设置全局访问点,优化和共享资源访问

单例的创建使用双重检查加锁方式,延迟加载以及线程安全

package cn.edu.xmu.bdm.wekainjava.utils;

import java.io.File;

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.core.Instances;

/**
 * desc:weka各种类工厂
 * <code>WekaFactory</code>
 * @version 1.0
 * @author chenwq
 *
 */
public abstract  class WekaFactory {
	/**
	 * java.lang.Object
  	 * 		——weka.core.Instances
	 * @param clazz
	 * @return
	 */
	public abstract <T extends Classifier> T getClassifier(Class<T> clazz);
	
	/**
	 * 从.arff文件中获取样本Instances;
	 * @param fileName 获得instances的文件名
	 * @return
	 */
	public abstract <T extends Instances> T getInstance(String fileName);
	/**
	 * 从.arff文件中获取样本Instances;
	 * @param file 获得instances的File对象
	 * @return
	 */
	public abstract <T extends Instances> T getInstance(File file);
	
	/**
	 * 获得一个Evaluation对象
	 * @param h 一个已经训练过的分类器 
	 * @param ins  测试样本
	 * @return
	 */
	public abstract <T extends Evaluation> T getEvaluation(Classifier h, Instances ins);
}

  

 

package cn.edu.xmu.bdm.wekainjava.utils;

import java.io.File;

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ArffLoader;

/**
 *@see cn.edu.xmu.bdm.wekainjava.utils.WekaFactory
 */
public class WekaFactoryImpl extends WekaFactory{
	private volatile static WekaFactoryImpl instance = null;

	private WekaFactoryImpl() {
	}

	public synchronized static WekaFactoryImpl getInstance() {
		if (instance == null) {
			instance = new WekaFactoryImpl();
		}
		return instance;
	}
	
	@Override
	/**
	 * @
	 */
	public <T extends Classifier> T getClassifier(Class<T> clazz) {
		Classifier classifier  = null;
		try{
			classifier = (Classifier)Class.forName(clazz.getName()).newInstance();
		}catch(Exception e){
			//TODO:创建Classifier异常处理
		}
		return (T)classifier;
	}

	@Override
	public <T extends Instances> T getInstance(String fileName) {
		File file = new File(fileName);
		return getInstance(file);
	}

	@Override
	public <T extends Instances> T getInstance(File file) {
		Instances inst = null;
		try {
			ArffLoader loader = new ArffLoader();
			loader.setFile(file);
			inst = loader.getDataSet();
		} catch (Exception e) {
			//TODO:创建Instances异常处理
		}
		return (T)inst;
	}

	@Override
	public <T extends Evaluation> T getEvaluation(Classifier h, Instances ins) {
		try {
			Instance testInst;
			/*
			 * Evaluation: Class for evaluating machine learning models
			 * 即它是用于检测分类模型的类
			 */
			Evaluation testingEvaluation = new Evaluation(ins);
			int length = ins.numInstances();
			for (int i = 0; i < length; i++) {
				testInst = ins.instance(i);
				// 通过这个方法来用每个测试样本测试分类器的效果
				testingEvaluation.evaluateModelOnceAndRecordPrediction(h,
						testInst);
			}
			return (T)testingEvaluation;
		} catch (Exception e) {
			System.out.println("haha bug!");
			System.out.println(e);
		}
		return null;
	}
}

 

 

0
0
分享到:
评论
4 楼 chenwq 2012-01-18  
weka的wiki
http://weka.wikispaces.com/
3 楼 chenwq 2012-01-17  
http://59.77.16.75/bbs/forum.php?mod=viewthread&tid=120&highlight=weka
2 楼 chenwq 2012-01-17  
多线程交叉验证:
http://weka-parallel.sourceforge.net/
1 楼 chenwq 2012-01-17  
weka很好的参考资源:
http://laps.ufpa.br/aldebaro/weka/index.html

相关推荐

    WEKA中文教程

    WEKA中文教程WEKA中文教程WEKA中文教程WEKA中文教程WEKA中文教程WEKA中文教程

    WEKA完整中文教程 实验教程 入门教程

    **WEKA全称是Waikato Environment for Knowledge Analysis,它是一个强大的数据挖掘工具,...总的来说,本教程是WEKA初学者的理想起点,通过系统的学习和实践,可以迅速掌握这一强大工具,并应用于实际的数据分析项目。

    Weka中算法说明

    在 Weka 中,可以使用 predict() 函数来根据分类或聚类结果预测新数据的类别,可以使用 table() 函数来比较两个因子对象,可以使用 evaluate_Weka_classifier() 函数来评估模型的执行,如:TP Rate,FP Rate,...

    基于Weka和matlab平台的多层感知机模式识别实验.pdf

    本实验的目的是让学习者掌握使用Weka平台构建多层感知机(MLP)模型的实践操作,并理解MLP在模式识别等多个领域中的应用。Weka是一个包含了机器学习算法的集合,用于数据挖掘任务,它能通过图形用户界面(GUI)或...

    weka完整中文教程

    聚类是将数据集划分为多个组或类的过程,聚类分析的目标是使得同一个簇中的数据对象之间具有较高的相似性,而不同簇中的对象差异性较大。Weka提供了多种聚类算法,如k-means、EM和DBSCAN等,用户可以根据数据集的...

    weka中K-means使用演示

    WEKA 中 K-Means 使用演示 K-Means 算法是聚类分析中的一种常用方法,WEKA 作为一款功能强大的人工智能数据挖掘软件,也提供了 K-Means 算法的实现。下面将详细介绍如何使用 WEKA 实现 K-Means 聚类。 K-Means ...

    weka中文教程.pdf

    weka中文教程

    weka中使用libsvm需要的包

    2. wlsvm.jar:这个文件可能是Weka对Libsvm的一个封装或者扩展,使得Libsvm更好地与Weka的API兼容,便于在Weka环境中使用。它可能包含了将Libsvm的算法集成到Weka数据流处理、模型评估和可视化组件中的必要接口和类...

    weka 中em算法详细解析

    标题:“Weka中EM算法详细解析” 描述:“深入解析Weka中的EM算法,内容详尽,值得学习。” 根据给定的文件信息,我们将探讨Weka中EM算法的关键知识点,包括其在Weka框架中的实现、EM算法的工作原理、以及算法在...

    Weka源码及中文文档

    源码中的类和方法设计遵循了良好的面向对象编程原则,易于理解和扩展。将其加载到Eclipse这样的集成开发环境中,可以方便地进行调试和修改,对于学习和实践算法具有很高的价值。 **Weka的功能模块** 1. **数据...

    weka源码解析 instances类

    在Weka中,`Instances`类是一个核心组件,用于封装数据集,它不仅包含了数据本身,还包含了一些元数据(如属性名称、类型等)。 #### 二、Instances类的结构与功能 ##### 2.1 基本结构 `Instances`类主要负责管理...

    Weka 中文版 v0.3 发布 基于weka 3.7.12 x64

    理论上将根目录下的 weka.jar 提取出来覆盖你之前安装好的 weka 目录中的 weka.jar,即可实现 weka 汉化,32位和64位都可以用,但前提是你安装的 weka 版本要是 3.7.12。最好事先备份好你的 weka.jar文件,出现问题...

    WEKA中文详细教程

    WEKA中文详细教程

    java中调用weka

    "Java中调用Weka" Weka是一个非常流行的数据挖掘工具,Java是目前最流行的编程语言之一。在Java中调用Weka可以让开发者们更方便地使用Weka的功能。本文将介绍如何在Java中调用Weka,并对Weka中的主要组件进行介绍。...

    weka使用中文教程

    WEKA 使用中文教程 WEKA(Waikato Environment for Knowledge ...WEKA 是一个功能强大且易于使用的数据挖掘工具,能够满足各种数据挖掘需求。WEKA 的中文教程可以帮助初学者快速掌握 WEKA 的使用方法和数据挖掘技术。

    weka中文教程(高清PDF版本)

    在Weka中,可以通过不同的方法来评估特征的重要性,从而帮助用户去除不重要的属性,减少数据集的复杂性,并提升模型的准确性。 6. 可视化(Visualize) 可视化功能使得用户可以图形化地探索和展示数据。Weka提供...

    Weka中各种分类算法和聚类算法集成

    本工具包集成了Weka中最新的分类和聚类算法,将其打包成jar包,方便java开发者调用

    Weka中文教程

    Explorer模块是Weka中非常重要的部分,它允许用户通过图形界面来执行机器学习任务。在这个模块中,用户可以加载数据集,然后对数据集进行分类或聚类分析。 在进行分类学习之前,用户需要对数据集进行准备,包括数据...

Global site tag (gtag.js) - Google Analytics