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

时间:2013-02-21 01:24:39

标签: 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(大约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)?),而是关于不同的值是什么意思。说“你首先需要距离函数”并没有解释使用的距离函数是什么是,或如何创建一个...)

2 个答案:

答案 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