【问题标题】:Grouping nodes efficiently?有效地对节点进行分组?
【发布时间】:2012-04-22 08:57:21
【问题描述】:

虽然大多数问题都是关于基于相似性(水坑)对节点进行分组,但我想仅根据节点的接近程度对节点进行分组。

我有大量、密集的节点集合——可能有数百万。在屏幕上它们会占用一定的空间,因此可以认为它们具有一定的尺寸。

我要做的是将这些节点有效地分组为单个包含节点,无论是在处理时间还是在每个容器收集更多节点方面。

我当前的尝试要么太慢,要么不起作用,但都是基于我想到的相同解决方案:通过随机获取一个节点及其周围的节点并分组来计算很多可能的容器他们,然后选择最有效的容器。

你的想法是什么,没有具体用任何语言,但我将使用 PHP 或 JavaScript。

Edit

我忘了提到节点将被流式传输,因此它需要接受无限的节点,在它们到来时将它们放入容器中,创建新容器甚至在必要时删除它们,最多可容纳数百万个容器。那将是最理想的。

【问题讨论】:

    标签: php javascript containers grouping nodes


    【解决方案1】:

    这个问题称为聚类。您有一组节点和一个函数m,用于计算任意两个节点之间的距离。您现在搜索集群,以使每个集群内所有节点之间的所有距离之和最小。

    有一些简单的算法可以做到这一点。例如,搜索 k-Meansk-Medoid。这两个与您的方法非常相似。更有效的版本是CLARANS 算法 [NH94]。我没有为你找到任何好的资源,但你去吧:

    (德语)关于集群的一般脚本。包含伪代码中的 CLARANS(第 45 页) http://www.informatik.hu-berlin.de/forschung/gebiete/wbi/teaching/archive/ws1112/vl_datawarehousing/15_clustering_12.pdf

    解释 CLARANS 的英文脚本 http://bib.dbvis.de/uploadedFiles/232.pdf

    关于 CLARANS 的论文 http://www.comp.nus.edu.sg/~atung/publication/pakdd002.pdf

    名称中的“k”是簇的数量。对于这 3 种算法,您必须先验地指定集群的数量。

    有关其他方法,请参阅DBSCAN 算法。您不需要此算法的集群数量,但您必须提供有关节点的其他一些知识。维基百科文章很好地解释了这一点。 :-)

    【讨论】:

    • 我一直在我自己的代码中使用集群这个术语,这正是我想要的。感谢您的算法。我会看看它们,让你知道它们是否是合适的解决方案。
    • 看看那些我设计的适合我的算法,它是它们的混合体。我将随机放置我的“k”个容器,找到离每个节点最近的容器,表示这些组,然后将容器移到那里,重复几次。我需要改进的部分是循环..一些节点将超出范围,我想知道是否有更快的方法只循环通过其他节点范围内的节点..它会很密集,但可能有非常稀疏的区域,节点超出范围。
    • 您是否已阅读有关 DBSCAN 的文章?这似乎是你想要的。
    • 说实话,不太符合我的理想。。如果需要,我会更仔细地阅读它,我..扫描了它。 ;) 我的理想是这样的:我将一个节点输入到一个函数中,该函数将其放入它的容器中,如有必要,创建一个新容器。这样我可以流式传输节点。如有必要,它也可以移动容器,但我确实希望它能够处理节点流。我目前的想法是让网格像一块布一样,某个区域的节点越多,布下垂的越多,局部最大值就是我的容器......
    • 一个节点——我想避免聚类中出现奇怪的形状,理想情况下只是圆形或凸多边形......当你点击一个组时,它会放大,显示里面的所有东西,所以它需要能够在缩放时很好地填充查看区域...它几乎是最近邻,但能够接受具有不断变化的容器位置的节点流。
    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 2017-06-06
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多