使用 ELKI 的距离函数

Posted

技术标签:

【中文标题】使用 ELKI 的距离函数【英文标题】:Using ELKI's Distance Function 【发布时间】:2014-07-02 19:00:33 【问题描述】:

这是previous question 的后续内容,我们在其中评论说,使用欧几里得距离和经纬度坐标不会产生正确的结果。 我在文档中读到ELKI enables geographic data,即它的距离函数,存在于各种聚类算法中。 在 ELKI 的用户界面中,我可以看到有一些选项可以将默认距离函数 (euclidian) 替换为更合适的函数。我还看到,在这种情况下,您需要提供一个数据,这是有道理的,因为您必须告诉 ELKI 数据是如何投影的。 我在 UI 中的选项是使用“geo.LngLatDistanceFunction”,因为我使用的是 (x,y) 坐标并使用“WGS84SpheroidEarthModel”,因为数据位于 epsg:4326 中。 我正在尝试在 Java 中相应地对我的算法进行参数化,但我不知道该怎么做: 如果我像这样初始化我的参数:

ListParameterization params2 = new ListParameterization();
    params2.addParameter(de.lmu.ifi.dbs.elki.algorithm.clustering.DBSCAN.Parameterizer.MINPTS_ID, minPoints);
params2.addParameter(de.lmu.ifi.dbs.elki.algorithm.clustering.DBSCAN.Parameterizer.EPSILON_ID, epsilon);

我可以这样设置距离函数吗?

params2.addParameter(de.lmu.ifi.dbs.elki.algorithm.DistanceBasedAlgorithm.DISTANCE_FUNCTION_ID, 
            de.lmu.ifi.dbs.elki.distance.distancefunction.geo.LngLatDistanceFunction.class);

geo.model 呢? (我不知道这个)

【问题讨论】:

【参考方案1】:

默认地球模型是SphericalVincentyEarthModel,据说速度更快(但假设是球形地球,而不是椭球体);但这应该不会有太大区别,除非您需要精确到仪表:根据this answer,最大误差应该是距离的 0.3%。

要设置地球模型参数,请使用EarthModel.MODEL_ID 作为选项ID。 (正如LngLatDistanceFunction 的参数化程序所引用的)。在尝试找到合适的选项 ID 时,请始终查看参数化器 - 我们正在慢慢地将所有选项 ID 移动到参数化器中。

【讨论】:

从你告诉我的情况来看,将地球作为一个球体是可以的。我更关心将距离函数更改为地理所提供的结果。如果我上面显示的片段是正确的,关于设置 LngLatDistanceFunction,结果有点令人惊讶。当我运行 DBSCAN 时,the clusters returned are sets of a repeated point。 These 是通过选择非地理算法 (ManhattanDistanceFunction) 返回的集群。任何想法为什么会发生这种情况? 我补充说我的输入数据是数字向量 (lon,lat) 的关系,根据ELKI's documentation 假设是 geo Relation> vectors = db .getRelation(TypeUtil.NUMBER_VECTOR_FIELD); 我决定将我的 cmets 转换为另一个 question

以上是关于使用 ELKI 的距离函数的主要内容,如果未能解决你的问题,请参考以下文章

不使用三角函数的 SQL 距离查询

使用python中的内置函数查找3d距离

使用构造函数计算两点之间的欧几里得距离

[PTA]习题5-3 使用函数计算两点间的距离

使用 ELKI 和 Mongodb

在 Python 中使用自定义距离函数对任意对象进行聚类