用java和weka进行分类
来源:互联网 发布:u盘安装系统mac 编辑:程序博客网 时间:2024/06/06 00:02
用weka进行分类的小程序。
package test.weka;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Random;import weka.classifiers.Classifier;import weka.core.Instances;import weka.classifiers.Evaluation;import weka.core.Instance;import java.util.Date;public class Myweka { private Instances trainInstances=null; private Evaluation evaluation=null; private File trainfile=null; private int classindex=0; /* * 构造函数: * 传入arff文件,和classindex * */ public Myweka(File trainfile,int classindex){ this.trainfile=trainfile; this.classindex=classindex; FileReader fReader=null; try{ fReader=new FileReader(trainfile); trainInstances=new Instances(fReader); trainInstances.setClassIndex(classindex); // evaluation=new Evaluation(trainInstances); 使用一个evaluation,跟调用方法是再new,的结果不一样 }catch(Exception e){ e.printStackTrace(); }finally{ try { fReader.close(); } catch (IOException e2) { e2.printStackTrace(); } } } /* * 将训练集作为测试集进行实验 * 并得到分类失败的样例行号 * * */ public void selfTestResult(Classifier classifier){ FileReader fReader=null; try { classifier.buildClassifier(trainInstances); evaluation=new Evaluation(trainInstances);//选择调用时,new一个evalution fReader=new FileReader(trainfile); Instances testInstances=new Instances(fReader); testInstances.setClassIndex(classindex); Instance tempInstance=null; int count=0; for(int i=0;i<testInstances.numInstances();i++){ tempInstance=testInstances.instance(i); if(classifier.classifyInstance(tempInstance)!=tempInstance.classValue()){ count++; System.out.println("第"+i+"个样本实例分类错误!"); } } System.out.println("有"+count+"个样本分类错误!"); evaluation.evaluateModel(classifier, testInstances); writeResult(); consoleResult(); } catch (Exception e) { e.printStackTrace(); }finally{ try{ fReader.close(); }catch(IOException e0){ e0.printStackTrace(); } } } /* * 传入测试集进行测试 * 这里默认测试集与训练集,classindex相同 * */ public void useTestset(Classifier classifier,File testFile){ FileReader fReader=null; try { evaluation=new Evaluation(trainInstances); classifier.buildClassifier(trainInstances); fReader=new FileReader(testFile); Instances testInstances=new Instances(fReader); testInstances.setClassIndex(classindex); Instance tempInstance=null; int count=0; for(int i=0;i<testInstances.numInstances();i++){ tempInstance=testInstances.instance(i); if(classifier.classifyInstance(tempInstance)!=tempInstance.classValue()){ count++; System.out.println("第"+i+"个样本实例分类错误!"); } } System.out.println("有"+count+"个样本分类错误!"); evaluation.evaluateModel(classifier, testInstances); writeResult(); consoleResult(); } catch (Exception e) { e.printStackTrace(); }finally{ try{ fReader.close(); }catch(IOException e0){ e0.printStackTrace(); } } } /* * 传入一个分类器 * 得到十折交叉验证结果 */ public void GetTenCrossResult(Classifier classifier){ try{ classifier.buildClassifier(trainInstances); evaluation=new Evaluation(trainInstances); evaluation.crossValidateModel(classifier, trainInstances, 10, new Random(1)); writeResult(); consoleResult(); }catch(Exception e){ e.printStackTrace(); } } private void writeResult(){ BufferedWriter bfr=null; try{ bfr=new BufferedWriter(new FileWriter(new File("result.txt"),true)); bfr.write(getCurrentTime()); bfr.newLine(); bfr.write("the number of Attributes: "+trainInstances.numAttributes()); bfr.newLine(); bfr.write("the number if instances: "+trainInstances.numInstances()); bfr.newLine(); bfr.write(evaluation.toSummaryString()); bfr.newLine(); bfr.write(evaluation.toClassDetailsString()); bfr.newLine(); bfr.write(evaluation.toMatrixString()); bfr.newLine(); bfr.flush(); }catch(IOException e){ System.out.println("文件非法或arff格式错误"); }catch (Exception e) { System.out.println("分类器创建失败"); }finally{ try{ bfr.close(); }catch(IOException e0){ e0.printStackTrace(); } } } private void consoleResult() throws Exception{ System.out.println(evaluation.toSummaryString()); System.out.println(evaluation.toClassDetailsString()); System.out.println(evaluation.toMatrixString()); } private String getCurrentTime(){ Date date=new Date(); DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return format.format(date); }}
经过测试发现,在main方法调用GetTenCrossResult()方法后,继续调用selfTestResult(),若是选择用同一个evaluation,即:在构造函数中new,跟在方法中new,得到的结果不一样,难道是使用一个evalution,第二次的结果会受第一次影响?
看到的大神,解释一下。
0 0
- 用java和weka进行分类
- weka进行分类
- Java调用weka.jar利用交叉验证方法进行分类
- 用WEKA进行数据挖掘,第2部分:分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集(聚类)
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- Java通过weka接口建立RF和SVM分类器
- Java weka分类返回分类名称classname
- 调用Weka API和使用GUI进行分类时,输出结果相反的原因及解决方法
- 使用Weka进行数据挖掘(Weka教程七)Weka分类/预测模型构建与评价
- 使用Weka进行数据挖掘(Weka教程八)Weka分类评价Evaluation输出分析
- Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现
- android studio常使用的插件
- Android实现动画的实现方式
- vijos_1460_拉力赛_LCA tarjan离线算法
- jQuery 核心 - noConflict() 方法
- 用java和weka进行分类
- 红黑树结构算法原理与代码解析
- 玩转 source insight --- 持续扩充
- [从头读历史] 第289节 神之物语 忒修斯的故事
- 一个悬浮窗demo
- 无法启动Print Spooler服务,错误1068,依存服务或组无法启动
- DC Spike直流峰值
- 类库中的常用的操作数组的方法
- curl分装好的类