我目前正在尝试使用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
显然,这两种功能似乎不是默认或方法使用相同的距离来计算。
做*不*使用DBSCAN找到离群值。噪音与异常值不同。只是不够频繁的点才能成为一个集群。改为使用真正的异常值检测算法。例如,尝试使用ELKI中的一些算法。 –
作为一个好处,你不必选择epsilon了。大多数方法只有一个参数,对应于minpts。 –