我的任务是找到N个簇,其中包含特定数据集的最多点,因为簇的大小是一定的。目前,我试图通过将我的数据插入到kd树中,迭代数据并找到它的最近邻居,然后在他们制作的集群没有超过限制时合并这些点来尝试这样做。我不确定这种方法会给我一个全局解决方案,所以我正在寻找方法来调整它。如果你能告诉我这会遇到什么类型的问题,那也很棒。
答案 0 :(得分:7)
查看scipy.clustering作为开始。关键词搜索可以提供有关在那里使用的不同算法的大量信息。聚类是一个很大的领域,有大量的研究和实际应用,并且已经发现许多简单的方法可以很好地工作,所以你可能不想从自己开始。
这就是说,聚类算法通常很容易编程,如果你想编写自己的编程算法,那么k-means和凝聚聚类是一些很容易做到的最爱。
最后,我不确定你对确切N个群集的想法是否是一致的,但它取决于你的“大小”和“群集”的确切含义(是单点a集群?)。
<强>更新强>
根据下面的OP评论,我认为标准聚类方法不会给出这个问题的最佳解决方案,因为没有连续的度量标准可以优化点之间的“距离”。虽然在某些情况下它们可能会提供一个好的解决方案或近似值。对于聚类方法,我会尝试使用k-means,因为这种方法的前提是有一个固定的N.
但不是聚类,这似乎更像是covering problem(即,你有N个固定大小的矩形,你试图用它们覆盖所有的点),但是我对这些不太了解,所以我会留给别人。
答案 1 :(得分:0)
如果您的群集数量是固定的,并且您只想最大化这些群集中的点数,那么我认为贪婪的解决方案会很好:
那么如何找到包含最大点数的最大区域A的矩形(实际上每个矩形都有这个区域)?
对于欧几里德距离来说,矩形并不常见,在尝试解决这个问题之前,如果你真的需要矩形或只是群集大小的限制王,你能精确吗?圆/椭圆会起作用吗?
编辑: 贪婪是行不通的(见下面的评论),它确实需要是矩形......
答案 2 :(得分:0)
link text实际上,我认为这有两个关键的假设非常简单。
1)假设“一定大小”我们可以说“任何簇必须完全包含在半径为r的圆内”。
2)所有积分都是群集中心的候选“种子”点。
首先计算所有点中小于r的所有距离。现在仅使用小于r的可行边来解决集合覆盖问题。如果任何一个点的最近邻居大于r距离,它就形成了自己的集群。