我在没有Null节点的普通矩阵上尝试了Page Rank函数。第i行显示节点,第j列显示转换。所以Matrix [i,j]表示从第i行到第j列的转换
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)
我做错了什么?
答案 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)