使用SOM,我做了一些实验。首先,我在Python中使用了MiniSOM,但并没有给我留下深刻的印象,而是将其更改为R中的kohonen软件包,它提供了比以前的版本更多的功能。基本上,我将SOM应用于三个用例:(1)使用生成的数据进行2D聚类;(2)使用多维数据进行聚类:内置的葡萄酒数据集;以及(3)异常检测。我解决了所有三个用例,但我想提出一个与我应用的异常检测有关的问题。为此,我使用了向量 som $ distances ,其中包含输入数据集每一行的距离。具有出色距离的值可以是离群值。但是,我不知道该距离是如何计算的。数据包说明(https://cran.r-project.org/web/packages/kohonen/kohonen.pdf)表示此度量标准:“到最近单位的距离”。
潜在异常值的行ID:
# 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, ]
答案 0 :(得分:1)