【问题标题】:Efficiently grouping similar numbers together [duplicate]有效地将相似的数字组合在一起[重复]
【发布时间】:2012-12-14 04:01:09
【问题描述】:

可能重复:
1D Number Array Clustering

我有一个像[1, 20, 300, 45, 5, 60, 10, 270, 3] 这样的数字数组。根据接近程度将这些数字分组在一起的有效算法是什么?在这种情况下,我会期待像 [1, 3, 5][20, 45, 60][270, 300] 这样的东西。

【问题讨论】:

标签: algorithm math language-agnostic statistics cluster-analysis


【解决方案1】:

您所问的最难的部分是如何实际定义接近度。您希望[5,10,15,20] 的输出是什么?会不会是和[500,1000,1500,2000]一样的分组?

[1,2,3,5,7,8,9] 呢?应该是一组还是三组? (或两个?)。
[1,2,3,5,7,8,9,1075,4000] 呢? 1075 和 4000 会组合在一起吗?样本中较大的数字会改变较小数字的分组吗?

这个问题是整个机器学习领域都在问的问题:Cluster Analysis 也许这个related question 会有所帮助?

我认为您想要的是K-means clustering(在相关问题中有助于链接到),但您需要知道要将数据拆分为多少组才能使用它。

【讨论】:

  • 对于一维数据,存在更有效的方法。您应该使用多变量方法,例如 k-means。相反,对数据集进行排序(在O(n log n) 中),然后寻找最佳分区策略,例如自然间断、最大间隙、最小核密度估计等。排序是关键
【解决方案2】:

这可能有点矫枉过正,但您可能需要查看 hierarchical clustering algorithms。这些算法将值组合成一个层次结构,您可以从中轻松提取最佳的 k 个集群。凝聚聚类可能是这些方法中最容易实现的,并且根据经验,它往往会产生非常好的聚类。

希望这会有所帮助!

【讨论】:

  • 实际上这些算法是为多维数据设计的。对于单维数据,它们计算成对差异,当数据集可以排序时,这没有多大意义。
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 2018-02-03
  • 2018-12-19
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多