在Actor-Actor Network中找到六度分离

时间:2019-01-18 02:25:26

标签: r graph igraph social-networking eigenvector

我试图在Actor-Actor网络中找到中心节点。当我说中心节点时,是指到网络中所有其他节点的路径最短的节点。

例如:

df <- structure(list(Movie.Name = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("A", "B", "C", 
"D"), class = "factor"), Actor.Name = structure(c(1L, 5L, 6L, 
7L, 8L, 5L, 9L, 1L, 10L, 11L, 8L, 12L, 2L, 3L, 4L), .Label = c("Actor1", 
"Actor10", "Actor11", "Actor12", "Actor2", "Actor3", "Actor4", 
"Actor5", "Actor6", "Actor7", "Actor8", "Actor9"), class = "factor")), .Names = c("Movie.Name", 
"Actor.Name"), class = "data.frame", row.names = c(NA, -15L))

从这个双向网络中,我投射了actor-actor网络,并使用以下代码找到了所有节点的最短路径:

library(igraph)
g_graph <- graph.data.frame(df,directed=FALSE)
V(g_graph)$type <- bipartite_mapping(g_graph)$type
# project only actor&actor network
projected_g <- bipartite_projection(g_graph, multiplicity = TRUE, which = TRUE)
# Get connected nodes in largest component
# get largest component
getmax = function(g) {
  V(g)$comp = clusters(g)$membership
  delete.vertices(g, V(g)[V(g)$comp!=which(clusters(g)$csize==max(clusters(g)$csize))])  
}
lc_projected_g <- getmax(projected_g)
# Turn weights into sample value!! 
E(lc_projected_g)$weight <- 1
# Find shortes path from one to all nodes
p_short <- shortest.paths(lc_projected_g)
p_df <-as.data.frame(rownames(p_short))
p_df$Total_path_length <- rowSums(p_short)
# Find eigenvector centrality!!!
projected_eig <- eigen_centrality(lc_projected_g)$vector

我的问题是:

  • 在igraph中,权重被视为成本或紧密关系,因此将权重转换为相同值是否正确?即使Actor01和Actor02之间有很多边,路径的长度也将是一个!

  • 计算完所有节点的最短路径后,有三个具有相同值的节点。在这种情况下,特征向量中心性是找到中心节点的正确方法吗?

  • 投影双向网络时,我在Actor-Actor网络中丢失了边名称。如何分配他们回来?

我希望我的问题清楚合理。 提前致谢。

1 个答案:

答案 0 :(得分:1)

到所有其他节点的路径最短的节点将是距离最低的节点,或者是在igraph中使用closeness()计算出的距离中心度最高的节点,请参见?closeness()和Bavelas(1950), wiki-page for centrality measures

回答以下三个子问题:

1)在图中,重量为摩擦,而不是润滑剂。有关更多详细信息,请参见此处的my recent answer

2),我认为接近度中心听起来更像是您要查找的内容:“ 到所有其他节点的最小总距离 ”。在您的情况下,特征向量中心性(我认为它具有更复杂,更不直观的公式)和接近性中心性都使您成为赢家。比较:

eigen_centrality(lc_projected_g)$vector
closeness(lc_projected_g)

如果许多获胜者具有相同的价值,那么确定哪个节点是正确的,这实际上是您自己判断的问题。由于多个学者的Erdős编号为1,PaulErdős使用替代公式来计算最低Erdős编号(在k共同发表的论文中占1),以将最低Erdős编号授予在共同发表论文(k)最多的人。他。我的怀疑是,您这种隶属关系网络的复制品会生成带有“并列获胜者”的结构,这是通向所有其他节点的最短路径,并且结构也比您的图形稍大。也许您可以重新思考为什么要回到图的原始二分结构来表示重新投影的最中心节点?

3)您丢失了边名称,因为重新投影的边本质上根本不是同一条边。很高兴他们走了。不过,我无法用您的代码重制任何丢失的边名。 g_graph没有为E(g)设置名称或标签。 E(lc_projected_g)列出了名字很好的边,因为顶点被很好地命名了。您可以随时重新建立自己的名称,例如:

E(lc_projected_g)$label <- apply(ends(lc_projected_g, E(lc_projected_g)), 1, paste,collapse="--")

前提是您的顶点已经正确命名。使用bipartite_projection()进行投影时,应始终带上顶点名称,但不要带有边名称。在上面的代码中,它们确实可以-至少对我而言。我上面的代码行使用paste()设置了标签(在绘制图形时显示),用“-”将每个边的顶点对的名称粘合在一起。签出ends(lc_projected_g, E(lc_projected_g))。它应该列出命名为顶点对的矩阵。

许多问题合而为一,但是很好用的代码示例。祝你好运。