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 .
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. –
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. –