我需要以编程方式使用ELKI运行k-medoids聚类算法。我有一个相似性矩阵,希望输入到算法中。

是否有任何代码片段可用于运行ELKI算法?
我基本上需要知道如何创建DatabaseRelation对象,创建自定义距离函数以及读取算法输出。

不幸的是,ELKI教程(http://elki.dbs.ifi.lmu.de/wiki/Tutorial)专注于GUI版本和实现新算法,并且通过查看Javadoc尝试编写代码令人沮丧。

如果有人知道任何易于使用的k型医学库,那么这也许也是一个很好的答案。

最佳答案

我们非常感谢文件的贡献! (更新:,我现在已将此帖子转换为new ELKI tutorial entry。)

ELKI确实主张不要将其嵌入到其他应用程序Java 中,原因有很多。这就是为什么我们建议使用MiniGUI(或它构建的命令行)的原因。最好添加自定义代码,例如作为自定义的ResultHandler或仅使用ResultWriter并解析生成的文本文件。

如果您确实希望将其嵌入到代码中(在许多情况下,它很有用,尤其是当您需要多个关系,并且希望彼此评估不同的索引结构时),这是获取DatabaseRelation:

// Setup parameters:
ListParameterization params = new ListParameterization();
params.addParameter(FileBasedDatabaseConnection.INPUT_ID, filename);
// Add other parameters for the database here!

// Instantiate the database:
Database db = ClassGenericsUtil.parameterizeOrAbort(
    StaticArrayDatabase.class,
    params);
// Don't forget this, it will load the actual data...
db.initialize();

Relation<DoubleVector> vectors = db.getRelation(TypeUtil.DOUBLE_VECTOR_FIELD);
Relation<LabelList> labels = db.getRelation(TypeUtil.LABELLIST);

如果要编写更通用的程序,请使用NumberVector<?>

为什么我们这样做(当前)不建议将ELKI用作“库”:
  • API仍在变化很多。我们一直在添加选项,并且无法(尚未)提供稳定的API 。命令行/ MiniGUI /参数化更加稳定,因为可以处理默认值-参数化仅列出非默认参数,因此只有这些默认值发生变化时,您才会注意到。

    在上面的代码示例中,请注意,我也使用了这种模式。解析器,数据库等的更改可能不会影响该程序!
  • 内存使用情况:数据挖掘占用大量内存。如果使用MiniGUI或命令行,则在任务完成时可以进行良好的清理。如果从Java调用它,更改的确非常高,您需要在某个地方保留一些引用,最终会浪费大量内存。因此,完成操作后,请勿使用上述模式,否则请确保未正确清理对象!

    通过从命令行运行ELKI,您可以免费获得两件事:
  • 没有内存泄漏。任务完成后,该过程将退出并释放所有内存。
  • 无需为相同数据重新运行两次。随后的分析不需要重新运行该算法。
  • ELKI并非是的设计者,因为是有原因的。 ELKI有大量的选项和功能,这在运行时(尽管可以轻松地胜过R和Weka!)在内存使用方面,特别是在代码复杂性方面,都是有代价的。
    ELKI的设计是,用于数据挖掘算法的研究,而不是为了使其易于包含在任意应用程序中。相反,如果您有特定问题,则应使用ELKI找出哪种方法有效,然后针对您的问题以优化的方式重新实现该方法。

  • 使用ELKI的最佳方法

    这里有一些提示和技巧:
  • 使用MiniGUI构建命令行。请注意,在“GUI”的日志记录窗口中,它显示了相应的命令行参数-从命令行运行ELKI的很容易编写脚本,并且可以轻松地分配给多台计算机,例如通过网格引擎。
    #!/bin/bash
    for k in $( seq 3 39 ); do
        java -jar elki.jar KDDCLIApplication \
            -dbc.in whatever \
            -algorithm clustering.kmeans.KMedoidsEM \
            -kmeans.k $k \
            -resulthandler ResultWriter -out.gzip \
            -out output/k-$k
    done
    
  • 使用索引。对于许多算法,索引结构可以产生巨大的变化!
    (但是您需要做一些研究,哪些索引可以用于哪些算法!)
  • 考虑使用扩展点,例如ResultWriter。您可能最容易使用此API,然后使用ResultUtil选择要以自己喜欢的格式进行输出的结果,或者进行以下分析:
    List<Clustering<? extends Model>> clusterresults =
        ResultUtil.getClusteringResults(result);
    
  • 要标识对象,请使用标签和LabelList关系。当默认解析器看到带有数字属性的文本时(例如,诸如
    1.0 2.0 3.0 ObjectLabel1
    

    可以通过其标签轻松识别对象!

  • 更新:有关更新,请参见ELKI tutorial created out of this post

    08-04 20:51