Spark使用聚类的异常检测程序

时间:2017-06-30 14:14:23

标签: apache-spark cluster-analysis data-mining

我正在使用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。我很肯定他们都聚在一起,这就是他们不会出现的原因。我想避免将异常数据组合在一起,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:4)

人们已尝试使用k-means进行异常检测,但效果不佳。

想象一下你有两个非常相似的异常值。它们将是一个集群。即使不相似,你也经常会在这样的集群中看到不止一个异常值。

如果你有不同密度的聚类,这种方法通常不会检测到密集聚类附近的异常值。群集之间也不存在异常值。

由于随机种子和选择k的问题,该方法易碎且难以使用。此外,您通常需要选择一个大的k,然后运行时间会增长很多。

相反,人们大多使用最近邻居离群值检测和LOF,即局部离群因子。由于您在JVM上,请尝试将数据加载到ELKI中并尝试使用其一些异常检测方法。 ELKI的k-means聚类也比Spark快得多,如果我没记错的话,它已经包含了一种方法来检测具有k-means 的异常值进行比较。