我正在使用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);
,叔he output is much more reasonable
我想知道我的代码是否有问题。
我正在db上直接运行算法,如下所示:
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。 我之所以添加这段代码,是因为我怀疑我可能在我传递/读取算法的结构方面做错了。 我提前感谢你提出任何可以帮助我解决这个问题的意见。我发现ELKI是一个非常高效和复杂的库,但是我很难找到能够说明简单案例的例子,比如我的。
答案 0 :(得分:2)
您的epsilon
值是多少?
ELKI中的地理距离米(如果我没记错的话);曼哈顿距离为纬度+经度度。由于显而易见的原因,它们存在于非常不同的尺度上,因此您需要选择不同的epsilon值。
在之前的问题中,您使用了epsilon=0.008
。对于大地距离,0.008米= 8毫米。
在epsilon = 8毫米时,如果您获得的聚类只包含重复的坐标,我不会感到惊讶。上述坐标在数据集中是否存在多次?