【问题标题】:Using ELKI on custom objects and making sense of results在自定义对象上使用 ELKI 并理解结果
【发布时间】:2013-07-15 06:47:06
【问题描述】:

我正在尝试在我的程序中使用层次聚类的ELKI's SLINK implementation

我有一组需要集群的对象(我自己的类型)。为此,我在聚类之前将它们转换为特征向量。

这就是我目前让它运行并产生一些结果的方式(代码在 Scala 中):

val clusterer = new SLINK(CosineDistanceFunction.STATIC, 3)
val connection = new ArrayAdapterDatabaseConnection(featureVectors)
val database = new StaticArrayDatabase(connection, null)
database.initialize()

val result = clusterer.run(database).asInstanceOf[Clustering[_ <: Model]]

现在,结果是一个Clustering,其中包含Model 类型的元素。我可以输出它们,但我不知道如何理解这个结果,特别是因为 SLINK 返回的模型类型为 DendrogramModel,它似乎无法参数化。

具体来说,如何将结果链接回我的原始元素(我之前创建变量 featureVectors 的元素)?

我假设我需要创建某种自定义模型或以某种方式通过初始化和执行算法来维护与原始元素的某些链接以从结果中检索。但是我找不到从哪里开始。

我知道不鼓励将 ELKI 嵌入到自己的程序中。但是,似乎以其他方式调用 ELKI 并没有什么不同:我需要在程序运行期间对结果进行聚类并将结果映射回我的对象​​。

【问题讨论】:

    标签: cluster-analysis hierarchical-clustering elki


    【解决方案1】:

    DendrogramModel 不包括集群中的对象。模型是集群上的附加数据。

    使用getIDs() 方法访问Cluster 实例的成员。

    【讨论】:

    • 好的,我使用getIDs() 获取集群的成员。在your example on running algorithms 之后,我通过调用db.getRelation(TypeUtil.DOUBLE_VECTOR_FIELD) 获得Relation,然后可以从中获得get() 我的向量。那个工作流程正确吗?我仍然错过了回到我原来的对象的可能性。我可以在初始化和运行算法时以某种方式使用我自己的DoubleVector 子类(包含对我的数据的引用)吗?
    • 是的,获取所需类型的关系,然后通过 DBID 获取实例。避免创建DBID 对象,您可以在迭代器上调用get,这样更便宜。许多算法将与您具有距离函数的任何类一起运行。大多数距离函数是为任意NumberVectors 定义的。所以要么实现你自己的距离函数(对于你的数据类型),要么在你的数据类型上实现NumberVector 接口,你应该很高兴。
    • 我想我知道如何插入我的DistanceFunction。但剩下的正是问题所在:如何在自定义类上运行算法?我是否必须为此实现自己的DatabaseConnection?所有现有的实现似乎都不是那么通用。
    • 实现DatabaseConnection 可能是将自定义数据导入ELKI 数据库层的最简单方法。如果数据是文件驻留的,那么实现ParserNumberVector.Factory 就足够了(如果现有的解析器可以重用,但应该产生不同的对象)。
    猜你喜欢
    • 2015-09-02
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2020-10-03
    • 2020-09-07
    • 2013-06-16
    相关资源
    最近更新 更多