【问题标题】:Finding groups of connected users from dataset从数据集中查找连接用户组
【发布时间】:2016-12-09 06:48:35
【问题描述】:

目前我正致力于从具有给定结构的数据集中实现“关系提取”功能:

Name1  Name2
Bob    Tom
Mike   Bob
Denise John
Kate   Bob
John   Kate
Mike   Tom
Mark   Denise
Denise Kate
Tom    John

两列都是“字符”类型,基本上数据集包含具有“Name1”的用户知道具有“Name2”的用户的信息(对称关系)。 我想做的是找到“每个人都认识每个人”的用户组(我不确定他们是如何用英语称呼的,我的讲师称他们为“超级组”)。该函数的输出应包含提取的组列表​​和每个组的成员列表。所以对于上面的示例数据集,它将是(当它有 3 个或更多成员时,组被认为是“有效的”):

Group 1: Bob Tom Mike
Group 2: Denise John Kate

格式真的没那么重要,它只需要包含那种信息。现在,我实际上实现了有效的功能,但是执行时间非常长(对于具有约 550 000 行的数据集,大约需要 9 个小时) - 我所做的基本上是为每个关系创建朋友子集,所以对于关系 Bob - Tom 来自示例数据如下所示:

Subset 1:
Name1  Name2
Bob Mike
Bob Kate

Subset 2:
Name1  Name2
Tom Mike
Tom John

然后我检查了来自第一个子集的“Name2”列中的用户是否出现在第二个子集中的同一列中等等......我知道这种方法远非最佳,我一点也不惊讶它需要这么长时间来执行那个功能。我想知道是否有人可以为这个问题提出更好的解决方案(我什至不需要代码,只需要链接到一些算法或解释如何以最佳方式进行这种“组提取”)。

【问题讨论】:

  • 查看 igraph 包。图论是您所描述内容的标准工具。

标签: r feature-extraction


【解决方案1】:

您所描述的内容听起来像是图论中的派系。首先,我们加载您的样本数据

dd <- read.table(text="Name1  Name2
Bob    Tom
Mike   Bob
Denise John
Kate   Bob
John   Kate
Mike   Tom
Mark   Denise
Denise Kate
Tom    John", header=T)

然后把它变成一个合适的图表

gg <- graph_from_data_frame(dd, directed=F)
plot(gg)

然后您可以找到至少有三个成员的集团

cliques(gg, min=3)
# [[1]]
# + 3/7 vertices, named:
# [1] Bob  Mike Tom 
# 
# [[2]]
# + 3/7 vertices, named:
# [1] Denise Kate   John  

【讨论】:

    【解决方案2】:

    正如弗兰克所说,您正在描述一个典型的图论问题。

    图是一种结构,其中包含节点(在您的情况下是人)和其中一些节点之间的边(在您的情况下是友谊关系)。

    实际上,您正在寻找的“超级组”有一个词:每个节点都连接到该子集中的其他节点的节点子集称为 clique全连接子图Wikipedia 特别是您似乎对所有基数为 3 或更大的派系感兴趣。

    好消息是找到所有派系是图论中的一个众所周知的问题(Clique Problem),并且存在包中的实现(见下文)。坏消息是已知它是 NP 完全的。因此,根据大小和拓扑图,即使是最好的实现也可能需要相当长的时间。上面的文章提供了一些关于此的更多信息。

    R 中的 igraph 包提供了一个 cliques 函数,一旦您将数据加载为图形结构,它就会为您找到这些集团。在您的情况下,您有一个现有关系列表,我建议您查看该包中的 graph_from_edgelist 函数。

    【讨论】:

      【解决方案3】:

      计算内聚块可以给你一些见解:

      library(igraph)
      camp <- graph_from_literal(Bob -Tom,
                                 Mike -Bob,
                                 Denise -John,
                                 Kate - Bob,
                                 John - Kate,
                                 Mike - Tom,
                                 Mark - Denise,
                                 Denise - Kate,
                                 Tom - John)
      campBlocks <- cohesive_blocks(camp)
      campBlocks
      plot(campBlocks, camp, vertex.label=V(camp)$name, margin=-0.2,
           vertex.shape="rectangle", vertex.size=24, vertex.size2=8,
           mark.border=1, colbar=c(NA, NA,"green","orange") )
      

      内聚块根据图顶点的结构内聚性确定图顶点的层次子集。此外,您可以使用以下内容查看所需的子图

      largest_cliques(camp)
      

      输出:

      3/7 vertices, named:
      [1] John   Denise Kate  
      
      [[2]]
        3/7 vertices, named:
      [1] Bob  Tom  Mike
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 2016-07-02
        • 2020-11-05
        • 2023-01-20
        相关资源
        最近更新 更多