gpt4 book ai didi

java - ArrayList 转换为 Instances 对象

转载 作者:行者123 更新时间:2023-11-30 07:10:01 24 4
gpt4 key购买 nike

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

Evaluation eval = new Evaluation(testset); // how can I cast testset2 Instances object?
eval.evaluateModelOnce(c, data);

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

编辑:我尝试过做其他事情,首先将 arrayList 转换为数组 double 据,然后继续我的 trainSet:

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]));
}

但是我收到了:

Exception in thread "main" java.lang.ClassCastException: javax.management.Attribute cannot be cast to weka.core.Attribute

编辑:

我稍微修改了我的代码

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));

我遇到错误:

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:我的问题是我必须在类标签的最后一个属性中添加,所以我试图添加:

atts.addElement(new weka.core.Attribute(" class {1, 2, 3, 4, 5, 6, 7}" , numAtts-1));

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

@attribute ' class {1, 2, 3, 4, 5, 6, 7}' numeric

我想删除撇号和数字以便正确阅读。

最佳答案

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

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

我猜它应该像这样工作:

new DataSource(new ListLoader(testData)).getDataSet();

关于java - ArrayList 转换为 Instances 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22556144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com