我有一个场景,其中有数千个数据实例。数据本身以单个整数值表示。我希望能够检测出某个实例是否为极端异常值。
例如,以下示例数据:
a = 10b = 14c = 25d = 467e = 12
d
显然是一个异常值,我希望基于此执行特定的操作。
我曾想尝试利用我对特定领域的了解来检测异常。例如,找出一个与均值的距离,这个距离是有用的,然后基于启发式方法进行检查。然而,我认为最好还是研究一些更通用、更robust的异常检测技术,这些技术背后有一些理论支持。
由于我的数学知识有限,我希望找到一个简单的技术,比如使用标准差。希望数据的单维性质会使这个问题变得相当普遍,但如果需要更多关于场景的信息,请留言,我会提供更多信息。
编辑:我想补充一些关于数据和尝试过的方法的信息,以防这些信息能使某个答案比另一个更正确。
这些值都是正数且非零。我期望这些值会形成一个正态分布。这种期望是基于对领域的直觉,而不是通过分析,如果这种假设不是坏事,请告诉我。在聚类方面,除非也有标准算法来选择k值,否则我很难为k-Means算法提供这个值。
对于异常值/异常,我希望采取的行动是将其呈现给用户,并建议将该数据点从数据集中移除(我不会详细说明他们如何做到这一点,但这对我的领域来说是有意义的),这样它就不会被用作另一个函数的输入。
到目前为止,我已经在我的有限数据集上尝试了三西格玛和IQR异常值测试。IQR标记的值不够极端,三西格玛指出的实例更符合我对领域的直觉。
关于算法、技术或学习此特定场景的资源的信息都是有效且欢迎的答案。
对于简单的一维数据,推荐的异常检测技术是什么?
回答:
查看三西格玛规则:
mu = 数据的均值std = 数据的标准差IF abs(x-mu) > 3*std THEN x 是异常值
另一种方法是IQR异常值测试:
Q25 = 25th_percentileQ75 = 75th_percentileIQR = Q75 - Q25 // 四分位距IF (x < Q25 - 1.5*IQR) OR (Q75 + 1.5*IQR < x) THEN x 是轻度异常值IF (x < Q25 - 3.0*IQR) OR (Q75 + 3.0*IQR < x) THEN x 是极端异常值
此测试通常由箱线图(由胡须表示)使用:
编辑:
对于你的情况(简单的一维单变量数据),我认为我的第一个答案非常适合。然而,这不适用于多变量数据。
@[隐藏人名]建议使用K-means来查找异常值。除了它主要是一个聚类算法(不是真正的异常检测技术)之外,k-means的问题在于它需要提前知道一个好的聚类数K的值。
更适合的技术是DBSCAN:一种基于密度的聚类算法。基本原理是将具有足够高密度的区域扩展成聚类,这些聚类将是密度连接点的最大集合。
DBSCAN需要两个参数:epsilon
和minPoints
。它从一个未访问过的任意点开始。然后找到起始点距离epsilon
内的所有邻居点。
如果邻居点的数量大于或等于minPoints
,则形成一个聚类。起始点及其邻居点被添加到这个聚类中,起始点被标记为已访问。算法然后对所有邻居点递归地重复评估过程。
如果邻居点的数量小于minPoints
,则该点被标记为噪声。
如果一个聚类完全扩展(所有可达的点都被访问)后,算法继续迭代剩余的未访问点,直到它们耗尽。
最后,所有被标记为噪声的点都被视为异常值。