Clustering spatial basé sur la densité des applications avec bruit (DBSCAN) clustering dans R

9

cette question a commencé comme " Clustering spatial data in R " et est maintenant passée à la question DBSCAN.

Comme les réponses à la première question l'ont suggéré, j'ai cherché des informations sur DBSCAN et j'ai lu quelques documents. De nouvelles questions ont surgi.

DBSCAN nécessite certains paramètres, l'un d'eux est "distance". Comme mes données sont en trois dimensions, longitude, latitude et température, quelle "distance" dois-je utiliser? quelle dimension est liée à cette distance? Je suppose que ce devrait être la température. Comment puis-je trouver une telle distance minimale avec R?

Un autre paramètre est le nombre minimum de points nécessaires pour former un cluster. Existe-t-il une méthode pour trouver ce numéro? Malheureusement, je ne l'ai pas trouvé.

Recherche sur Google Je n'ai pas trouvé d'exemple R pour utiliser dbscan dans un ensemble de données similaire au mien, connaissez-vous un site Web avec ce genre d'exemples? Je peux donc lire et essayer de m'adapter à mon cas.

La dernière question est que ma première tentative de R avec DBSCAN (sans réponse appropriée aux questions précédentes) a entraîné un problème de mémoire. R dit qu'il ne peut pas allouer de vecteur. Je commence par une grille espacée de 4 km avec 779191 points qui se termine par environ 300000 lignes x 3 colonnes (latitude, longitude et température) lors de la suppression des points SST non valides. Tout conseil pour résoudre ce problème de mémoire. Cela dépend-il de mon ordinateur ou de DBSCAN lui-même?

Merci pour la patience de lire un long message probablement ennuyeux et pour votre aide.

pacomet
la source
Il y a un forum dédié à l'analyse spatiale. Peut-être mentionnez-vous ce message là (n'oubliez pas de mentionner que vous effectuez un cross-post) gis.stackexchange.com
Roman Luštrik

Réponses:

2

Je suis toujours coincé avec ce problème. J'ai reçu quelques suggestions de la liste de diffusion R (merci à Christian Hennig) que je joins ici:

Avez-vous envisagé la fonction dbscan dans la bibliothèque fpc , ou était-ce une autre? La fpc::dbscan()fonction n'a pas de paramètre "distance" mais plusieurs options, dont l'une peut résoudre votre problème de mémoire (consultez la documentation du paramètre "mémoire").

L'utilisation d'une matrice de distance pour des centaines de milliers de points est une recette pour un désastre (en termes de mémoire). Je ne sais pas si la fonction que vous avez utilisée l'a fait, mais fpc::dbscan()peut l'éviter.

Il est vrai que cela fpc::dbscan()nécessite des constantes de réglage que l'utilisateur doit fournir. Il n'y a malheureusement pas de règle générale sur la façon de procéder; il serait nécessaire de comprendre la méthode et la signification des constantes, et comment cela se traduit par les exigences de votre application.

Vous pouvez essayer plusieurs choix différents et faire une validation de cluster pour voir ce qui fonctionne, mais je ne peux pas l'expliquer facilement en termes généraux par e-mail.

J'ai fait quelques tentatives avec mes données mais sans succès:

"Oui, j'ai essayé dbscan de fpc mais je suis toujours bloqué sur le problème de mémoire. Concernant votre réponse, je ne sais pas quel paramètre de mémoire dois-je regarder. Voici le code que j'ai essayé avec les paramètres dbscan, peut-être que vous pouvez voir s'il y a une erreur.

> sstdat=read.csv("sst.dat",sep=";",header=F,col.names=c("lon","lat","sst"))
> library(fpc)
> sst1=subset(sstdat, sst<50)
> sst2=subset(sst1, lon>-6)
> sst2=subset(sst2, lon<40)
> sst2=subset(sst2, lat<46)
> dbscan(sst2$sst, 0.1, MinPts = 5, scale = FALSE, method = c("hybrid"), 
         seeds = FALSE, showplot = FALSE, countmode = NULL)
Error: no se puede ubicar un vector de tamaño  858.2 Mb
> head(sst2)
             lon   lat   sst
1257 35.18 24.98 26.78
1258 35.22 24.98 26.78
1259 35.27 24.98 26.78
1260 35.31 24.98 26.78
1261 35.35 24.98 26.78
1262 35.40 24.98 26.85

Dans cet exemple, je ne m'applique qu'aux dbscan()valeurs de température, pas lon / lat, donc le epsparamètre est 0,1. Comme il s'agit d'un ensemble de données quadrillé, tout point est entouré de huit points de données, alors j'ai pensé qu'au moins 5 des points environnants devraient être dans la distance d'accessibilité. Mais je ne suis pas sûr que j'obtiens la bonne approche en ne considérant que la valeur de la température, peut-être qu'il me manque alors des informations spatiales. Comment dois-je traiter les données de longitude et de latitude?

Les dimensions sst2sont de: 152243 lignes x 3 colonnes "

Je partage ces e-mails ici au cas où l'un de vous pourrait partager un peu de lumière sur R et DBSCAN. Merci encore

pacomet
la source
Hé, où avez-vous pu résoudre le problème? Je suis resté avec des problèmes similaires. pouvez-vous s'il vous plaît partager vos pensées?
kumar
Cher @kumar, j'ai dû revenir aux méthodes de cluster CLARA. Je ne pouvais pas utiliser DBSCAN, je suis désolé, je ne peux pas vous aider
pacomet
2

Le problème est ici avec R . Pour que DBSCAN soit efficace, vous devez avoir une structure d'index appropriée (qui doit correspondre à votre distance). Cependant, R ne fait pas vraiment d'indexation. De plus, le package fpc est une implémentation minimaliste de DBSCAN, n'offrant qu'une petite partie de ses fonctionnalités.

Quant à la fonction de distance, c'est là que votre "connaissance du domaine" est nécessaire. Si vous avez une implémentation DBSCAN suffisamment flexible (elle est vraiment facile à implémenter, l'index pour la rendre plus rapide que est beaucoup plus difficile!), Vous devriez pouvoir mettre une distance arbitraire. Vous pouvez même faire deux fonctions de distance et des valeurs epsilon: les points doivent être au plus à et la différence de température doit être inférieure à10 k m 1 K .O(n2)10km1K.

Regardez "DBSCAN généralisé" pour les principes généraux dont DBSCAN a besoin: une notion de "voisinage" et une notion de "points centraux" (ou "densité").

A QUIT - Anony-Mousse
la source