WEKA - 将实例分配给 kmeans.buildClusterer 时出错

Posted

技术标签:

【中文标题】WEKA - 将实例分配给 kmeans.buildClusterer 时出错【英文标题】:WEKA - Error on assigning Instances to kmeans.buildClusterer 【发布时间】:2014-05-26 17:03:59 【问题描述】:

我是 Weka 框架的新手。到目前为止,我发现它非常简单且易于使用和理解,但我面临一些我无法理解的问题。我正在尝试从 csv 文件中对数据集进行聚类。我有一个使用 kmeans 对数据集进行聚类的类,据我在 Weka 的 wiki (http://weka.wikispaces.com/) 中阅读,该类工作正常。唯一的问题是它正在读取 arff 文件,而我需要从 csv 文件中读取。到目前为止,一切都很好。问题是当我将数据集中的实例分配给 kmeans.buildClusterer(data) 方法时。然后我得到以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/pentaho/packageManagement/PackageManager 
        at weka.core.WekaPackageManager.<clinit>(WekaPackageManager.java:86) 
        at weka.core.Utils.readProperties(Utils.java:142) 
        at weka.core.Capabilities.<init>(Capabilities.java:261) 
        at weka.clusterers.AbstractClusterer.getCapabilities(AbstractClusterer.java:179) 
        at weka.clusterers.SimpleKMeans.getCapabilities(SimpleKMeans.java:289) 
        at weka.clusterers.SimpleKMeans.buildClusterer(SimpleKMeans.java:441) 
        at weka_examples.ClusteringDemo.<init>(ClusteringDemo.java:48) 
        at weka_examples.ClusteringDemo.main(ClusteringDemo.java:70) 
Caused by: java.lang.ClassNotFoundException: org.pentaho.packageManagement.PackageManager 
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
        at java.security.AccessController.doPrivileged(Native Method) 
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
        ... 8 more 
Java Result: 1 

代码如下:

import weka.core.Instances; 
import weka.clusterers.DensityBasedClusterer; 
import weka.clusterers.ClusterEvaluation; 
import java.io.File; 
import weka.clusterers.SimpleKMeans; 
import weka.core.converters.CSVLoader; 

/** 
 * An example class that shows the use of Weka clusterers from Java. 
 * 
 * @author FracPete 
 */ 
public class ClusteringDemo  

    /** 
     * Run clusterers 
     * 
     * @param filename the name of the ARFF file to run on 
     */ 
    public ClusteringDemo(String filename) throws Exception  
        ClusterEvaluation eval; 
        Instances data; 
        String[] options; 
        DensityBasedClusterer cl; 

        String Origem = filename; 

   // data = new Instances(new BufferedReader(new FileReader(filename))); 
        // load CSV 
        CSVLoader loader = new CSVLoader(); 
        loader.setSource(new File(Origem)); 
        data = loader.getDataSet(); 

        SimpleKMeans kmeans = new SimpleKMeans(); 

        kmeans.setSeed(10); 

// This is the important parameter to set 
        kmeans.setPreserveInstancesOrder(true); 
        kmeans.setNumClusters(5); 
        kmeans.buildClusterer(data); 

// This array returns the cluster number (starting with 0) for each instance 
// The array has as many elements as the number of instances 
        int[] assignments = kmeans.getAssignments(); 

        int i = 0; 
        for (int clusterNum : assignments)  
            System.out.printf("Instance %d -> Cluster %d", i, clusterNum); 
            i++; 
         
     

    /** 
     * usage: ClusteringDemo arff-file 
     */ 
    public static void main(String[] args) throws Exception  

        /*if (args.length != 1)  
         System.out.println("usage: " + ClusteringDemo.class.getName() + " <arff-file>"); 
         System.exit(1); 
         */ 
        new ClusteringDemo("Teste/Query1.csv"); 
     
 

我包含了二进制文件:weka-dev-3.7.10 我错过了什么重要的东西吗?

亲切的问候

【问题讨论】:

这里的代码“weka-3-6-10”或“weka-3-7-10”没有问题。你试过“weka-3-6-10”(最新的stable版本)吗?另外,你的主目录中有一些奇怪的 Weka .props 文件吗? 嗨。谢谢你的答复。我没有尝试 weka-3-6-10 但我尝试了很多其他示例,它们也以相同的方法或等效方法引发异常。我的目录中没有任何其他文件。我可以试试 Weka-3-6-10 吗? 这只是一个猜测(如果出现问题,尝试声明为“稳定”的最后一个版本几乎不会出错,但在这里可能没有什么不同)。令人惊讶的是,关于“penthato 包管理器”等的网络搜索结果很少。当然,您可以尝试将 JAR 从 mvnrepository.com/artifact/org.pentaho.pentaho-commons/… 添加到类路径,但只要不清楚这有什么好处(以及是什么导致错误)这仍然只是猜测。也许其他人知道“THE”的答案...... 【参考方案1】:

我终于设法回答了这个问题。事实证明,从版本 3.7.2 开始,weka 核心更加紧凑,这意味着我需要的一些包不在 weka-dev 中。 解决方案很简单:将 weka.jar 而不是 weka-dev 包添加到类路径。或者也可以安装缺少的包http://weka.wikispaces.com/How+do+I+use+the+package+manager%3F

最好的问候

【讨论】:

以上是关于WEKA - 将实例分配给 kmeans.buildClusterer 时出错的主要内容,如果未能解决你的问题,请参考以下文章

针对 WEKA 中的每个实例提取 SVM 分配的值

Weka:如何获取测试实例的每个类的概率

Weka 可视化聚类结果 [关闭]

Weka中的实例分类

Weka分类前的聚类

Weka 对实例进行分类