Weka 判别分析 NoClassDefFoundError

Weka DiscriminantAnalysis NoClassDefFoundError

我正在尝试在判别分析包中使用 MultiClassFLDA,但我总是在 运行 代码和定义 MultiClassFLDA 的新实例时遇到错误 class

Exception in thread "main" java.lang.NoClassDefFoundError: no/uib/cipr/matrix/Vector
    at assignment2.face.tryLDA(face.java:141)
    at assignment2.Assignment2.main(Assignment2.java:106)
Caused by: java.lang.ClassNotFoundException: no.uib.cipr.matrix.Vector
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

它似乎与较新版本的 Weka 中的一些动态 class 加载有关,大概是在 Weka 包管理器中:class 是在 mtj.jar 中定义的,它是捆绑 inside weka.jar。在 , 中,建议提取 mtj.jar 并将其添加到您的 class 路径。

因为我在使用其他过滤器时没有这个问题,我的猜测是 MultiClassFLDA 没有正确实施:我发现如果您之前使用过另一个过滤器,那么特定的 class将被加载:

// Run a dummy Filter for correct initialization
Filter f = new Standardize();
f.setInputFormat(data);
Filter.useFilter(new Instances("", params, 0), f); // Dummy run on empty dataset
// Now run the MultiClassFLDA
f = new MultiClassFLDA();
f.setInputFormat(data);
data = Filter.useFilter(data, f);

N.B。那是一个非常丑陋的黑客!我用它来工作。当我找到合适的方法时,我会编辑我的答案(除了从 Weka itslef 中提取 jar)。