【发布时间】:2017-11-23 11:24:48
【问题描述】:
我正在从事一个涉及使用 K-means 模型进行异常检测的项目。
但是,要获得几乎准确和精确的结果,我需要找到 K 的最佳值。
我的算法依赖于这样一个想法,即我的模型中的异常值通常会自行放置在一个集群上。通常“正常”数据会与其他正常数据聚集在一起,但异常数据会形成自己的集群,因此表示异常。但是,我需要找到 K 的最佳值才能使我的算法正常工作,看看它是否好。
关于如何找到一个好的 K 值有什么想法吗?
这是一个包含“正常”虚拟数据的示例文件,我将使用它来训练我的模型:
Name Size Records
File1 1013 105727
File2 990 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
【问题讨论】:
-
您是否考虑过使用其他聚类方法,例如层次聚类?如果您没有具有“真实”聚类的测试集,它可以帮助您选择 K。
-
那是怎么回事?我刚刚浏览了 Apache 的 Spark 文档,他们确实支持分层集群(Bisecting k-means),但有什么区别?这如何帮助我找到 K 而不是正常的 k-means?
-
有 dbscan for spark 的实现。这似乎非常适合您的任务。如果您想找到最佳 k,您可能需要使用非参数贝叶斯方法。例如,中餐厅流程。脖子会痛。
-
Elbow method 是寻找最佳 K 值的流行方法之一,但我不确定如何在 spark(分布式环境)上做到这一点
-
K-means 在异常检测方面真的很糟糕。我宁愿使用真正的异常值检测算法。试试 ELKI,它有几种这样的算法,比 Spark 快得多。
标签: apache-spark machine-learning cluster-analysis k-means