如何确定DBSCAN在R中的距离/eps?

如何确定DBSCAN在R中的距离/eps?,r,distance,dbscan,R,Distance,Dbscan,我有一个点的数据集 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

我有一个点的数据集

 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米,按比例)

库(fpc)

结果我不使用
R/fpc
而是使用ELKI,所以我不能真正回答你的问题。原因是我发现它比fpc快得多,特别是当您可以使用索引时。当您使用百万点的数据集时,差异是巨大的

此外,它非常灵活,这似乎是您所需要的:

ELKI有一个使用大圆距离的LatLng距离函数。然后我可以很容易地以公里为单位设置ε

但是,您还有一个
time
属性。您是否有计划将此纳入您的分析中?ELKI有一个,这可能是你当时需要的。您应该能够重复使用大圆距离,以下是DBSCAN为您提供的一个巧妙技巧:

DBSCAN实际上并不需要距离。它需要知道邻居,但距离仅用于与ε的比较。因此,当两个对象应该相似时,定义一个距离函数为0,如果两个对象应该不同,则定义一个距离函数为1,再加上ε为0.5,可以进行更复杂的聚类。在您的上下文中,可以将距离函数定义为:

0 if the distance is less than 0.1 km and the time difference is also less than t
1 otherwise

首先计算数据的距离矩阵。然后,您可以使用
method='dist'
而不是使用
method='row'
。这样,dbscan将把您的数据作为距离矩阵处理,因此无需担心距离函数是如何实现的。请注意,这可能需要更多的内存,因为您正在预计算距离矩阵并将其存储在内存中。

从哪个包开始
dbscan
?是fpc
还是RWeka或其他什么?@mnel是fpc软件包中的。我认为这与标记为重复的问题有些不同。我不确定这是一个编程问题还是一个统计问题,但它与复制问题不同。谢谢你的帮助,但是有什么关于如何在R中做到这一点的吗?另外,正如在原始帖子中提到的,我使用的是时间。不,我不使用R。很可能它默认为欧几里德距离,我不知道它是否也允许你使用其他距离。哦,minpts=3可能太小了。使用较大的值。这确实会导致内存问题,但有助于理解。
0 if the distance is less than 0.1 km and the time difference is also less than t
1 otherwise