R,SOM,Kohonen软件包,异常值检测

时间:2019-05-14 15:52:00

标签: r outliers som

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

  1. 请问这个距离是如何计算的?
  2. 能否请您评论一下我使用的异常检测?你会怎么做? (在生成的数据集中,它实际上找到了异常值。在     真实的葡萄酒数据集在177种葡萄酒中有四个相对出色的值。看到     下图。我想到了要用条形图描述我真正喜欢的东西的想法。)

图表:

  • 生成的数据,在5个不同的簇和2个2D中为100点 离群值(类别6显示离群值): enter image description here

  • 所显示的全部102个数据点的距离,最后两个是 正确识别的异常值。我重复了测试 包含500和1000个数据点,并且仅添加了2个离群值。的 在这些情况下也发现异常值。 enter image description here

  • 具有潜在异常值的真实葡萄酒数据集的距离: enter image description here

潜在异常值的行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, ]

1 个答案:

答案 0 :(得分:1)

  1. 虽然我不太确定,但是我经常发现两个对象在特定维空间中的距离测量主要使用欧几里得距离。例如,在二维空间中具有位置A(x = 3,y = 4)和B(x = 6,y = 8)的两个点A和B相隔5个距离单位。这是执行平方根((3-6)^ 2 +(4-8)^ 2)的结果。通过在特定维度上相加两个点值之差的两个的尾随幂,这也适用于维度较大的数据。如果A(x = 3,y = 4,z = 5)和B(x = 6,y = 8,z = 7),则距离为平方根((3-6)^ 2 +(4-8)^ 2 +(5-7)^ 2),依此类推。在kohonen中,我认为模型完成训练阶段后,该算法将计算每个基准点到所有节点的距离,然后将其分配给最近的节点(距离最近的节点)。最终,模型返回的变量“ distances”内部的值是每个基准点到其最近节点的距离。脚本中需要注意的一件事是,该算法不会直接测量与数据原始属性值的距离,因为在将数据输入模型之前已对它们进行了缩放。距离测量将应用于数据的缩放版本。缩放是消除变量在另一个变量之上的主导地位的标准程序。
  2. 我相信您的方法是可以接受的,因为'distances'变量内的值是每个基准点到其最近节点的距离。因此,如果基准点与其最近节点之间的距离值较高,则这也意味着:基准点与其他节点之间的距离显然要高得多。