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

lee*_*iya 5 database statistics sanitization normalization 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  |
Run Code Online (Sandbox Code Playgroud)

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

似乎只是使用发生频率%是不够的.需要在明显的异常值周围存在更高"仅错误"概率的热点.

此外,当有15个独特长度可以在5-20个字符之间变化时,具有固定阈值失败,每个字符在7%-20%之间出现.

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

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

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

谢谢!莱昂

aho*_*fer 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/