gpt4 book ai didi

java - 在 ELKI 中运行聚类算法

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:49:49 43 4
gpt4 key购买 nike

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

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

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

如果有人知道任何易于使用的 k-medoids 库,这也可能是这个问题的一个很好的答案。

最佳答案

我们非常感谢文档贡献! ( 更新: 我暂时把这篇文章变成了 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 .你可能最容易 Hook 这个 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更新。

    关于java - 在 ELKI 中运行聚类算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15326505/

    43 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com