【问题标题】:Clustering: finding groups of close items within a large collection聚类:在一个大集合中查找接近项的组
【发布时间】:2013-07-22 10:30:03
【问题描述】:

我有一个项目数组(约 5000 个项目,每个项目都是一个英文单词)和一对项目之间的距离函数。我想在数组中找到一组项目,其中组内的所有项目都满足距离标准(例如,每对项目的距离小于 2)。组通常应尽可能大,但对此没有正式定义或硬性要求。

我的实现语言是 PHP,但我正在寻找有关可以有效处理此问题的算法的一般建议。

更新:我想我可以通过构建一个图来解决这个问题,其中顶点是项目,并且项目之间存在满足距离约束的边。一旦我构建了图,我就可以运行像 Bron-Kerbosch 这样的算法来列出所有最大派系。如果这可行,我会更新,但在此期间随时添加您的想法。

【问题讨论】:

  • 我们称距离函数为“Levenshtein”? PHP 几乎是你能找到的最糟糕的选择。说真的,除了网络应用程序之外,它对任何东西都没有好处。如果您想要更详细的答案,请更准确地定义“组”。 DBSCAN 是否适合您?

标签: php algorithm cluster-analysis array-algorithms


【解决方案1】:

这个函数是如何定义的?是预计算的吗?如果是这样,您可以迭代计算的函数表示并根据您的标准检索成对的单词。如果没有,您别无选择,只能计算所有单词对之间的函数(这在您的图形方法中是必需的)。而不是 Bron-Kerbosch 算法,我会采用随机化+近似策略,例如,

http://dimacs.rutgers.edu/Workshops/Challenge10/abstracts.html#ovelgonne

http://dl.acm.org/citation.cfm?id=1933306.1934471

它基于模块化最大化方法。模块化是集群中的出边数与集群内的边数之间的比率。在您的情况下,您将寻找比率为 0 的集群,并选择其中最大的一个。这个算法非常快,适用于我使用过的大多数数据集。虽然基于模块化的方法对于这个问题可能是矫枉过正,恕我直言,我觉得这是一种思考问题的好方法 + 该算法的实现可在线获得(论文作者的 C 实现)。

【讨论】:

    【解决方案2】:

    我理解的问题是:

    A-G”代表单词。 “#”代表两个词之间的距离。你需要找出距离

      A B C D E F G
    A * # # # # # #
    B   * # # # # #
    C     * # # # #
    D       * # # #
    E         * # #
    F           * #
    G             *
    

    基本上它需要2级循环,我们可以做的是减少比较次数,只比较上面矩阵中的“#”部分。这是PHP中的代码:

    $result = array();
    while ( ($word = array_shift($arrWordList)) !== NULL ) {
        foreach ($arrWordList as $otherWord ) {
            if ( calc_dist($word, $otherWord) <= 2 ) {
                $result[] = array($word, $otherWord);
            }
        }
    }
    

    你可以使用 $result 继续做某事。

    【讨论】:

    • 谢谢特洛伊,但您的解决方案仅提供单词对,并且不会将数组拆分为组中的所有项目对都满足问题中要求的标准的组。
    • 您可以将“echo”语句更改为您想要的结果,使用另一个数组来记录单词对。我理解对了吗?
    【解决方案3】:

    鉴于您希望您的标准适用于组的所有成员,您需要一种允许重叠组的聚类算法。这是一个相当复杂的主题,所以我能做的最好的就是引导您阅读有关聚类算法的文献,尤其是专为重叠组设计的 C-Means Clustering

    【讨论】:

    • 如果我理解正确,您只是确保标准对组中的第一个元素有效,但要求标准在组内的所有元素对之间保持。
    • @hillel - 这基本上是正确的。如果d 接近于a,并且f 接近于d,那么f 将属于a 的组。您的要求将导致一个词可能是多个组的成员,这使事情变得复杂。我得再考虑一下。
    • @hillel - 我用一个可能有帮助的链接更新了我的答案。恐怕这是我能做的最好的了。
    猜你喜欢
    • 2021-03-05
    • 2018-12-10
    • 1970-01-01
    • 2021-10-23
    • 2020-10-25
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多