【问题标题】:How can I use the index-structures in ELKI?如何在 ELKI 中使用索引结构?
【发布时间】:2013-10-20 17:50:06
【问题描述】:

这些是http://elki.dbs.ifi.lmu.de/ 的引用:

“本质上,我们将抽象距离查询绑定到数据库,然后对这个距离进行最近邻搜索。此时,ELKI 会自动选择最合适的 kNN 查询类。如果存在适合我们的索引距离函数(不是每一个索引都能加速每一个距离!),这里会自动使用。"

"getKNNForDBID方法可能归结为缓慢的线性扫描,但是当数据库有合适的索引时,会使用索引查询。那么算法可以运行在O(nk log n)甚至O(nk)时间。”

问题是:ELKI 选择运行索引查询的依据是什么?

什么是:“当数据库有适当的索引时”,我如何保证?

关于“run”方法签名的另一个不相关的问题, 为什么有 3 个签名而不是 1 个?以及它们之间有什么区别, 以及确定使用哪个签名的标准是什么?

【问题讨论】:

    标签: database cluster-analysis outliers r-tree elki


    【解决方案1】:

    在 ELKI wiki 中有一个操作指南页面:http://elki.dbs.ifi.lmu.de/wiki/HowTo/Index

    基本上,您必须使用-db.index 添加索引。然后它将自动使用如果索引支持距离度量。 R*-Tree 似乎是最强大的。还有一个关于为自定义距离函数添加 R-tree 索引支持的教程:http://elki.dbs.ifi.lmu.de/wiki/Tutorial/SpatialDistanceFunctions

    至于第二个问题:AbstractAlgorithm 中有一个run(Database) 方法使用自省来检查替代方法签名。乱七八糟,但实际上可以选择其中一个签名很方便。只要确保您的getInputTypeRestriction() 匹配即可。当您处理多个关系时,这很有意义。只要你活在“一切都是(单一)向量”的思维中,就显得多余了;但即便如此,拥有一个 已经 具有要处理的数据关系的 run(Database database, Relation<O> relation) 签名也很方便。

    【讨论】:

      【解决方案2】:

      这主要是对@Anony-Mousse 帖子的后续跟进,非常有针对性。

      索引需要由用户添加到数据库中。目前没有自动索引(因为任何索引都需要额外的内存和构建时间)。 -db.index 是这个参数。对自动索引的支持在愿望清单上,但它需要仔细调整成本模型。在小数据集或高维数据上,或者当用户根本不需要这种类型的查询时,添加索引是有代价的。

      数据库会将查询请求按顺序转发到各个索引。 提供加速的第一个索引获胜。如果没有索引返回加速查询,数据库将回退到线性扫描,除非给出提示DatabaseQuery.HINT_OPTIMIZED_ONLY。在这种情况下,null 将被返回。可以通过QueryUtil 强制进行线性扫描,这对单元测试索引非常有用。

      M-Trees 可以处理任何数字距离,但如果距离不是度量标准,则结果可能不正确。如果距离函数未将 isMetric() 报告为 true,则应报告错误。

      R-Trees 可以使用任何实现SpatialPrimitiveDistanceFunction 的距离函数,这实质上意味着实现一个下限的点到矩形距离。可以找到许多距离函数的下限,但有效性可能会有所不同。例如,角距离从 R-tree 使用的矩形页面中受益较少。

      至于run 方法。通常向量空间方法的首选签名

       YourResultType run(Database database, Relation<V> relation)
      

      截至目前,数据库实际上可以通过relation.getDatabase()获取,但未来可能会改变。不幸的是,在许多情况下这是有问题的,而在某些情况下目前无法轻松删除。无论如何,这是显式形式,便于从 Java 代码运行算法,即它允许我指定要使用的 which 关系,而不必使用唯一合适的数据库关系(因此会自动选择)。

      从长远来看,我确实计划使这一点更加明确,增加对选择要处理的数据子集的明确支持,也许还有查询。然后抽象父 run 方法会处理这个问题。 自动优化器将依赖于此:它会首先查询要运行的所有算法以满足它们的要求,包括查询要求。根据查询、数据集、可用内存等,优化器可以选择合适的索引,并将算法传递给合适的查询方法。 为了保持run 签名简单,它可能会通过一些Instance 类和更多使用工厂模式来处理。不过现在不用担心了。

      如果您想了解为什么我们需要这个,请查看例如地理空间异常值检测算法。例如SLOM使用的签名是:

      OutlierResult run(Database database, Relation<N> spatial, Relation<O> relation)
      

      SLOM 使用两个 two 关系。第一个关系是实例的空间关系,例如地理位置。第二个关系是实际数据,例如测量。地理位置用于确定哪些实例预计相似(但也可以是多边形!),而第二个关系指定实际然后比较相似性的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        相关资源
        最近更新 更多