我已经在 R 中实现了 DBSCAN 算法,并且我将集群分配与fpc 库的 DBSCAN 实现相匹配。对 fpc 库 dbscan 示例中给出的合成数据进行测试:
n <- 600
x <- cbind(runif(10, 0, 10)+rnorm(n, sd=0.2), runif(10, 0, 10)+rnorm(n, sd=0.3))
使用以下参数进行聚类:
eps = 0.2
MinPts = 5
我正在将 的集群分配fpc::dbscan
与我的dbscan
. 运行的最大值显示每个点都被两种实现方式相同地分类。
但是在某些情况下,在我的实现中,与 fpc 实现中不同的集群分配了 1 或 2 个点,少数情况下 5 或 6 个点被分配给不同的集群。我注意到只有边界点分类不同。在绘制之后,我看到集群成员在实现中不匹配的点处于这样的位置,这样它就可以分配给它周围的任何集群,这取决于它首先是从哪个集群的种子点被发现的。
我正在显示一个 150 点的图像(以避免混乱),其中 1 点分类不同。请注意,在我的实现中,失配点簇数总是大于 fpc 实现。
聚类图。
顶部插图是 fpc::dbscan,底部插图是我的 dbscan 实现
注意我的实现中的不同点标有感叹号(!)我还上传了不匹配部分的缩放图像:
我的 dbscan 实现输出
+
是核心点
o
是边界点
-
是噪声点
!
突出不同点
fpc::dbscan 实现输出
三角形是核心点 彩色圆圈是边界点 黑色圆圈是噪声点
另一个例子:
我的 dbscan 实现输出
fpc::dbscan 实现输出
编辑
等 xy 缩放示例
根据 Anony-Mousse 的要求
在不同的情况下,有时我的实现似乎正确分类了不匹配点,有时 fpc 实现似乎正确分类了不匹配点。见下文:
fpc::dbscan (带有三角形图)似乎正确分类了不匹配点
我的 dbscan 实现(带有 + 绘图)似乎正确分类了不匹配点
问题
我是聚类分析的新手,因此我有另一个问题:这些类型的差异是否允许?
在我的实现中,我从提供的第一个点扫描到最后一个点,并且
fpc::dbscan
这些点也以相同的顺序扫描。在这种情况下,两个实现都应该!
从同一个集群中心发现失配点(用 标记)。此外,我还生成了一些fpc::dbscan
将点标记为噪声的情况,但我的实现将其分配给了一些集群。在这种情况下,为什么会出现这种差异?
应要求提供代码段。