检测稀疏分布中的异常值?

时间:2012-01-20 01:26:26

标签: database statistics normalization sanitization outliers

我想找到检测异常值的最佳方法。这是问题和一些可能不起作用的事情。假设我们想要从mysql中的脏varchar(50)列中删除一些准统一数据。让我们从字符串长度进行分析开始。

| strlen |  freq  | 
|      0 |   2312 |
|      3 |     45 |
|      9 |     75 |
|     10 |  15420 |
|     11 |    395 |
|     12 |    114 |
|     19 |     27 |
|     20 |   1170 |
|     21 |     33 |
|     35 |     9  |

我想要做的是设计一种算法来确定哪个字符串长度很有可能是有目的的唯一,而不是类型或随机垃圾。该字段有可能是“枚举”类型,因此有效值可能有几个频率峰值。显然10和20都有效,0只是省略数据。 35和3可能是一些随机垃圾,尽管两者的频率差别很大。 19和21可能是20格式的type-os。 11可能是10的type-os,但是12呢?

似乎只是使用出现频率%是不够的。需要在明显的异常值周围出现更高“仅错误”概率的热点。

另外,当有15个独特长度可以在5-20个字符之间变化时,具有固定阈值会失败,每个字符的发生率在7%到20%之间。

标准差不起作用,因为它依赖于平均值。中位数绝对偏差可能不会起作用,因为你可以有一个不能丢弃的高频异常值。

是的,将会有其他参数用于清理代码中的数据,但长度似乎非常快速地对具有任意数量结构的字段进行预过滤和分类。

是否有任何已知的方法可以有效地工作?我不太熟悉贝叶斯过滤器或机器学习,但也许他们可以提供帮助吗?

谢谢! 利昂

1 个答案:

答案 0 :(得分:2)

听起来像异常检测是要走的路。异常检测是一种用于查找异常值的机器学习。它有几种,包括有监督和无监督。在监督学习中,算法使用异常值的示例进行训练。在无监督学习中,该算法试图在没有任何示例的情况下找到异常值。以下是一些开始的链接:

http://en.wikipedia.org/wiki/Anomaly_detection

http://s3.amazonaws.com/mlclass-resources/docs/slides/Lecture15.pdf

我没有找到任何可用库的链接。如果您找不到您所选语言的异常检测库,那么像MATLAB或它的免费表亲Octave这样的东西可能是一个不错的方法。 https://goker.wordpress.com/tag/anomaly-detection/