r - DBSCAN(基于密度的聚类)描述 eps 的度量单位
r - DBSCAN (Density Based Clustering) describe unit of measure for eps
我试图使用 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
值是以哪个单位表示的,因此感谢您的帮助
切勿使用 fpc
包,始终使用 dbscan::dbscan
。
如果你有纬度和经度,你需要选择合适的距离函数,例如半正弦。
默认距离函数欧几里得忽略了地球的球形特性。 eps 值是纬度和经度的混合,但这些并不对应于统一的距离!赤道以东 1 度比温哥华以东 1 度 远
即便如此,你也需要注意单位。 Haversine 的一种实现可能会产生弧度,另一种可能会产生一米,当然有些疯狂的人会以英里为单位工作。
不幸的是,据我所知,none 的 R 实现可以加速 Haversine 距离。因此,在 ELKI 中对数据进行聚类可能 快 很多(不过您需要自己添加索引)。
如果您的数据足够小,您可以在 R 中使用预先计算的距离矩阵(dist
对象)。但这将占用 O(n²) 的时间和内存,因此它的可扩展性不是很好。
我试图使用 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
值是以哪个单位表示的,因此感谢您的帮助
切勿使用 fpc
包,始终使用 dbscan::dbscan
。
如果你有纬度和经度,你需要选择合适的距离函数,例如半正弦。
默认距离函数欧几里得忽略了地球的球形特性。 eps 值是纬度和经度的混合,但这些并不对应于统一的距离!赤道以东 1 度比温哥华以东 1 度 远
即便如此,你也需要注意单位。 Haversine 的一种实现可能会产生弧度,另一种可能会产生一米,当然有些疯狂的人会以英里为单位工作。
不幸的是,据我所知,none 的 R 实现可以加速 Haversine 距离。因此,在 ELKI 中对数据进行聚类可能 快 很多(不过您需要自己添加索引)。
如果您的数据足够小,您可以在 R 中使用预先计算的距离矩阵(dist
对象)。但这将占用 O(n²) 的时间和内存,因此它的可扩展性不是很好。