【问题标题】:Find the perfect value for K in K-Means Algorithm (Apache Spark)在 K-Means 算法 (Apache Spark) 中找到 K 的完美值
【发布时间】: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


【解决方案1】:

使用 K-means 的分层版本。 Apache Spark 具有以这种方式工作的 BisectingKMeans。它会根据您拥有的记录数量计算出合适的 K 值。这样您就不必在创建模型时定义 K(集群)。如果您对分配的 K 值不满意,您仍然可以设置 K 值,但它通常工作得很好。

感谢@Peheje 的提示。

【讨论】:

  • 平分 K-means 不会为您提供 K 的最佳值。它默认为 4。
猜你喜欢
  • 2019-08-29
  • 2013-07-03
  • 2012-04-13
  • 2010-12-05
  • 2017-04-20
  • 2013-04-22
  • 2014-09-30
  • 2012-07-06
相关资源
最近更新 更多