Alp*_*aaa 4 java cluster-analysis k-means elki
我需要以编程方式使用 ELKI 来运行 k-medoids 聚类算法。我有一个相似度矩阵,我希望输入到算法中。
是否有任何代码片段可用于如何运行 ELKI 算法?我基本上需要知道如何创建Database和Relation对象,创建自定义距离函数,并读取算法输出。
不幸的是,ELKI 教程 ( http://elki.dbs.ifi.lmu.de/wiki/Tutorial ) 侧重于 GUI 版本和实现新算法,并且试图通过查看 Javadoc 来编写代码令人沮丧。
如果有人知道任何易于使用的 k-medoids 库,这也可能是这个问题的一个很好的答案。
我们非常感谢文档贡献!(更新:我现在已经把这篇文章变成了一个新的 ELKI 教程条目。)
出于多种原因,ELKI 确实主张不要将其嵌入其他 Java 应用程序中。这就是我们推荐使用 MiniGUI(或它构建的命令行)的原因。添加自定义代码最好完成,例如作为自定义ResultHandler或仅通过使用ResultWriter和 解析生成的文本文件。
如果你真的想把它嵌入你的代码中(在很多情况下它很有用,特别是当你需要多个关系,并且想要相互评估不同的索引结构时),这里是获得一个的基本设置Database和Relation:
// 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);
Run Code Online (Sandbox Code Playgroud)
如果您想编写更通用的程序,请使用NumberVector<?>.
API 仍在发生很大变化。我们不断添加选项,但我们(还)无法提供稳定的 API。命令行 / MiniGUI / 参数化要稳定得多,因为对默认值的处理 - 参数化仅列出非默认参数,因此只有在这些更改时您才会注意到。
在上面的代码示例中,请注意我也使用了这种模式。对解析器、数据库等的更改可能不会影响该程序!
内存使用:数据挖掘是相当内存密集型的。如果您使用 MiniGUI 或命令行,当任务完成时您有一个很好的清理工作。如果你从 Java 调用它,变化真的很大,你会在某处保留一些引用,最终会泄漏大量内存。所以不要在没有确保完成后正确清理对象的情况下使用上述模式!
通过从命令行运行 ELKI,您可以免费获得两件事:
没有内存泄漏。任务完成后,进程退出并释放所有内存。
无需为相同的数据重新运行两次。后续分析不需要重新运行算法。
ELKI并非设计为可嵌入库,这是有充分理由的。ELKI 有大量的选项和功能,这是有代价的,无论是在运行时(尽管它可以轻松超越 R 和 Weka,例如!)内存使用,尤其是代码复杂性。ELKI 是为研究数据挖掘算法而设计的,而不是为了使它们易于包含在任意应用程序中。相反,如果您遇到特定问题,您应该使用 ELKI 找出哪种方法有效,然后针对您的问题以优化的方式重新实现该方法。
以下是一些提示和技巧:
使用 MiniGUI 构建命令行。请注意,在“GUI”的日志记录窗口中,它显示了相应的命令行参数——从命令行运行 ELKI 很容易编写脚本,并且可以很容易地分发到多台计算机,例如通过 Grid Engine。
#!/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
Run Code Online (Sandbox Code Playgroud)使用索引。对于许多算法,索引结构可以产生巨大的差异!(但是你需要做一些研究,哪些索引可以用于哪些算法!)
考虑使用扩展点,例如ResultWriter. 您可能最容易使用此 API,然后使用它ResultUtil来选择要以您自己喜欢的格式输出或分析的结果:
List<Clustering<? extends Model>> clusterresults =
ResultUtil.getClusteringResults(result);
Run Code Online (Sandbox Code Playgroud)要识别对象,请使用标签和LabelList关系。默认解析器会在看到数字属性中的文本时执行此操作,即文件,例如
1.0 2.0 3.0 ObjectLabel1
Run Code Online (Sandbox Code Playgroud)
将通过标签轻松识别对象!
更新:请参阅从这篇文章中创建的 ELKI 教程以获取更新。
| 归档时间: |
|
| 查看次数: |
6023 次 |
| 最近记录: |