Получите несколько полигонов для разбросанных данных в R

У меня есть данные облака точек области (координаты x, y, z). График X и Y выглядит так: введите здесь описание изображения

Я пытаюсь получить полигоны разных кластеров в этих данных. Я пробовал следующее:

points <- df [,1:2] # x and y coordinates 
pts <- st_as_sf(points, coords=c('X','Y'))
conc <- concaveman(pts, concavity = 0.5, length_threshold = 0)

Похоже, я просто получаю один многоугольник, связывающий все данные. conc$polygons — это список одной переменной. Как определить несколько полигонов? Что мне не хватает, когда я использую concaveman и что все это может дать?


person Mansi    schedule 15.06.2020    source источник


Ответы (1)


Из вашего примера трудно сказать, какая переменная определяет ваши кластеры. Ниже приведен пример с некоторыми смоделированными кластерами с использованием ggplot2 и data.table (адаптировано из здесь ).

library(data.table)
library(ggplot2)

# Simulate data:
set.seed(1)
n_cluster = 50
centroids = cbind.data.frame(
  x=rnorm(5, mean = 0, sd=5),
  y=rnorm(5, mean = 0, sd=5)
)
dt = rbindlist(
  lapply(
    1:nrow(centroids),
    function(i) {
      cluster_dt = data.table(
        x = rnorm(n_cluster, mean = centroids$x[i]),
        y = rnorm(n_cluster, mean = centroids$y[i]),
        cluster = i
      )
    }
  )
)
dt[,cluster:=as.factor(cluster)]

# Find convex hull of each point by cluster:
hulls = dt[,.SD[chull(x,y)],by=.(cluster)]

# Plot:
p = ggplot(data = dt, aes(x=x, y=y, colour=cluster)) +
  geom_point() +
  geom_polygon(data = hulls,aes(fill=cluster,alpha = 0.5)) +
  guides(alpha=F)

Это дает следующий результат:

Полигональный график с смоделированными кластерами.

Изменить

Если у вас нет предопределенных кластеров, вы можете использовать алгоритм кластеризации. В качестве простого примера см. ниже решение с использованием kmeans с 5 центроидами.

# Estimate clusters (e.g. kmeans):
dt[,km_cluster := as.factor(kmeans(.SD,5)$cluster),.SDcols=c("x","y")]

# Find convex hull of each point:
hulls = dt[,.SD[chull(x,y)],by=.(km_cluster)]

# Plot:
p = ggplot(data = dt, aes(x=x, y=y, colour=km_cluster)) +
  geom_point() +
  geom_polygon(data = hulls,aes(fill=km_cluster,alpha = 0.5)) +
  guides(alpha=F)

В этом случае выход для оцененных кластеров почти эквивалентен построенным.

Полигональный график с кластеризованной оценкой по методу k-средних.

person patalt    schedule 15.06.2020
comment
На самом деле у меня нет предопределенных кластеров, и это то, что я пытаюсь сделать. Я хочу что-то вроде alphashape в python, которое возвращает несколько границ, которые можно создать в виде полигонов. - person Mansi; 15.06.2020
comment
Боюсь, я не знаю функцию Python, но похоже, что она просто вычисляет кластеры под капотом. В R вы можете использовать один из множества доступных алгоритмов кластеризации, например. простое kmeans, а затем действуйте, как описано выше (или используйте функции построения графика, такие как cluster::clusplot(), в вашей подогнанной модели (см. здесь). - person patalt; 15.06.2020
comment
Я собираюсь попробовать это, спасибо. Я приму этот ответ на данный момент. - person Mansi; 15.06.2020
comment
Спасибо @Mansi, я отредактировал ответ, чтобы показать простой пример с kmeans. - person patalt; 15.06.2020