0

J'essaie actuellement d'implémenter l'algorithme DBSCAN avec R pour trouver des outliers dans mes données. Afin d'initialiser les paramètres (epsilon en particulier), je dois tracer la séquence triée ascendante des distances au kième voisin (j'ai choisi k = 3) dans mon échantillon et voir où est le coude pour sélectionner la valeur correcte pour epsilon. Comme je l'ai dit, j'utilise le langage statistique R et j'ai trouvé deux fonctions différentes qui calculent la distance au kième voisin nndist() et kNNdist()Quelle est la différence entre les fonctions nndist et kNNdist?

Si j'ai bien compris par défaut, il utilise la distance euclidienne. Cependant, dans mes données, les fonctions n'affichent pas les mêmes résultats. Pour illustrer mon problème, je mets en œuvre les deux fonctions sur le célèbre jeu de données iris et vous pouvez voir que les résultats sont tout à fait différents:

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 

De toute évidence, les deux fonctions semblent pas utiliser la même distance par défaut ou méthode de calcul .

+0

Ne pas * utiliser * DBSCAN pour trouver des valeurs aberrantes. Le bruit n'est pas la même chose que les valeurs aberrantes. Ce ne sont que des points qui ne sont pas assez fréquents pour être un cluster. Utilisez plutôt un véritable algorithme de détection des valeurs aberrantes. Essayez certains des algorithmes dans ELKI, par exemple. –

+0

Comme avantage secondaire, vous n'avez plus besoin de choisir epsilon. La plupart des méthodes n'ont qu'un seul paramètre, correspondant aux minpts. –

Répondre

0

Vous avez plusieurs questions ici:

  1. Lorsque nndist prend une matrice en entrée, il suppose qu'il est seulement en deux dimensions. Pour accepter les quatre colonnes de l'ensemble de données iris en tant que points à quatre dimensions et déclencher la version multidimensionnelle de nndist - qui est nndist.ppx - vous devez d'abord transformer iris à ppx des points comme celui-ci: ppx(iris)

  2. Même après avoir pris soin de 1., les résultats seraient encore différents. C'est parce que kNNdist ne produit pas seulement la distance au voisin k = 3, mais une trame de données qui contient une colonne pour toutes les distances jusqu'à k = 3 (c'est-à-dire k = 1, k = 2 et k = 3). Par conséquent, lorsque vous essayez d'obtenir la valeur que pour k = 3 et que vous voulez le comparer au résultat de nndist, vous ne devez utiliser la troisième colonne, comme ceci: distance_third_neighbour_iris_knndist[,3]

Votre code modifié, puis , devrait être:

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

Puis-je vous suggérer de mettre à jour votre réponse pour qu'elle soit reproductible? J'ai 'Erreur dans ppx (iris)%>% nndist (k = 3): impossible de trouver la fonction"%>% "'. Vous voulez probablement appeler 'library (magrittr)' en premier. Vous pouvez également obtenir les trois premières distances nn avec 'nndist' en utilisant l'argument' k = 1: 3'. –