AVF算法全称Attribute Value Frequency算法,可能这个算法有点生僻,之所以这么说,是我之前也没有怎么听说过,因为工作的原因,最近研究了下这个算法,发现如此简单有效。
我之前写的大多数异常检测算法,都是处理数值类型的数据,那么处理category 类型的数据,有没有什么好的算法?attribute value算法,就是非常有效的一种。
下面这段伪代码是我在stack overflow上面搜到的
Label all data points as non-outliers
calculate frequency of each attribute value
foreach point x
AVFscore = Sum(frequency each attrib. value in x)/num.attribs
end foreach
return top k outliers with minimum AVFscore
把上面的伪代码翻译成汉字如下:
将所有的数据点都标为非异常点;计算所有每一个属性值的频数(可见下面的例子);计算每一个点的AVF score,计算公式如下
即AVF分值等于样本点x的每一个属性值对应的频数之和除以属性总数,当然这里的属性指的都是category 的属性。

AVFscore值越小,样本越异常

下面是一个例子
对于属性Country_cde共有两个属性值,分别是IE,US,其中IE的频数为3,US的频数为2。
对于属性Flag1共有三个属性值,分别是A,B,C,频数分别为3,1,1
对于属性Flag2共有三个属性值,分别是X,Y,Z,频数分别为3,1,1
有了上面几个属性值的频数,AVF score就计算出来了,就是表中的最后一列,大家手算都能算出来;表中的样本中异常度最高的就是AVF score最小的点,即最后一个样本点。
参考文献:
Attribute Value Frequency in R (outliers in categorical variables)