我有一个场景,我有几千个数据实例。数据本身表示为单个整数值。我希望能够检测到一个实例何时是一个极端异常值。
例如,使用以下示例数据:
a = 10
b = 14
c = 25
d = 467
e = 12
d
显然是一个异常现象,我希望在此基础上执行特定的操作。
我很想尝试使用我对特定领域的知识来检测异常。例如,找出与有用的平均值的距离,并根据启发式检查。但是,我认为如果我研究更一般的,强大的异常检测技术可能会更好,这些技术背后有一些理论。
由于我对数学的工作知识有限,我希望找到一种简单的技术,例如使用标准偏差。希望数据的单维特性会使这成为一个常见问题,但如果需要更多信息,请发表评论,我会提供更多信息。
编辑:我想我会添加更多有关数据的信息以及我尝试过的内容,以防它使一个答案比另一个更正确。
值均为正数且非零。我希望这些值会形成正态分布。这种期望是基于域的直觉而不是通过分析,如果这不是一件坏事,请告诉我。在聚类方面,除非还有标准算法来选择k值,否则我会发现很难将这个值提供给k-Means算法。
我想对异常值/异常采取的操作是将其呈现给用户,并建议基本上从数据集中删除数据点(我不会了解他们将如何做到这一点,但是它对我的域有意义,因此它不会被用作另一个函数的输入。
到目前为止,我已经尝试了三西格玛,并且我的有限数据集上的IQR异常值测试。 IQR标记的值不够极端,三西格玛指出的实例更符合我对域的直觉。
有关此特定方案的算法,技术或资源链接的信息是有效和受欢迎的答案。
对于简单的一维数据,推荐的异常检测技术是什么?
答案 0 :(得分:43)
mu = mean of the data
std = standard deviation of the data
IF abs(x-mu) > 3*std THEN x is outlier
另一种方法是IQR outlier test:
Q25 = 25th_percentile
Q75 = 75th_percentile
IQR = Q75 - Q25 // inter-quartile range
IF (x < Q25 - 1.5*IQR) OR (Q75 + 1.5*IQR < x) THEN x is a mild outlier
IF (x < Q25 - 3.0*IQR) OR (Q75 + 3.0*IQR < x) THEN x is an extreme outlier
这个测试通常由Box plots使用(由胡须指示):
修改强>
对于您的情况(简单的一维单变量数据),我认为我的第一个答案非常适合。 然而,这不适用于多变量数据。
@smaclell建议使用K-means来查找异常值。除了主要是聚类算法(实际上不是异常检测技术)之外,k-means的问题在于它需要事先知道聚类K的数量的良好值。
更适合的技术是DBSCAN:基于密度的聚类算法。基本上,它将具有足够高密度的区域生长成簇,这将是密度连接点的最大集合。
DBSCAN需要两个参数:epsilon
和minPoints
。它从一个尚未访问过的任意点开始。然后它会找到起点距离epsilon
内的所有邻居点。
如果邻居的数量大于或等于minPoints
,则形成一个集群。将起点及其邻居添加到此群集,并将起始点标记为已访问。然后,算法递归地重复所有邻居的评估过程。
如果邻居数量少于minPoints
,则该点标记为噪声。
如果群集已完全展开(访问范围内的所有点都已访问),则算法将继续迭代剩余的未访问点,直到它们耗尽为止。
最后,标记为噪音的所有点的集合被视为异常值。
答案 1 :(得分:2)
您可以使用各种群集技术来尝试识别数据中的中心趋势。我在模式识别过程中大量使用的一种算法是K-Means。这将允许您识别是否存在多个相关数据集,例如bimodal distribution。这确实需要您了解期望的簇数,但是效率高且易于实现。
在你拥有了手段后,你可以尝试找出是否有任何一点远离任何手段。您可以根据需要定义“远”但我会推荐@Amro的建议作为一个很好的起点。
有关群集算法的更深入讨论,请参阅群集上的wikipedia条目。
答案 2 :(得分:0)
经常使用三西格玛规则和IQR测试,并且有一些简单的算法来检测异常。
The three-sigma rule is correct
mu = mean of the data
std = standard deviation of the data
IF abs(x-mu) > 3*std THEN x is outlier
IQR测试应该是:
Q25 = 25th_percentile
Q75 = 75th_percentile
IQR = Q75 - Q25 // inter-quartile range
If x > Q75 + 1.5 * IQR or x < Q25 - 1.5 * IQR THEN x is a mild outlier
If x > Q75 + 3.0 * IQR or x < Q25 – 3.0 * IQR THEN x is a extreme outlier