有效地将相似的数字组合在一起[重复]
Posted
技术标签:
【中文标题】有效地将相似的数字组合在一起[重复]【英文标题】: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]
这样的东西。
【问题讨论】:
在我看来,您要查找的关键字是集群:en.wikipedia.org/wiki/Cluster_analysis。在您的特定情况下,我将从自下而上的层次聚类方法开始:en.wikipedia.org/wiki/Hierarchical_clustering @Mathias- 哇哦,你比我快几秒。 :-) 1D Number Array Clustering、Number clustering/partitioning algorithm、Cluster one-dimensional data optimally? 等的可能副本。 使用搜索功能,弗拉德! @Mathias no:当您有多个维度时,集群是合适的。当数据是 1d 时,可以通过这种方式对数据进行排序和处理大大。 Jenks 自然中断优化是一个很好的关键字,但也有非常简单的基于 delta 的方法效果很好。而且这些非常好的方法中的大多数甚至都无法扩展到二维。 【参考方案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 个集群。凝聚聚类可能是这些方法中最容易实现的,并且根据经验,它往往会产生非常好的聚类。
希望这会有所帮助!
【讨论】:
实际上这些算法是为多维数据设计的。对于单维数据,它们计算成对差异,当数据集可以排序时,这没有多大意义。以上是关于有效地将相似的数字组合在一起[重复]的主要内容,如果未能解决你的问题,请参考以下文章