运行weka分类器的C#代码

时间:2012-03-22 10:22:40

标签: c# classification weka ikvm

我正在使用C#并包含了IKVM.OpenJDK.Core.dll并使用了以下Java代码:

public static void cvdTest()
{

    weka.core.Instances data = new weka.core.Instances(new java.io.FileReader("test.arff"));
    data.setClassIndex(data.numAttributes() - 1);

    weka.classifiers.Classifier cls = new weka.classifiers.bayes.NaiveBayes();

    int runs = 1;
    int folds = 10;

    // perform cross-validation
    for (int i = 0; i < runs; i++) {
      // randomize data
      int seed = i + 1;
      java.util.Random rand = new java.util.Random(seed);
      weka.core.Instances randData = new weka.core.Instances(data);
      randData.randomize(rand);
      if (randData.classAttribute().isNominal())
        randData.stratify(folds);

      weka.classifiers.Evaluation eval = new weka.classifiers.Evaluation(randData);
      for (int n = 0; n < folds; n++) {
        weka.core.Instances train = randData.trainCV(folds, n);
        weka.core.Instances test = randData.testCV(folds, n);
        // build and evaluate classifier
        weka.classifiers.Classifier clsCopy = weka.classifiers.Classifier.makeCopy(cls);
        clsCopy.buildClassifier(train);
        eval.evaluateModel(clsCopy, test);
      }

但我得到以下错误:

  

'java.io.File'的类型初始值设定项引发了异常。

在线:

weka.core.Instances data = new weka.core.Instances(new java.io.FileReader("test.arff"));

5 个答案:

答案 0 :(得分:4)

确保在添加它作为C#项目的引用之前,没有使用Ikvm跳过weka.jar到weka.dll的转换 从Java转换为.NET dll 除此之外,您要做的第一件事是将Weka .jar文件转换为.NET dll。为此,我们将使用ikvmc,它是IKVM静态编译器。 在控制台上,转到包含weka.jar的目录,然后键入:

  

ikvmc -target:library weka.jar

-target:library调用导致ikvmc创建.dll库而不是可执行文件。

请注意,IKVM教程告诉您应该将-reference:/usr/lib/IKVM.GNU.Classpath.dll(或适当的路径)添加到上面的命令中,它告诉IKVM在哪里可以找到GNU Classpath库。但是,IKVM.GNU.Classpath.dll不再包含在下载包中,而是来自非常旧版本的IKVM。当Sun开源Java时,它被IKVM.OpenJDK。* .dll文件取代。

您现在应该有一个名为&#34; weka.dll&#34;的文件,它是整个weka API的.NET版本。这正是你需要的!

答案 1 :(得分:1)

可能,您没有添加所需的dll。尝试添加到References下一个dll:IKVM.Runtime.dll和IKVM.OpenJDK.Text.dll。 此外,“通常异常包装原始异常。在这种情况下,InnerException属性保存有关原始异常的信息。” 因此,要找出异常的原因,请转到ViewDetail并查看内部异常(它可以嵌套,因此在找不到所需的时间下去)。

答案 2 :(得分:0)

您可以使用:

weka.core.converters.ConverterUtils.DataSource source = 
  new weka.core.converters.ConverterUtils.DataSource(filePath);

答案 3 :(得分:0)

包括对IKVM.OpenJDK.XML.Parse.dll的引用解决了这个问题。

答案 4 :(得分:0)

确保引用包含此列表:

enter image description here