首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

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

2012-07-02 
工厂模式+单例模式封装封装WekaFactory来构造Weka中各种对象?摘要:更方便更简单起见,封装了Weka??????//

工厂模式+单例模式封装封装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;}@Overridepublic <T extends Instances> T getInstance(String fileName) {File file = new File(fileName);return getInstance(file);}@Overridepublic <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;}@Overridepublic <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;}}

?

?

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

热点排行