2012-01-20 52 views
5

我想找出检测异常值的最佳方法。这里是问题以及可能无法解决的一些问题。假设我们想从mysql的dirty varchar(50)列中找出一些准统一的数据。让我们开始按字符串长度进行分析。检测稀疏分布的异常值?

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

我想要做的是设计一个算法来决定字符串的长度有被故意独特而不是类型0的或随机的垃圾概率较高。这个字段有可能是一个“枚举”类型,所以可以有多个有效值的频率尖峰。显然10和20是有效的,0只是省略数据。 35和3可能是一些随机垃圾,尽管两者在频率上有很大不同。 19和21可能是20格式的type-os。 11可能是10的type-os,但12呢?

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

此外,当有15个唯一长度可以在5-20个字符之间变化时,具有固定阈值失败,每个长度在7%到20%之间。

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

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

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

谢谢! leon

+0

+1对于有趣的问题 – cctan

回答

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/

+0

谢谢,这是非常有趣的,看起来是点,但似乎并不容易实现是值得我的项目:(我要继续探索一些更简单的加权 - 平均实施,这是非常有效的 – leeoniya

+0

也是这样的:http://en.wikipedia.org/wiki/Local_outlier_factor – leeoniya

+0

@leeoniya。本地离群因子看起来是一个很好的选择,你链接到的文章包括一个Dim2与Dim1的情节,在这种情况下,这将是频率与字符串长度... ...它看起来合理简单的实施,但在文章中没有太多可以继续。您能指出我们除了最后参考文件的一些来源的文章? – ahoffer