我正在通过C#使用Weka API。我已经通过使用ikvm将weka jar文件转换为c#dll。然后,我在参考中添加了转换后的dll (wekacsharp.dll)

我还在参考中添加了ikvm.gnu.classpath.dllIKVM.OpenJDK.Core.dllIKVM.OpenJDK.Util.dllIKVM.OpenJDK.Text.dllIKVM.OpenJDK.Core

我正在尝试使用j48算法,但出现错误。附加了代码错误的屏幕快照。请检查并建议我修复。

码:

public static void classifyTest()
{
    try
    {
        weka.core.Instances insts = new weka.core.Instances(new java.io.FileReader("iris.arff"));
        insts.setClassIndex(insts.numAttributes() - 1);

        weka.classifiers.Classifier cl = new weka.classifiers.trees.J48();
        //Console.WriteLine("Performing " + percentSplit + "% split evaluation.");

        //randomize the order of the instances in the dataset.
        // weka.filters.Filter myRandom = new weka.filters.unsupervised.instance.Randomize();
        // myRandom.setInputFormat(insts);
        // insts = weka.filters.Filter.useFilter(insts, myRandom);

        int trainSize = insts.numInstances() *  percentSplit / 100;
        int testSize = insts.numInstances() - trainSize;
        weka.core.Instances train = new weka.core.Instances(insts, 0, trainSize);

        cl.buildClassifier(train);
        int numCorrect = 0;
        for (int i = trainSize; i < insts.numInstances(); i++)
        {
            weka.core.Instance currentInst = insts.instance(i);
            double predictedClass = cl.classifyInstance(currentInst);
            if (predictedClass == insts.instance(i).classValue())
                numCorrect++;
        }
        //java.io.Console.WriteLine(numCorrect + " out of " + testSize + " correct (" +(double)((double)numCorrect / (double)testSize * 100.0) + "%)");
    }
    catch (java.lang.Exception ex)
    {
        ex.printStackTrace();
    }
}

最佳答案

在将其添加为对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文件取代。

现在,您应该有一个名为“ weka.dll”的文件,它是整个weka API的.NET版本。这正是我们想要的!

在.NET应用程序中使用dll

要尝试,请使用我编写的一个小型C#程序。该程序只对Iris数据集运行J48分类器,测试/数据拆分率为66%,并打印出正确率。它还使用一些Java类,并且已经有95%的合法Java代码。

关于java - 'weka.core.WekaPackageManager'的类型初始值设定项引发异常-Weka C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29720139/

10-13 08:59