Лучший способ кластеризовать точки «горячей» точки в одном городе в R? - PullRequest
0 голосов
/ 02 апреля 2020

Я новичок в R и (без присмотра) машинного обучения. Я пытаюсь найти лучшее кластерное решение для моих данных в R.

О чем мои данные?

У меня есть набор данных с +/- 800 long / lat WGS84 координаты в одном городе.

Длинна в диапазоне 6,90 - 6,95 лат в диапазоне 52,29 - 52,33

Что я хочу?

Я хочу найти " горячие точки "в зависимости от их плотности. Как пример: минимум 5 длинных / длинных точек в диапазоне 50 метров. Это пример точечного графика:

point plot

Зачем мне это нужно?

Как пример: давайте Предположим, что каждая точка является автомобильной аварией. Сгруппировав точки, я надеюсь увидеть, какие области требуют внимания. (мин. х точек в диапазоне х метров требует внимания)

Что я нашел?

Для моего решения возможны следующие алгоритмы кластеризации:

  1. DBscan (https://cran.r-project.org/web/packages/dbscan/dbscan.pdf)
  2. HDBscan (https://cran.r-project.org/web/packages/dbscan/vignettes/hdbscan.html)
  3. ОПТИКА (https://www.rdocumentation.org/packages/dbscan/versions/0.9-8/topics/optics)
  4. Алгоритм кластеризации городов (https://cran.r-project.org/web/packages/osc/vignettes/paper.pdf)

Мои вопросы

  1. Что лучшее решение или алгоритм для моего случая в R?
  2. Правда ли, что сначала мне нужно преобразовать мою длинную / лат в матрицу расстояния / хаверсайна?

1 Ответ

0 голосов
/ 11 апреля 2020

Найдите что-нибудь интересное: https://gis.stackexchange.com/questions/64392/finding-clusters-of-points-based-distance-rule-using-r

Я немного изменил этот код, используя выбросы в качестве мест, где происходит много

# 1. Make spatialpointsdataframe #

xy <- SpatialPointsDataFrame(
  matrix(c(x,y), ncol=2), data.frame(ID=seq(1:length(x))),
  proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

# 2. Use DISTM function to generate distance matrix.# 
mdist <- distm(xy)

# 3. Use hierarchical clustering with complete methode#
hc <- hclust(as.dist(mdist), method="complete")

# 4. Show dendogram#
plot(hc, labels = input$street, xlab="", sub="",cex=0.7)

# 5. Set distance: in my case 300 meter#
d=300

# 6. define clusters based on a tree "height" cutoff "d" and add them to the SpDataFrame
xy$clust <- cutree(hc, h=d)

# 7. Add clusters to dataset#
input$cluster <- xy@data[["clust"]]

# 8. Plot clusters #
plot(input$long, input$lat, col=input$cluster, pch=20)
text(input$long, input$lat, labels =input$cluster)

300 m cluster

# 9. Count n in cluster#
selection2 <- input %>% count(cluster)

# 10. Make a boxplot #
boxplot(selection2$n)

#11. Get first outlier#
outlier <- boxplot.stats(selection2$n)$out
outlier <- sort(outlier)
outlier <- as.numeric(outlier[1])

#12. Filter clusters greater than outlier#
selectie3 <- as.vector(selection2 %>% filter(selection2$n >= outlier[1]) %>% select(cluster))

#13. Make a new DF with all outlier clusters#
heatclusters <- input %>% filter(cluster%in% c(selectie3$cluster))

#14. Plot outlier clusters#
plot(heatclusters$long, heatclusters$lat, col=heatclusters$cluster)

outlier cluster

#15. Plot on density map ##
googlemap + geom_point(aes(x=long , y=lat), data=heatclusters, color="red", size=0.1, shape=".") +
  stat_density2d(data=heatclusters,
                 aes(x =long, y =lat, fill= ..level..), alpha = .2, size = 0.1,
                 bins = 10, geom = "polygon") + scale_fill_gradient(low = "green", high = "red") 

Не знаю, является ли это хорошим решением. Но это похоже на работу. Может быть, у кого-то есть другие предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...