【问题标题】:Using a arff file for storing data使用 arff 文件存储数据
【发布时间】:2014-03-10 11:42:54
【问题描述】:

我正在使用这个示例为我的 weka projext enter link description here 创建我的 .arff 文件。

double[][] data = {{4058.0, 4059.0, 4060.0, 214.0, 1710.0, 2452.0, 2473.0, 2474.0, 2475.0, 2476.0, 2477.0, 2478.0, 2688.0, 2905.0, 2906.0, 2907.0, 2908.0, 2909.0, 2950.0, 2969.0, 2970.0, 3202.0, 3342.0, 3900.0, 4007.0, 4052.0, 4058.0, 4059.0, 4060.0}, 
                       {19.0, 20.0, 21.0, 31.0, 103.0, 136.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 212.0, 243.0, 244.0, 245.0, 246.0, 247.0, 261.0, 270.0, 271.0, 294.0, 302.0, 340.0, 343.0, 354.0, 356.0, 357.0, 358.0}};

    int numInstances = data[0].length;

    FastVector atts = new FastVector();
    ArrayList<Instance> instances = new ArrayList<Instance>();
    for (int dim = 0; dim < 2; dim++) {
        // Create new attribute / dimension
        Attribute current = new Attribute("Attribute" + dim, dim);
        // Create an instance for each data object


        if (dim == 0) {
            for (int obj = 0; obj < numInstances; obj++) {
                instances.add(new SparseInstance(0));

            }
        }

        // Fill the value of dimension "dim" into each object
        for (int obj = 0; obj < numInstances; obj++) {
            instances.get(obj).setValue(current, data[dim][obj]);
            System.out.println(instances.get(obj));
        }

        // Add attribute to total attributes
        atts.addElement(current);

    }

     // Create new dataset
    Instances newDataset = new Instances("Dataset", atts, instances.size());

    // Fill in data objects
    for (Instance inst : instances) {
        newDataset.add(inst);       
    }

    BufferedWriter writer = new BufferedWriter(new FileWriter("test.arff"));
    writer.write(newDataset.toString());
    writer.flush();
    writer.close();
}

我注意到结果格式将行元素放入向量 在 .arff 文件的列中。我想将整行放在 .arff 文件的第一行。我该怎么做?对于我来说,二维向量的最后一列代表行数据的标签。

我的 arff 文件的预期结果:

4058.0, 4059.0, 4060.0, 214.0, 1710.0, 2452.0, 2473.0, 2474.0, 2475.0, 2476.0, 2477.0, 2478.0, 2688.0, 2905.0, 2906.0, 2907.0, 2908.0, 2909.0, 2950.0, 2969.0, 2970.0, 3202.0, 3342.0, 3900.0, 4007.0, 4052.0, 4058.0, 4059.0, 4060.0, 1 // for example the first row
 19.0, 20.0, 21.0, 31.0, 103.0, 136.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 212.0,  
 243.0, 244.0, 245.0, 246.0, 247.0, 261.0, 270.0, 271.0, 294.0, 302.0, 340.0, 343.0, 
 354.0, 356.0, 357.0, 358.0, 0 // the second row.

【问题讨论】:

  • 能否分享一下结果和预期的 ARFF 文件?

标签: java weka


【解决方案1】:

示例中的代码将表中的每一列视为一个实例(因此有 29 个实例,每个实例有两个属性)。听起来您想将每一行视为一个实例(给两个实例,每个实例有 29 个属性):

double[][] data = {
                    {4058.0, 4059.0, ... }, /* first instance */
                    {19.0, 20.0, ... }      /* second instance */
                  };

int numAtts = data[0].length;
FastVector atts = new FastVector(numAtts);
for (int att = 0; att < numAtts; att++)
{
    atts.addElement(new Attribute("Attribute" + att, att));
}

int numInstances = data.length;
Instances dataset = new Instances("Dataset", atts, numInstances);
for (int inst = 0; inst < numInstances; inst++)
{
    dataset.add(new Instance(1.0, data[inst]));
}

BufferedWriter writer = new BufferedWriter(new FileWriter("test.arff"));
writer.write(dataset.toString());
writer.flush();
writer.close();

我将SparseInstance 替换为Instance,因为几乎所有属性值都不为零。请注意,在 Weka 3.7 中,Instance 已成为接口,应改为使用 DenseInstance。此外,FastVector 已被弃用,取而代之的是 Java 的 ArrayList

【讨论】:

  • 感谢您对我的最大帮助^_____^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2016-02-09
  • 2018-08-06
  • 2020-02-22
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
相关资源
最近更新 更多