通过Eclipse生成mulan软件的输入文件.arrf文件

    采用matlab和Weka方式生成.arrf文件的有一个致命的缺点,那就是文件太多无法手动打开.csv文件,并且在使

Weka命令行转换的时候直接挂掉了,我这也是在试验中发现的。由于我要训练和测试的数据量非常大,训练数据

成.csv文件为2G,测试的600M。因此下面采用在Eclipse下来生成.arrf文件。

(1)下载安装JDk和Eclipse,教程网上很多,此处不再叙述。

(2)下载Weka的linux版本,解压。

(3)新建工程CreatArff,并在此工程下建立新的类FitAttTest。

(4)右键点击CreatArff->Properties->Java Build Path->Libraries->Add Extern Jars,选择刚才解压文件中的weka.jar和weka-src.jar;

其中FitAttTest的代码内容如下:

import java.io.File;

import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ArffSaver;
/**
 * Generates a  ARFF file with different attribute types.
 *
 * @author WuQiang
 */

public class FitAttTest {
  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=3;//the dims of a feature
    for (i=1;i<=num_fea;i++)
    	 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("MyRelation", atts, 0);

    // 3. fill with data;[2.3,5.6,1.4,0,1,1,0,0; 2.0,1.3,2.6,0,1,0,0,1]
    // first instance
    vals = new double[data.numAttributes()];
    // - numeric
    vals[0] = 2.3;
    // - numeric
    vals[1] = 5.6;
    // - numeric
    vals[2] = 1.4;
    // - nominal
    vals[3] = attVals.indexOf("0");
    vals[4] = attVals.indexOf("1");
    vals[5] = attVals.indexOf("1");
    vals[6] = attVals.indexOf("0");
    vals[7] = attVals.indexOf("0");
    //---- add
    data.add(new Instance(1.0, vals));
    // second instance
    vals = new double[data.numAttributes()];
    // - numeric
    vals[0] = 2.0;
    // - numeric
    vals[1] = 1.3;
    // - numeric
    vals[2] = 2.6;
    // - nominal
    vals[3] = attVals.indexOf("0");
    vals[4] = attVals.indexOf("1");
    vals[5] = attVals.indexOf("0");
    vals[6] = attVals.indexOf("0");
    vals[7] = attVals.indexOf("1");
    //----- add
    data.add(new Instance(1.0, vals));
    // 4. output data
    System.out.println(data);
    //save to a arrf file
     ArffSaver saver = new ArffSaver();
     saver.setInstances(data);
     saver.setFile(new File("./data/test.arff"));
  //   saver.setDestination(new File("./data/test.arff"));   // **not** necessary in 3.5.4 and later
     saver.writeBatch();
  }
}

代码输出的结果如下:

@relation MyRelation


@attribute feature1 numeric
@attribute feature2 numeric
@attribute feature3 numeric
@attribute label1 {0,1}
@attribute label2 {0,1}
@attribute label3 {0,1}
@attribute label4 {0,1}
@attribute label5 {0,1}


@data
2.3,5.6,1.4,0,1,1,0,0
2,1.3,2.6,0,1,0,0,1

同时你也可以在 "./data/test.arff"这里找到生成的.arrf文件。

    本方法只是做了精简版的.arrf文件生成方法,复杂的内容可以参考官网上面。如果你的数据量很大的话,那么可以从.csv文件读入相关的数据即可,其中外部.csv文件中就是matlab生成的文件,不要要手动打开添加属性标签。

————————此方法仅供参考,如有错误请指正!

你可能感兴趣的:(java,eclipse,linux,.arrf,mulan)