到此为止,关于如何生成mulan的输入文件的方法比较零散,且有些方法不是合适大数据的情况,比如训练和测试
数据达到G级别以上。因此,次篇博客将总结出一个通用的方法,无论数据大小都可以实现。
(1)在matlab中已经有你的输入训练数据traintdata_ch和测试数据testdata_ch,都存在矩阵中。相应格式请参考
以前的博文,此处不再叙述。
csvwrite('traindata_ch.csv',traindata_ch);
csvwrite('testdata_ch.csv',testdata_ch);
(3)在eclipse中建立一个工程和一个新类CsvToArrf.java。
配置工程的方法:
A、下载Weka的linux版本,解压;
B、右键点击CreatArff->Properties->Java Build Path->Libraries->Add Extern Jars,选择刚才解压文 件中的weka.jar和weka-src.jar这两个jar包;
C、CsvToArrf.java的内容如下:
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileReader;
- import weka.core.Attribute;
- import weka.core.FastVector;
- import weka.core.Instance;
- import weka.core.Instances;
- import weka.core.converters.ArffSaver;
- /**
- * Generates a big ARFF file with different attribute types.
- *
- * @author WuQiang
- * <span style="color: rgb(0,130,0); font-family: Consolas,'Courier New',Courier,mono,serif; line-height: 18px;">Email:qiang4.wu@changhong.com</span>
- */
- public class CsvToArrf {
- public static void main(String[] args) throws Exception {
- FastVector atts;
- FastVector attVals;
- Instances data;
- double[] vals;
- int i;
- // 1. set up attributes
- atts = new FastVector();
- // - numeric
- double num_fea=294;//the dims of a feature
- for (i=1;i<=num_fea;i++)
- <span style="white-space:pre"> </span> atts.addElement(new Attribute("feature" + (i)));
- // - nominal ;only two {0,1}
- attVals = new FastVector();
- attVals.addElement("0");
- attVals.addElement("1");
- double num_labels=5;//the number of classes
- for (i=1;i<=num_labels;i++)
- atts.addElement(new Attribute("label"+(i),attVals));
- // 2. create Instances object
- data = new Instances("traindata_ch",atts,0);
- // 3. fill with data from 。csv file
- String fileName="E:/methods/Eclipse/Create_Arrf/data/traindata_ch.csv";
- String result=null;
- FileReader fileReader=null;
- BufferedReader bufferedReader=null;
- fileReader=new FileReader(fileName);
- bufferedReader=new BufferedReader(fileReader);
- // String read=null;
- // vals = new double[data.numAttributes()];
- while ((result=bufferedReader.readLine())!=null)
- {
- String [] subAtt=result.split(",");
- // System.out.println(subAtt.length);
- vals = new double[data.numAttributes()];
- for(i=0;i<num_fea;i++)
- {
- <span style="white-space:pre"> </span> double d = Double.parseDouble(subAtt[i]);
- <span style="white-space:pre"> </span> vals[i] = d;
- }
- // - nominal
- for(;i<num_fea+num_labels;i++)
- vals[i] = attVals.indexOf(subAtt[i]);
- // setVals(vals,data);
- //---- add
- data.add(new Instance(1.0,vals));
- // data.add(new Instance(1.0,'\n'));
- }
- bufferedReader.close();
- fileReader.close();
- //4. output data
- System.out.println(data);
- //save to a arrf file
- ArffSaver saver = new ArffSaver();
- saver.setInstances(data);
- saver.setFile(new File("./data/traindata_ch.arff"));
- // saver.setDestination(new File("./data/test.arff")); // **not** necessary in 3.5.4 and later
- saver.writeBatch();
- }
- /*private static void setVals(double[] vals,Instances data) {
- <span style="white-space:pre"> </span>// TODO Auto-generated method stub
- <span style="white-space:pre"> </span>data.add(new Instance(1.0,vals));
- <span style="white-space:pre"> </span>
- }*/
- }
注意:生成traindata_ch.arrf之后,将traindata_ch.csv改为testdata_ch.csv生成testdata_ch.arrf。
(4)关于如何生.xml文件的方法,本人是在是没有找到合适的方法。如果有人找到了好的方法,希望告诉我一声。
此处,贴出一个很笨的原始生成.xml文件的方法,采用matlab语言写的。
到此,生成.arrf文件和.xml文件已经全部完成,其中训练数据和测试数的.xml文件是完全一样的,只是文件名不
- clc;
- clear all;
- str1='<?xml version="1.0" encoding="utf-8"?>';
- str2='<labels xmlns="http://mulan.sourceforge.net/labels">';
- basestr1='<label name="';
- basestr2='"></label>';
- endlabel='</labels>';
- lab='label';
- fid=fopen('traindata_ch.xml','w');
- fprintf(fid,'%s\n',str1);
- fprintf(fid,str2);
- for i=1:num_class %num_class 是总共的类数,需要按照自己的实际需要进行修改
- lab_=[basestr1 strcat(lab,num2str(i)) basestr2];
- fprintf(fid,lab_);
- end
- fprintf(fid,'%s',endlabel);
- fclose(fid);
一样巴了。接下来就是如何实验了。
此博文的代码全部经过测试,可能还是有很多的不足的地方。
————————此方法仅供参考,如有不足请指正!