Gru*_*eck 29 classification machine-learning
我有一个场景,我有几千个数据实例.数据本身表示为单个整数值.我希望能够检测出一个实例是一个极端的异常值.
例如,使用以下示例数据:
a = 10
b = 14
c = 25
d = 467
e = 12
Run Code Online (Sandbox Code Playgroud)
d 显然是异常,我想基于此执行特定的操作.
我很想尝试使用我对特定领域的知识来检测异常.例如,找出与有用的平均值的距离,并根据启发式检查该值.但是,我认为如果我研究更一般的,强大的异常检测技术可能会更好,这些技术背后有一些理论.
由于我的数学知识有限,我希望找到一种简单的技术,例如使用标准偏差.希望数据的单一尺寸性质会使这成为一个常见问题,但如果需要更多信息,请发表评论,我会提供更多信息.
编辑:以为我会添加有关数据的更多信息以及我尝试过的内容,以防它使一个答案比另一个更正确.
这些值都是正数且非零.我希望这些值会形成正态分布.这种期望是基于域的直觉而不是通过分析,如果这不是一件坏事,请告诉我.在聚类方面,除非还有标准算法来选择k值,否则我会发现很难将这个值提供给k-Means算法.
我想对异常/异常采取的行动是将它呈现给用户,并建议基本上从数据集中删除数据点(我不会了解他们将如何做到这一点,但它是有道理的对于我的域名),因此它不会被用作另一个函数的输入.
到目前为止,我已经尝试了三西格玛,并且我的有限数据集上的IQR异常值测试.IQR标记的值不够极端,三西格玛指出的实例更符合我对域的直觉.
有关此特定方案的算法,技术或资源链接的信息是有效且受欢迎的答案.
对于简单的一维数据,推荐的异常检测技术是什么?
Amr*_*mro 43
查看三西格玛规则:
mu = mean of the data
std = standard deviation of the data
IF abs(x-mu) > 3*std THEN x is outlier
Run Code Online (Sandbox Code Playgroud)
另一种方法是IQR离群值测试:
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
Run Code Online (Sandbox Code Playgroud)
该试验通常采用箱形图(由胡须表示):

编辑:
对于您的情况(简单的一维单变量数据),我认为我的第一个答案非常适合.然而,这不适用于多变量数据.
@smaclell建议使用K-means来查找异常值.除了主要是聚类算法(实际上不是异常检测技术)之外,k均值的问题在于它需要预先知道聚类数K的良好值.
更适合的技术是DBSCAN:基于密度的聚类算法.基本上,它将具有足够高密度的区域生长成簇,这将是密度连接点的最大集合.

DBSCAN需要两个参数:epsilon和minPoints.它从一个尚未访问过的任意点开始.然后它找到epsilon起点距离内的所有邻居点.
如果邻居的数量大于或等于minPoints,则形成集群.将起点及其邻居添加到此群集,并将起始点标记为已访问.然后,算法递归地重复所有邻居的评估过程.
如果邻居的数量小于minPoints,则该点被标记为噪声.
如果群集完全展开(访问范围内的所有点都被访问),则算法继续迭代剩余的未访问点,直到它们被耗尽.
最后,标记为噪声的所有点的集合被认为是异常值.
| 归档时间: |
|
| 查看次数: |
13748 次 |
| 最近记录: |