我需要以编程方式使用ELKI运行k-medoids聚类算法。我有一个相似性矩阵,希望输入到算法中。
是否有任何代码片段可用于运行ELKI算法?
我基本上需要知道如何创建Database
和Relation
对象,创建自定义距离函数以及读取算法输出。
不幸的是,ELKI教程(http://elki.dbs.ifi.lmu.de/wiki/Tutorial)专注于GUI版本和实现新算法,并且通过查看Javadoc尝试编写代码令人沮丧。
如果有人知道任何易于使用的k型医学库,那么这也许也是一个很好的答案。
最佳答案
我们非常感谢文件的贡献! (更新:,我现在已将此帖子转换为new ELKI tutorial entry。)
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);
如果要编写更通用的程序,请使用
NumberVector<?>
。为什么我们这样做(当前)不建议将ELKI用作“库”:
在上面的代码示例中,请注意,我也使用了这种模式。解析器,数据库等的更改可能不会影响该程序!
通过从命令行运行ELKI,您可以免费获得两件事:
ELKI的设计是,用于数据挖掘算法的研究,而不是为了使其易于包含在任意应用程序中。相反,如果您有特定问题,则应使用ELKI找出哪种方法有效,然后针对您的问题以优化的方式重新实现该方法。
使用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。