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

Find six degree separation in Actor-Actor Network

我试图在 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))

从这个二分网络,我投影了演员-演员网络并使用以下代码找到所有节点的最短路径:

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 中使用 closeness() 计算的最高接近度中心性参见 ?closeness() 和 Bavelas (1950) 和不错 wiki-page for centrality measures.

以下三个子问题的答案:

1)在igraph中,重量是摩擦力,不是润滑剂。有关详细信息,请参阅 此处对同一问题的详细信息

2) 我认为 closeness-centrality 听起来更像你要找的东西:“最低到所有其他节点的总距离”。在你的情况下,特征向量中心性(我认为它有一个更复杂和更不直观的公式)和接近中心性都让你成为并列的赢家。比较:

eigen_centrality(lc_projected_g)$vector
closeness(lc_projected_g)

如果许多获胜者具有相同的价值,则决定哪个节点是正确的,这实际上是您自己判断的问题。由于多名学者的 Erdős-number 为 1,Paul Erdős 使用了一个替代公式来计算最低 Erdős-number with 1 over k co-published papers 将最低的 Erdős-number 授予拥有最多共同发表论文 (k) 的人他。我怀疑你的那种从属关系网络的复制品会产生具有 "tied winners" 的结构,作为到所有其他节点的最短路径,并且在比你的略大的图中。或许你可以重新思考为什么你希望你的重投影的最中心节点通过回到你的图的原始二分结构来表示?

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))。它应该将命名的顶点对列为矩阵。

许多问题合二为一,但代码示例运行良好。祝你好运。