我正在使用 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)]
这是此示例的图像。
我是否使用了非地理距离(例如曼哈顿):
params.addParameter (DISTANCE_FUNCTION_ID, geo.minkowski.ManhattanDistanceFunction.class);
我想知道我的代码是否有问题。
我直接在数据库上运行算法,如下所示:
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 是一个非常高效和复杂的库,但是我很难找到说明简单案例的示例,比如我的。