0

我目前正在尝试使用R来实现DBSCAN算法以查找我的数据中的离群值。为了初始化参数(特别是ε),我必须在我的示例中绘制到第k个邻居(我选择k = 3)的递增排序顺序的距离,并查看肘部在哪里选择ε的正确值。函数nndist和kNNdist有什么不同?

正如我所说我使用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 

显然,这两种功能似乎不是默认或方法使用相同的距离来计算。

+0

做*不*使用DBSCAN找到离群值。噪音与异常值不同。只是不够频繁的点才能成为一个集群。改为使用真正的异常值检测算法。例如,尝试使用ELKI中的一些算法。 –

+0

作为一个好处,你不必选择epsilon了。大多数方法只有一个参数,对应于minpts。 –

回答

0

你有几个问题在这里:

  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 
+0

我可以建议您将答案更新为可重复的吗?我得到'ppx(iris)%>%nndist(k = 3)的错误:找不到函数“%>%”'。可能你想先调用'library(magrittr)'。你也可以使用参数'k = 1:3'来获得前三个nn-distance。 –

相关问题