R, SOM, пакет Кохонена, обнаружение выбросов - PullRequest
0 голосов
/ 14 мая 2019

С SOM я немного поэкспериментировал.Сначала я использовал MiniSOM в Python, но я не был впечатлен и перешел на пакет kohonen в R, который предлагает больше возможностей, чем предыдущий.В основном, я применил SOM для трех вариантов использования: (1) кластеризация в 2D с генерируемыми данными, (2) кластеризация с многомерными данными: встроенный набор данных вина и (3) обнаружение выбросов.Я решил все три варианта использования, но хотел бы поднять вопрос в связи с обнаружением выбросов, которое я применил.Для этого я использовал вектор сом $ Расстояния , который содержит расстояние для каждой строки входного набора данных.Значения с превышением расстояния могут быть выбросами.Однако я не знаю, как рассчитывается это расстояние.Описание пакета (https://cran.r -project.org / web / packages / kohonen / kohonen.pdf ) гласит для этой метрики: «расстояние до ближайшей единицы».

  1. Не могли бы вы рассказать, как рассчитывается это расстояние?
  2. Не могли бы вы прокомментировать обнаружение выброса, которое я использовал?Как бы вы это сделали?(В сгенерированном наборе данных он действительно находит выбросы. В реальном наборе данных вина есть четыре относительно превосходящих значения среди 177 сортов вина. См. Диаграммы ниже. Идея, которая пришла мне в голову, использовать гистограммы для изображения этого, я действительнокак.)

Графики:

  • Сгенерированные данные, 100 точек в 2D в 5 различных кластерах и 2 выбросах (категория 6 показывает выбросы): enter image description here

  • Расстояния показаны для всех 102 точек данных, последние две являются выбросами, которые были правильно определены.Я повторил тест с 500 и 1000 точками данных и добавил только 2 выброса.Выбросы также были обнаружены в этих случаях.enter image description here

  • Расстояния для набора данных реального вина с потенциальными выбросами: enter image description here

Идентификатор строки потенциальных выбросов:

# print the row id of the outliers
# the threshold 10 can be taken from the bar chart,
# below which the vast majority of the values fall
df_wine[df_wine$value > 10, ]

it produces the following output:
    index    value
59     59 12.22916
110   110 13.41211
121   121 15.86576
158   158 11.50079

Мой аннотированный фрагмент кода:

        data(wines)

        scaled_wines <- scale(wines)

        # creating and training SOM
        som.wines <- som(scaled_wines, grid = somgrid(5, 5, "hexagonal"))
        summary(som.wines)

        #looking for outliers, dist = distance to the closest unit
        som.wines$distances

        len <- length(som.wines$distances)
        index_in_vector <- c(1:len)
        df_wine<-data.frame(cbind(index_in_vector, som.wines$distances))
        colnames(df_wine) <-c("index", "value")

        po <-ggplot(df_wine, aes(index, value)) + geom_bar(stat = "identity") 
        po <- po + ggtitle("Outliers?") + theme(plot.title = element_text(hjust = 0.5)) + ylab("Distances in som.wines$distances") + xlab("Number of Rows in the Data Set")
        plot(po)

        # print the row id of the outliers
        # the threshold 10 can be taken from the bar chart,
        # below which the vast majority of the values fall
        df_wine[df_wine$value > 10, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...