函数 nndist 和 kNNdist 有什么区别?

What is the difference between functions nndist and kNNdist?

我目前正在尝试使用 R 实现 DBSCAN 算法以查找数据中的异常值。为了初始化参数(尤其是 epsilon),我必须在我的样本中绘制到第 k 个邻居(我选择 k = 3)的升序排序的距离序列,并查看肘部到 select 的正确位置epsilon 的值。

正如我所说,我正在使用 R 统计语言,我发现了两个不同的函数来计算到第 k 个邻居的距离 nndist()kNNdist()。如果我默认情况下理解得很好,它会使用欧几里得距离。但是在我的数据中,这些函数不会显示相同的结果。为了说明我的问题,我在著名的 iris 数据集上实现了这两个函数,您可以看到结果大不相同:

data(iris)
iris <- as.matrix(iris[,1:4])

distance_third_neighbour_iris = iris %>% nndist(k = 3)

as.vector(quantile(distance_third_neighbour_iris, probs = 0.99))
### gives 0.68

distance_third_neighbour_iris = iris %>% kNNdist(k = 3)

as.vector(quantile(distance_third_neighbour_iris, probs = 0.99))
### gives 0.81

显然,这两个函数默认情况下似乎没有使用相同的距离或方法来计算。

这里有几个问题:

  1. nndist以矩阵作为输入时,假定它只是二维的。为了接受 iris 数据集的四列作为四维点并触发 nndist 的多维版本 - 即 nndist.ppx - 你首先需要转换 irisppx 这样的点:ppx(iris)

  2. 即使处理了1.,结果还是不一样。那是因为 kNNdist 不只是产生到 k=3 邻居的距离,而是一个数据帧,其中包含一个包含所有距离的列,直到 k=3(即 k=1、k=2 和 k =3).因此,当您尝试仅获取 k=3 的值并想将其与 nndist 的结果进行比较时,您应该只使用第三列,如下所示:distance_third_neighbour_iris_knndist[,3]

那么你修改的代码应该是:

library(dbscan)
library(spatstat)

data(iris)
iris <- as.matrix(iris[,1:4])

distance_third_neighbour_iris_nndist = ppx(iris) %>% nndist(k = 3)

as.vector(quantile(distance_third_neighbour_iris_nndist, probs = 0.99))
### gives 0.8776718

distance_third_neighbour_iris_knndist = iris %>% kNNdist(k = 3)

as.vector(quantile(distance_third_neighbour_iris_knndist[,3], probs = 0.99))
### gives 0.8776718