函数 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
显然,这两个函数默认情况下似乎没有使用相同的距离或方法来计算。
这里有几个问题:
当nndist
以矩阵作为输入时,假定它只是二维的。为了接受 iris
数据集的四列作为四维点并触发 nndist
的多维版本 - 即 nndist.ppx
- 你首先需要转换 iris
到 ppx
这样的点:ppx(iris)
即使处理了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
我目前正在尝试使用 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
显然,这两个函数默认情况下似乎没有使用相同的距离或方法来计算。
这里有几个问题:
当
nndist
以矩阵作为输入时,假定它只是二维的。为了接受iris
数据集的四列作为四维点并触发nndist
的多维版本 - 即nndist.ppx
- 你首先需要转换iris
到ppx
这样的点:ppx(iris)
即使处理了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