【问题标题】:How do I determine the distance / eps for DBSCAN in R?如何确定 R 中 DBSCAN 的距离/eps?
【发布时间】:2013-02-06 05:36:23
【问题描述】:

我有一个点数据集;

 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)?),而是关于不同值的含义。说“您首先需要一个距离函数”并不能解释所使用的距离函数是什么,或如何创建...)

【问题讨论】:

  • dbscan 来自哪个包?是fpc 还是RWeka 还是别的什么?
  • @mnel 来自 fpc 包。
  • 我认为这与标记为重复的问题有些不同。我不确定这是一个编程问题还是一个统计问题,但它与重复的问题不同。

标签: r distance dbscan


【解决方案1】:

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

【讨论】:

  • 这确实是一个内存问题,但有助于理解。
【解决方案2】:

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

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

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

但是,您也有一个time 属性。您是否有计划将其包含在您的分析中? ELKI 有一个tutorial on writing custom distance functions,这可能是你当时需要的。您应该能够重用大圆距离,这是 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

【讨论】:

  • 感谢您的帮助,但是在 R 中有什么方法可以做到这一点吗?此外,如原帖所述,我正在使用时间。
  • 不,我不使用R。很可能它默认为欧几里得距离,我不知道它是否还允许您使用其他距离。哦,minpts=3 可能太小了。使用更大的值。
猜你喜欢
  • 2018-06-09
  • 2014-12-27
  • 1970-01-01
  • 2012-10-05
  • 2021-08-18
  • 2018-10-07
  • 1970-01-01
  • 2018-07-06
  • 2023-03-15
相关资源
最近更新 更多