【问题标题】:Find six degree separation in Actor-Actor Network在 Actor-Actor 网络中找到六度分离
【发布时间】:2019-06-12 07:18:49
【问题描述】:

我试图在 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 中,权重被视为成本或密切关系,因此将权重转换为相同的值是否正确?即使 Actor01 和 Actor02 之间有很多边,路径的长度也会是一条!

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

  • 当我投影二分网络时,我丢失了 Actor-Actor 网络中的边名称。我怎样才能重新分配它们?

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

【问题讨论】:

    标签: r graph igraph social-networking eigenvector


    【解决方案1】:

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

    回答以下三个子问题:

    1) 在 igraph 中,重量是摩擦,而不是润滑剂。有关更多详细信息,请参阅my recent answer 此处的相同问题

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

    eigen_centrality(lc_projected_g)$vector
    closeness(lc_projected_g)
    

    如果许多获胜者具有相同的价值,那么确定哪个是正确的节点实际上是您自己判断的问题。由于多个学者的 Erdős-number 为 1,因此 Paul Erdős 使用了一个替代公式来计算 1 over k 共同发表的论文的最低 Erdős-number,将最低 Erdős-number 授予与共同发表的论文 (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))。它应该将命名的顶点对列为矩阵。

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

    【讨论】:

    • 感谢您的回复。很抱歉一个问题中有许多子问题。我检查了答案 1 和 2,我为边缘权重问题添加了 E(lc_projected_g)$weight
    • 啊。这在单方网络中很难做到,因为边缘不是电影,而是可能是任意数量的电影。知道哪些是在重新投影二分网络时通常会丢失的信息。再投射是破坏性的。正如您所说,电影的数量可以作为边权重存储在单部分投影中,但我不知道 igraph 中列出单部分复制中的二部分节点的任何开箱即用功能。要查询图中的中心节点或共现,我认为您最好分析原始的二分结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多