Присвойте очки группе на основе минимального расстояния - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь распределить точки по группам на основе евклидова расстояния. Например, в приведенных ниже данных есть три точки, которые представляют три разные группы (One, Two, Three, не зеленые точки на рисунке). Я хотел бы назначить оставшиеся точки (Scatter зеленые точки) в группу на основе минимального евклидова расстояния (т. Е. Изменить Scatter на ближайшую из One Two или Three точек.

Я пытался сделать это вне kmeans или другой функции кластеризации и просто использовать минимальное евклидово расстояние, но приветствую и ценим предложения.

set.seed(123)
Data <- data.frame(
  x = c(c(3,5,8), runif(20, 1, 10)),
  y = c(c(3,5,8), runif(20, 1, 10)),
  Group = c(c("One", "Two", "Three"), rep("Scatter", 20))
)

ggplot(Data, aes(x, y, color = Group)) +
  geom_point(size = 3) +
  theme_bw()

enter image description here

1 Ответ

0 голосов
/ 17 сентября 2018

Что-то вроде этого:

bind_cols(
    Data,
    dist(Data %>% select(-Group)) %>%              # Get x/y coordinates from Data
        as.matrix() %>%                            # Convert to full matrix
        as.data.frame() %>%                        # Convert to data.frame
        select(1:3) %>%                            # We're only interested in dist to 1,2,3
        rowid_to_column("pt") %>%                  
        gather(k, v, -pt) %>%
        group_by(pt) %>%
        summarise(k = k[which.min(v)])) %>%        # Select label with min dist
    mutate(Group = factor(Group, levels = unique(Data$Group))) %>%
    ggplot(aes(x, y, colour = k, shape = Group)) +
    geom_point(size = 3)

enter image description here

Объяснение: Мы вычисляем все попарно евклидовы расстояния, используя dist между One, Two, Three и всеми Scatter точками. Затем мы присваиваем каждой Scatter точке метку k на основе ее минимального расстояния до One (k = 1), Two (k = 2), Three (k = 3).

Обратите внимание, что точка Scatter в (9.6, 3.1) действительно правильно "классифицирована" как принадлежащая Two (k = 2); Вы можете подтвердить это, добавив coord_fixed() в цепочку ggplot.

...