C # код для запуска weka классификатора - PullRequest
2 голосов
/ 22 марта 2012

Я использую 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 ]

4 голосов
/ 23 мая 2016

Убедитесь, что вы не пропустили преобразование weka.jar в weka.dll с помощью Ikvm, прежде чем добавлять его в качестве ссылки на ваш проект на C # Преобразование из Java в .NET DLL При этом первое, что вы захотите сделать, - это преобразовать файл Weka .jar в dll .NET. Для этого мы будем использовать ikvmc, который является статическим компилятором IKVM. В консоли перейдите в каталог, содержащий weka.jar, и введите:

ikvmc -target: библиотека 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.

Теперь у вас должен быть файл с именем "weka.dll", который является .NET-версией всего weka API. Это именно то, что вам нужно!

1 голос
/ 30 апреля 2013

Возможно, вы не добавили необходимые DLL.Попробуйте добавить в список литературы следующие dll: IKVM.Runtime.dll и IKVM.OpenJDK.Text.dll.Также «Часто исключение оборачивает исходное исключение. В таких случаях свойство InnerException содержит информацию об исходном исключении».Поэтому, чтобы выяснить причину исключения, перейдите в ViewDetail и посмотрите там Внутреннее исключение (оно может быть вложенным, поэтому идите вниз, пока не найдете искомое).

0 голосов
/ 08 ноября 2016

Убедитесь, что ссылки включают этот список:

enter image description here

0 голосов
/ 26 сентября 2012

, включая ссылку на IKVM.OpenJDK.XML.Parse.dll, решил проблему.

0 голосов
/ 31 мая 2012

Вы можете использовать:

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