2

我有一个点数据集;

 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 值,但我不清楚缩放是做什么的,或者正在使用什么距离度量(也许是欧几里德距离?)在某处是否有相关文档?

(这不是要找到一种自动选择方法,(例如为 DBSCAN (R) 选择 eps 和 minpts?),而是关于不同值的含义。说“您首先需要一个距离函数”并不能解释距离函数是什么正在使用的是,或者如何创建一个......)

4

2 回答 2

1

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

于 2013-09-04T14:34:15.767 回答
0

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

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

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

但是,您也有一个time属性。您是否有计划将其包含在您的分析中?ELKI 有一个关于编写自定义距离函数的教程,这可能是你当时需要的。您应该能够重用大圆距离,这是 DBSCAN 为您提供的一个巧妙技巧:

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

0 if the distance is less than 0.1 km and the time difference is also less than t
1 otherwise
于 2013-02-21T06:39:20.343 回答