首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArrayList转换为Instances对象

ArrayList转换为Instances对象
EN

Stack Overflow用户
提问于 2014-03-21 18:26:02
回答 3查看 3.4K关注 0票数 2

我有一个ArrayList测试集。此列表包含我在WEKA中用于SMO评估的数据。我想使用评估weka类来对我的测试集进行分类。在最简单的情况下,我在ArrayList中只有一个图像提取特征。必须进行什么转换才能在下面的列表中使用我的列表:

代码语言:javascript
复制
Evaluation eval = new Evaluation(testset); // how can I cast testset2 Instances object?
eval.evaluateModelOnce(c, data);

这段代码来自here:我正在使用它来训练一个SMO模型。列车数据集包含特征提取的列车图像,存储在.arff文件中。在测试过程中,我在我的代码中读取一个图像,我计算特征,将它们存储在arrayList中,而不是将它们存储在.arff文件中。我想将列表直接转换为Instances对象,并继续进行分类。

编辑:我试着做一些其他的事情,首先将arrayList连接到双倍数据数组,然后继续我的trainSet:

代码语言:javascript
复制
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]));
}

然而,我被接受了:

代码语言:javascript
复制
Exception in thread "main" java.lang.ClassCastException: javax.management.Attribute cannot be cast to weka.core.Attribute

编辑:

我稍微修改了一下代码

代码语言:javascript
复制
double data[][] = new double[1][];
data[0] = dt;

System.out.println(args[1]);
System.out.println(args[2]);
ClothesAnalysis asdf = new ClothesAnalysis();
weka.classifiers.Classifier c = asdf.loadModel(new File(args[1]), args[2]);


String opt = ("-C 100 -K weka.classifiers.functions.supportVector.NormalizedPolyKernel");
    String[] options = opt.split(" ");

int numAtts = data[0].length;
FastVector atts = new FastVector(numAtts);
for (int att = 0; att < numAtts; att++) {
 atts.addElement(new weka.core.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]));
}

dataset.setClassIndex(dataset.numAttributes() - 1);

Evaluation eval = new Evaluation(dataset);

eval.evaluateModel(c, dataset);
System.out.println(eval.toSummaryString("\nResults\n======\n", false));

我收到错误消息:

代码语言:javascript
复制
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 84
at weka.filters.unsupervised.attribute.ReplaceMissingValues.convertInstance(ReplaceMissingValues.java:274)
at   weka.filters.unsupervised.attribute.ReplaceMissingValues.input(ReplaceMissingValues.java:140
     )
at weka.classifiers.functions.SMO.distributionForInstance(SMO.java:1368)
at weka.classifiers.Classifier.classifyInstance(Classifier.java:84)
at  
  weka.classifiers.Evaluation.evaluateModelOnceAndRecordPrediction(Evaluation.java:1448)
at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1407)
at LBP.LBPDemo.main(LBPDemo.java:466)

EDIT2:我的问题是我必须在最后一个属性中添加类标签,所以我尝试添加:

代码语言:javascript
复制
atts.addElement(new weka.core.Attribute(" class {1, 2, 3, 4, 5, 6, 7}" , numAtts-1));

这些是我的问题的索引。但是,这不是向dataset添加索引的正确方式。当我在最后得到的属性中打印数据集时:

代码语言:javascript
复制
@attribute ' class {1, 2, 3, 4, 5, 6, 7}' numeric

我想要删除撇号和数字,以便正确读取。

EN

回答 3

Stack Overflow用户

发布于 2014-03-21 19:18:46

假设您需要一个Instances对象,则不能将ArrayList类型转换为该对象。

我认为您需要将DataSourcegetDataSet()与自定义Loader (constructor)一起使用。

我猜它应该是这样工作的:

代码语言:javascript
复制
new DataSource(new ListLoader(testData)).getDataSet();
票数 2
EN

Stack Overflow用户

发布于 2014-06-13 20:29:59

我不确定这是否彻底回答了您的问题,但是如果您希望在生成实例时使用ArrayList<Attribute>而不是FastVector作为参数,请尝试为实例实现一个新的构造函数:

代码语言:javascript
复制
 /**
   * Creates an empty set of instances. Uses the given
   * attribute information. Sets the capacity of the set of 
   * instances to 0 if its negative. Given attribute information
   * must not be changed after this constructor has been used.
   *
   * @param name the name of the relation
   * @param attInfo the attribute information
   * @param capacity the capacity of the set
   * @throws IllegalArgumentException if attribute names are not unique
   */

public Instances(String name, ArrayList<Attribute> attInfo, int capacity) {

// check whether the attribute names are unique
HashSet<String> names = new HashSet<String>();
StringBuffer nonUniqueNames = new StringBuffer();
for (Attribute att: attInfo) {
  if (names.contains(att.name())) {
    nonUniqueNames.append("'" + att.name() +"' ");
  }
  names.add(att.name());
}
if (names.size() != attInfo.size())
  throw new IllegalArgumentException("Attribute names are not unique!" +
        " Causes: " + nonUniqueNames.toString());
names.clear();

m_RelationName = name;
m_ClassIndex = -1;
m_Attributes = attInfo;
for (int i = 0; i < numAttributes(); i++) {
  attribute(i).setIndex(i);
}
m_Instances = new ArrayList<Instance>(capacity);
} 

..。您只需将此代码复制粘贴到weka.core.Instances类即可

票数 2
EN

Stack Overflow用户

发布于 2019-03-21 16:39:49

我找到了将数据从内存加载到weka实例的解决方案。不是最漂亮的,但它很管用。基本上,您将arff文件内容生成为一个字符串,然后从该字符串的StringReader创建实例对象。

代码语言:javascript
复制
String arffString = "@relation RelationName\n\n@attribute attributeName1\n@attribute attributeName2 {No,Yes}\n\n@data\n'atribute1value',?\n";
unlabeledData = new Instances(
new BufferedReader(new StringReader(arffString)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22556144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档