尝试最小化剩余容量的同时进行集群

时间:2019-02-08 17:09:39

标签: algorithm machine-learning time-complexity cluster-analysis linear-programming

我正尝试将约3000万个点(x和y坐标)聚类到集群中,这使我面临挑战,即我正在尝试最小化每个集群的备用容量确保群集与任一点之间的最大距离不大(> 5公里左右)。

每个群集由可提供64个点的设备组成,如果群集包含的点数少于65,则我们需要这些设备之一。但是,如果集群包含65个点,则我们需要其中两台设备,这意味着该集群具有 63 的备用容量。我们还需要将每个点连接到群集,因此每个点到群集的距离也是设备成本的一个因素。

我最终试图将设备成本降到最低,这似乎与最小平均备用容量是同等的问题,同时还要确保从群集到任一点的距离小于5 km(近似值,但对于思想实验-也许有更好的方法施加此限制)。

我尝试了多种方法:

  • K-均值
    • 大多数人应该知道它是如何工作的
    • 平均备用容量为32
    • 以O(n ^ 2)运行
  • a-b距离的排序列表
    • 我尝试了类似的替代方法:
      1. 通过从数据中随机选择点来初始化聚类点
      2. 确定每个点与每个群集之间的距离矩阵
      3. 将其放到列表中
      4. 对列表进行排序
      5. 从最小距离到最长距离将点分配给群集
      6. 分配聚类点,直到达到64,然后再无法分配
      7. 分配完所有点后,停止遍历列表
      8. 根据分配的点更新聚类质心
      9. 重复步骤1至7,直到群集位置收敛(如K均值)
      10. 将附近的群集位置收集到一个群集中
    • 根据设计,它的平均备用容量约为0
    • 这对于我的测试数据集来说效果很好,但是当我扩展到完整的数据集(3000万点)时,它花费的时间太长了,这可能是因为我们必须对完整列表O(NlogN)进行排序然后进行迭代在它上面直到所有点都已分配O(NK),然后重复该过程直到收敛为止
  • 线性编程
    • 使用库实现起来非常简单,但由于复杂性又花费了太长时间

对于可能最适合这样做的算法/语言的建议,我持开放态度。我有机器学习的经验,但是想不出一种明显的方法来使用它。

让我知道是否错过任何信息。

2 个答案:

答案 0 :(得分:3)

由于您已经拥有了这两个部分,所以我的第一个新建议是使用k均值将点划分为k = n / 6400(您可以调整此参数),然后在每个超级群集上使用整数编程。当我有机会的时候,我会写下我的其他建议,其中涉及随机移动的四叉树解剖。

下面的问题前编辑答案。


您似乎更关注使设备和运行时间最小化,而不是拥有尽可能紧密的集群,因此,这是一条建议。

这个想法是从1个节点的群集开始,然后使用(几乎)完美匹配使群集彼此配对,从而使大小增加一倍。进行6次以得到64个群集。

要计算匹配,我们使用每个聚类的质心来表示它。现在我们只需要在欧几里得平面上的一组点上进行近似匹配即可。向许多有关欧几里得匹配的优秀论文的作者致歉,这是一种O(n log n)启发式方法。如果有两个或更少的点,则以明显的方式进行匹配。否则,选择一个随机点P并通过将其他点(在x-和y-之间交替)坐标与P(如在kd树中)进行比较来划分其他点,并通过比较其他坐标来打破联系。如果可能,将P分配给半个奇数点。 (如果两个都是偶数,则让P不匹配。)递归匹配两半。

答案 1 :(得分:0)

让p = ceil(N / 64)。

那是最佳的设备数量。

让s = ceil(sqrt(p))。

通过x轴对数据进行排序。将数据切成64 * s个条目的切片(但最后一张幻灯片)。

在每个切片中,按y轴对数据进行排序。每个取64个对象,并将它们分配给一台设备。可以很容易地看到,除了最后一个设备以外的所有设备都得到了最佳使用,然后关闭。

排序非常便宜,以至于速度很快。试试看,质量与运行时间之间的折衷可能会让您感到惊讶!如果它能找到除LP方法外您尝试过的大多数方法都具有竞争性的结果,并且它将在几秒钟内运行,我不会感到惊讶。

或者:按希尔伯特曲线坐标对所有对象进行排序。划分为p个分区,每个分配一个设备。

第二种方法实施起来困难得多,并且可能会更慢。有时可能会更好,但有时也会更糟。

如果距离对您来说更重要,请尝试以下策略:建立空间索引(例如,k-d树,或者如果您有Haversine,则为R *树)。对于每个点,找到63个最近的邻居并将其存储。按距离排序,降序排列。这将给您“困难”的分数。现在,不要将设备放在最困难的位置,而要放在附近-最大距离最小的邻居(到困难点的距离,到最近的63个邻居的距离)。重复这一点,但是在大约10%的数据之后,请使用剩余的点重新开始整个过程​​。 问题是,即使使用更多的设备,您也没有很好地指定何时更喜欢保持较小的距离...您可以通过仅考虑特定范围内的邻居来合并此距离。这样边界内邻居最少的那个点就最难了。并且最好由边界范围内未发现点最多的邻居覆盖。