我试图使用R中的dbscan
包来尝试聚类一些空间数据。 dbscan::dbscan
函数将eps
和minpts
作为输入。我有一个数据框,其中有两列longitude
和latitude
,以度数小数表示,如下所示:
df <- data.frame(lon = c(seq(1,5,1), seq(1,5,1)),
lat = c(1.1,3.1,1.2,4.1,2.1,2.2,3.2,2.4,1.4,5.1))
我应用算法:
db <- fpc::dbscan(df, eps = 1, MinPts = 2)
这里eps
将以度数或其他单位定义吗?我真的想了解哪个单位表示这个最大距离eps
,所以任何帮助都值得赞赏
答案 0 :(得分:1)
切勿使用fpc
包,请始终使用dbscan::dbscan
。
如果您有纬度和经度,则需要选择合适的距离函数,例如Haversine。
默认距离函数Euclidean忽略了地球的球形特性。然后,eps值是纬度和经度的混合,但这些不对应于均匀距离!在赤道以东一度,在温哥华东部的距离远超过一度
。即便如此,你需要注意单位。 Haversine的一个实现可能产生弧度,另一个米,当然有人会疯狂地工作几英里。
不幸的是,据我所知,没有一个R实现可以加速Haversine距离。因此,将数据集中在ELKI中可能会更快更多(您需要自己添加索引)。
如果您的数据足够小,则可以在R中使用预先计算的距离矩阵(dist
对象)。但是这将花费O(n²)时间和内存,因此它的可扩展性不是很高。