【发布时间】: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