С SOM я немного поэкспериментировал.Сначала я использовал MiniSOM в Python, но я не был впечатлен и перешел на пакет kohonen в R, который предлагает больше возможностей, чем предыдущий.В основном, я применил SOM для трех вариантов использования: (1) кластеризация в 2D с генерируемыми данными, (2) кластеризация с многомерными данными: встроенный набор данных вина и (3) обнаружение выбросов.Я решил все три варианта использования, но хотел бы поднять вопрос в связи с обнаружением выбросов, которое я применил.Для этого я использовал вектор сом $ Расстояния , который содержит расстояние для каждой строки входного набора данных.Значения с превышением расстояния могут быть выбросами.Однако я не знаю, как рассчитывается это расстояние.Описание пакета (https://cran.r -project.org / web / packages / kohonen / kohonen.pdf ) гласит для этой метрики: «расстояние до ближайшей единицы».
- Не могли бы вы рассказать, как рассчитывается это расстояние?
- Не могли бы вы прокомментировать обнаружение выброса, которое я использовал?Как бы вы это сделали?(В сгенерированном наборе данных он действительно находит выбросы. В реальном наборе данных вина есть четыре относительно превосходящих значения среди 177 сортов вина. См. Диаграммы ниже. Идея, которая пришла мне в голову, использовать гистограммы для изображения этого, я действительнокак.)
Графики:
Сгенерированные данные, 100 точек в 2D в 5 различных кластерах и 2 выбросах (категория 6 показывает выбросы):
Расстояния показаны для всех 102 точек данных, последние две являются выбросами, которые были правильно определены.Я повторил тест с 500 и 1000 точками данных и добавил только 2 выброса.Выбросы также были обнаружены в этих случаях.
Расстояния для набора данных реального вина с потенциальными выбросами:
Идентификатор строки потенциальных выбросов:
# 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, ]