首页 > 解决方案 > 下面的 Java 代码没有显示代码中的任何错误,但它会抛出一个异常,说明非法选项。那么,缺少什么?

问题描述

package cbr;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Writer;
import weka.clusterers.ClusterEvaluation;
import weka.clusterers.FarthestFirst;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Remove;
public class Cluster {
protected int m_ClusterCentroids;
protected Instances 
protected Instances m_instances;
protected int m_Seed;
public static void main(String[] args) throws Exception {
Instances data = new Instances(new 
BufferedReader(new  
FileReader("FinalDatasetforCBSAPDS.arff")));
data.setClassIndex(data.numAttributes() -1);
Remove filter = new Remove();
filter.setAttributeIndices("" +(data.classIndex() + 1));
filter.setInputFormat(data);
Instances dataClusterer = Filter.useFilter(data, filter);
FarthestFirst clusterer = new FarthestFirst();
clusterer.setNumClusters(5);
clusterer.setSeed(5127); // set the seed size
String[] options = new String[2];
int nClusters = 5;
int seed = 5127;
options[0] = String.valueOf(nClusters);
options[1] = String.valueOf(seed);
clusterer.setOptions(options);           
ClusterEvaluation eval= new ClusterEvaluation();
eval.setClusterer(clusterer);
eval.evaluateClusterer(data);
System.out.println("# of clusters: " + 
eval.getNumClusters());
clusterer.buildClusterer(dataClusterer);
eval.setClusterer(clusterer);
eval.evaluateClusterer(data);
System.out.println(eval.clusterResultsToString());
Instances centroids = clusterer.getClusterCentroids();
int numclusters = clusterer.getNumClusters();
String filename = "Final_Dataset";
filename += "for_CBSAPDS";
filename += ".txt";
File file = new File(filename);
try (Writer writer = new BufferedWriter(new 
FileWriter(file))) {
for (int i= 0; i<=5127; i++) {
for (int j= 0; j<numclusters; j++) {
String centroidsStr= centroids.instance(i).toString();
String[] to = centroidsStr.split(",");
writer.write(Integer.toString(i));
writer.write(",");
writer.write(data.instance(j) + "," + "case" + i + "," + (to[0]));
writer.write("\n");
}

}

System.out.println("\nInformation:");
}

}

}

这是我编写的最远优先聚类算法的java代码,用于将最远优先聚类算法与CBR集成。但它会抛出一个异常,如:

线程''main'' java.lang.Exception 中的异常:非法选项:weka.core.Utils.checkForRemainingOptions(Utils.java:505) at weka.clusterers.FarthesFirst.setOptions(FarthestFirst.java:568)
的5 527 cbr.Cluster.main(Cluster.java)

所以我在这个问题上需要帮助

标签: javaweka

解决方案


您将错误的参数传递给您的setOptions(..)方法。API声明,您可以提供以下字符串形式的参数: "-N <number of clusters>""-S <seed>"

因此,如果要使用该setOption方法,则需要将参数构造为如下所示。但是,这似乎是开销,因为此方法与setSeedand setNumClusters(您已经在使用)相同,因此您可能只是摆脱了该setOptions(..)方法和相应的参数。


推荐阅读