我有点数据集;
lat |long | time
34.53 -126.34 1
34.52 -126.32 2
34.51 -126.31 3
34.54 -126.36 4
34.59 -126.28 5
34.63 -126.14 6
34.70 -126.05 7
...
(更大的数据集,但这是一般结构。)
我想根据距离和时间对点进行聚类。 DBSCAN似乎是一个不错的选择,因为我不知道有多少集群。
我现在正在使用分钟/ 5500(大约20米,相信缩放,我相信。)
library(fpc)
results<-dbscan(data,MinPts=3,eps=0.00045,method="raw",scale=FALSE,showplot=1)
我在理解如何确定缩放/距离时遇到问题,因为我有原始数据。我可以在缩放或未缩放时猜测eps的值,但我不清楚缩放的作用,或者正在使用的距离度量(欧几里德距离,也许?)是否有关于此的文档?
(这不是要找到一种自动选择的方式,(比如Choosing eps and minpts for DBSCAN (R)?),而是关于不同的值是什么意思。说“你首先需要距离函数”并没有解释使用的距离函数是什么是,或如何创建一个...)
答案 0 :(得分:1)
首先计算数据的距离矩阵。然后,您可以使用method='row'
而不是method='dist'
。这样,dbscan会将您的数据视为距离矩阵,因此无需担心距离函数的实现方式。请注意,这可能需要更多内存,因为您正在预先计算距离矩阵并将其存储在内存中。
答案 1 :(得分:0)
我不使用R/fpc
而是使用ELKI,所以我无法回答你的问题。原因是我发现它比fpc
快得多,特别是当你可以使用索引时。当您使用百万分的数据集时,差异很大。
此外,它非常灵活,似乎是您所需要的:
ELKI确实有一个使用大圆距离的LatLng距离函数。然后我可以在几公里内轻松设置epsilon。
但是,您还拥有time
属性。你有什么计划在你的分析中包含这个吗? ELKI有一个tutorial on writing custom distance functions,这可能是你需要的。你应该可以重复使用大圆距离,这里有一个DBSCAN的巧妙技巧:
DBSCAN并不需要距离。它需要知道邻居,但距离仅用于与epsilon进行比较。因此,通过定义两个对象应该相似时为0的距离函数,以及如果应该不同的距离函数,以及0.5的epsilon,您可以执行更复杂的聚类。在您的上下文中,您可以将距离函数定义为:
0 if the distance is less than 0.1 km and the time difference is also less than t
1 otherwise