我正在使用Apache Spark开展几个项目,但我一直被困在异常/异常检测部分。
我使用聚类技术来查找异常情况,认为异常/异常值将构成自己的聚类,这意味着被认为是异常的数据点实际上是聚类中心。如果只有很少的异常值与数据量相关,则可行,但如果有很多异常值,则无法正常工作。以下是我的代码:https://github.com/Guillermo19/MyTest/blob/dev/anomalyDetection.java
我确信我的观点是异常值成为集群中心是正确的,但它取决于生成的集群数量,到目前为止,数据本身和集群数量之间没有任何关系,所以我可以'找到一种方法来根据可能的异常值增加聚类。
我可以在程序中修改/修改哪些内容以使用群集正确显示异常值?
或者如果我能用不同的方法解决这个问题,请告诉我。我个人认为聚类是找到异常值的最可行和最好的方法之一......
编辑:这是我迄今为止一直在使用的数据,其中包含预期的异常结果:第一档:
Name Size Records
File1 1000 104370
File2 997 103121
File3 1500 109123
File4 2170 113888
File5 2000 111974
File6 1820 110666
File7 1200 106771
File8 1500 108991
File9 1000 104007
File10 1300 107037
File11 1900 111109
File12 1430 108051
File13 1780 110006
File14 2010 114449
File15 2017 114889
File16 800 88812 //possible outlier. My program does indeed show this
File17 1307 107098
File18 1519 109321
File19 1641 110777
File20 1056 104888
第二档:
Name Size Records
File1 1013 105727
File2 980 104230
File3 1520 110542
File4 2198 115369
File5 2026 113430
File6 1844 112105
File7 1216 108159
File8 1520 110408
File9 1013 105359
File10 1317 108428
File11 1925 112553
File12 1449 109456
File13 1803 111436
File14 2036 115937
File15 2043 116383
File16 1002 105177
File17 1324 108490
File18 1539 110742
File19 1662 112630
File20 1070 106589
//no outliers, and my program does show that
第三档:
Name Size Records
File1 1100 50 //anomalous
File2 1003 106712
File3 1556 113174
File4 2250 500000 //anomalous
File5 2074 116131
File6 1888 114774
File7 1245 110734
File8 1556 113037
File9 1037 229999 //anomalous
File10 1348 111569
File11 1971 115233
File12 1484 112062
File13 1846 114089
File14 2084 118698
File15 2092 118564
File16 1026 107681
File17 1356 111073
File18 1576 113379
File19 1702 114889
File20 1325 70000 //anomalous
我在第三个文件中的程序只识别File4和File9异常,并且不显示File1和File20。我很肯定他们都聚在一起,这就是他们不会出现的原因。我想避免将异常数据组合在一起,但我不知道该怎么做。
答案 0 :(得分:4)
人们已尝试使用k-means进行异常检测,但效果不佳。
想象一下你有两个非常相似的异常值。它们将是一个集群。即使不相似,你也经常会在这样的集群中看到不止一个异常值。
如果你有不同密度的聚类,这种方法通常不会检测到密集聚类附近的异常值。群集之间也不存在异常值。
由于随机种子和选择k的问题,该方法易碎且难以使用。此外,您通常需要选择一个大的k,然后运行时间会增长很多。
相反,人们大多使用最近邻居离群值检测和LOF,即局部离群因子。由于您在JVM上,请尝试将数据加载到ELKI中并尝试使用其一些异常检测方法。 ELKI的k-means聚类也比Spark快得多,如果我没记错的话,它已经包含了一种方法来检测具有k-means 的异常值进行比较。