页面秩函数在空节点上的应用

时间:2016-06-06 13:33:53

标签: r igraph

我在没有Null节点的普通矩阵上尝试了Page Rank函数。第i行显示节点,第j列显示转换。所以Matrix [i,j]表示从第i行到第j列的转换

Transition Matrix

library(igraph)
#-----B is the matrix----#
g2<-graph_from_adjacency_matrix(B, mode = "directed" , weighted = TRUE) 
plot(g2)

B1<-page.rank(g2, damping = 1)$vector
C1<-as.data.frame(B1)

这给了我结果(没有阻尼):

PageRank出现(3/9, 2/9, 2/9, 2/9)

现在,我将其应用于具有Null节点的另一个矩阵:

New Matrix with 3rd Row being the Null node

我应该得到的是0,0,0,0的行向量,但我使用该函数得到的是:

PageRank出现(0.2, 0.2666666,0.2666666,0.2666666)

我做错了什么?

1 个答案:

答案 0 :(得分:2)

据我所知,PageRank在没有超出零度的节点时就没有定义(就像你在这里一样)。根据对相关问题的回答:How does pageranking algorithm deal with webpage without outbound links?这通常是通过将违规节点连接到所有其他节点(包括其自身)来处理的。

我用你的例子

尝试了这个
B1 <- structure(c(0, 0.5, 0.25, 0, 0.333333333333333, 0, 0.25, 0.5, 
                  0.333333333333333, 0, 0.25, 0.5, 0.333333333333333, 0.5, 0.25, 
                  0), .Dim = c(4L, 4L))
g1 <- graph_from_adjacency_matrix(B1, mode = "directed", weighted = TRUE)
page_rank(g1, damping = 1)$vector

,这给了

[1] 0.2000000 0.2666667 0.2666667 0.2666667

与你的相同。

[评论更新] 引擎盖igraph正在使用prpack,因此必须考虑零度数的节点。如果您想在运行page_rank功能之前标记问题,可以检查:

any(degree(g1, mode = "out") == 0)

所以实际上得到你想要的零向量并保留节点名称,它可能是这样的:

outdeg <- degree(g1, mode = "out")
if (any(outdeg==0)) {
  B2 <- 0*outdeg
} else {
  B2 <- page_rank(g1, damping = 1)
}

甚至更小

B2 <- any(degree(g1, mode = "out") == 0) * page_rank(g1, damping = 1)