【问题标题】:Using a Geo Distance Function on ELKI在 ELKI 上使用地理距离函数
【发布时间】:2014-07-04 05:52:45
【问题描述】:

我正在使用 ELKI 挖掘一些地理空间数据(纬度、经度对),我非常关心使用正确的数据类型和算法。在我的算法的参数化器中,我尝试通过地理函数(LngLatDistanceFunction,因为我使用 x,y 数据)来更改默认距离函数,如下所示:

params.addParameter (DISTANCE_FUNCTION_ID,  geo.LngLatDistanceFunction.class);

然而结果相当令人惊讶:它创建了重复点的集群,例如下面的示例:

(2.17199922,41.38190043,NaN),(2.17199922,41.38190043,NaN),(2.17199922,41.38190043,NaN),(2.17199922,41.38190043,NaN),(2.17199922,41.38190043,NaN),(2.17199922,41.38190043,NaN) , (2.17199922, 41.38190043, NaN), (2.17199922, 41.38190043, NaN), (2.17199922, 41.38190043, NaN), (2.17199922, 41.38190043, NaN)]

This is an image 这个例子。

我是否使用了非地理距离(例如曼哈顿):

params.addParameter (DISTANCE_FUNCTION_ID,  geo.minkowski.ManhattanDistanceFunction.class);

,the output is much more reasonable

我想知道我的代码是否有问题。

我直接在数据库上运行算法,像这样:

         Clustering<Model> result = dbscan.run(db); 

然后在循环中迭代结果,同时构造凸包:

   for (de.lmu.ifi.dbs.elki.data.Cluster<?> cl : result.getAllClusters()) {
               if (!cl.isNoise()){
                     Coordinate[] ptList=new Coordinate[cl.size()];
                        int ct=0;               

                        for (DBIDIter iter = cl.getIDs().iter(); 
                                iter.valid(); iter.advance()) {
                                ptList[ct]=dataMap.get(DBIDUtil.toString(iter));                                                                                                                                            
                                ++ct;                                                                   
                        }       

                        GeoPolygon poly=getBoundaryFromCoordinates(ptList);
                        if (poly.getCoordinates().getGeometryType()==
                        "Polygon"){                                                     
                            out.write(poly.coordinates.toText()+"\n");
                        }                      
               }
            }            

为了将每个 ID 映射到一个点,我使用了一个 hashmap,它是我在读取数据库时初始化的。 我添加此代码的原因是因为我怀疑我可能在向/从算法传递/读取的结构方面做错了什么。 我提前感谢您提供任何可以帮助我解决此问题的 cmets。我发现 ELKI 是一个非常高效和复杂的库,但是我很难找到说明简单案例的示例,比如我的。

【问题讨论】:

    标签: cluster-analysis data-mining geospatial dbscan elki


    【解决方案1】:

    您的epsilon 值是多少?

    地理距离在 ELKI 中以 为单位(如果我没记错的话);曼哈顿距离将是纬度 + 经度 。由于显而易见的原因,它们存在于非常不同的尺度上,因此您需要选择不同的 epsilon 值。

    在您之前的问题中,您使用了epsilon=0.008。对于大地距离,0.008 米 = 8 毫米。

    在 epsilon = 8 毫米时,如果您获得的集群仅包含重复的坐标,我并不感到惊讶。上述坐标是否有可能在您的数据集中多次存在?

    【讨论】:

    • 你完全正确。 从度到米的变化(无论如何,一个更有意义的单位)导致correct results。如果您可以在documentation 中指明距离单位,那将真的很有帮助;通过将输入坐标视为 lat,long,我被欺骗认为单位是度数......非常感谢您的回答
    • 感谢您的反馈。我改进了文档。当然,我希望能找到写教程的时间;一直到使用凸包或 alpha 形状可视化点,使用 KML 和 Google 地球。但我总是很忙。
    猜你喜欢
    • 2014-07-02
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2017-08-03
    • 2014-10-22
    • 2012-12-12
    相关资源
    最近更新 更多