异常检测之SOS算法

SOS算法全称stochastic outlier selection algorithm. 该算法的作者是jeroen janssens. SOS算法是一种无监督的异常检测算法.

算法的输入:

特征矩阵(feature martrix)或者相异度矩阵(dissimilarity matrix)

算法的输出:

一个异常概率值向量(每个点对应一个).

直觉上,当一个点和其它所有点的关联度(affinity)都很小的时候,它就是一个异常点。

我们看下面这个数据集:

图的左边是6个二维空间上的点,这就是我们的原始输入数据;而图的右边就是一个基于欧氏距离的相异度矩阵,当然根据输入数据的不同,我们可以用其他的度量距离,比如hamming距离等。下面这张图展示了SOS算法的整个流程:

  1. 计算相异度矩阵D
  2. 计算关联度矩阵A
  3. 计算关联概率矩阵B
  4. 算出异常概率向量

作者使用关联度的想法据说还是受了Geoffrey Hinton的一个思路的启发。

SOS算法中,每一个点都会对应一个方差值,这个方差值取决于点的密度,高密度的点对应较低的方差。

上图中点 x_{5} 的密度最大,方差最小; x_{6} 的密度最小,方差最大。事实上,方差如此设置,是为了使每一个点转化后的邻居数目相同,这里的邻居数目是SOS算法唯一的一个参数,复杂度(Perplexity)。这里的复杂度类似于KNN算法中的K,只是在SOS中邻居并非一个binary值,而是一个概率值,下图展示了点 x_{1} 与其它几个点的关联概率

事实上,关联概率矩阵(binding probability matrix)就是把关联矩阵(affinity matrix)按行归一化得到的。

得到了binding probability matrix,每个点的异常概率值就用如下的公式计算:


上面公式很好诠释了我们上文说到的“直觉”:当一个点和其它所有点的关联度(affinity)都很小的时候,它就是一个异常点

目前flink中已经有了SOS算法的实现,感兴趣的可以参考下Implement Stochastic Outlier Selection

参考文献:

Stochastic Outlier Selectionjeroenjanssens.com图标jeroenjanssens/phd-thesisgithub.com图标

编辑于 2018-03-11

文章被以下专栏收录