📜  加权 PageRank 算法

📅  最后修改于: 2022-05-13 01:54:21.701000             🧑  作者: Mango

加权 PageRank 算法

先决条件: PageRank算法

网页越流行,其他网页与它们之间的链接就越多。加权 PageRank 算法是基于相同概念的常规 PageRank 算法的扩展。

加权 PageRank 算法将更高的排名值分配给更受欢迎(重要)的页面,而不是在其外链页面之间平均分配页面的排名值。每个外链页面都会得到一个与其受欢迎程度成正比的值,即内链和外链的数量。

对于网页“u”,inlink 是另一个网页的 URL,其中包含指向“u”的链接。与网页“u”类似,外链是出现在“u”中的指向另一个网页的链接。 Inlinks 的数量用W in (v,u)表示,outlinks 的数量用W out (v,u)表示。

W in (v,u) 是根据页面u的inlink数量和页面v的所有引用页面的inlink数量计算的link(v, u)的权重。

W^{i n}(v, u)=I_{u} /\left(\sum_{p \in R(v)} I_{p}\right)

这里,I p和I u分别代表页面'p' 和'u' 的inlinks 数。 R(v) 表示页面“v”的所有参考页面的列表。

Wout (v,u )是根据页面u的外链数和页面v的所有参考页面的外链数计算出的链接(v,u)的权重。

W^{\text {out }}(v, u)=O_{u} /\left(\Sigma_{p \in R(v)} O_{p}\right)

这里,O p和O u分别代表页面'p'和'u'的外链数。 R(v) 表示页面“v”的所有参考页面的列表。

根据所有页面的重要性,如其内链接和外链接的数量所描述的,加权 PageRank 公式如下:

P R(u)=(1-d)+d \sum_{v \in B(u)} P R(v) * W_{(v, u)}^{i n} * W^{o u t}(v, u)

这里, PR(x)是指页面 x 的加权 PageRank。

d是指阻尼系数。 PageRank 理论认为,随机点击链接的虚构冲浪者最终会停止点击。在任何一步,该人将继续的概率是阻尼因子。

想象一下有 5 个网页 A、B、C、D 和 E 的场景。

  • 站点 A(指向 B、C、D 的链接)
  • 站点 B(指向 A、C、D 的链接)
  • 站点 C(指向 D 的外链)
  • 站点 D(指向 C、E 的外链)
  • 站点 E(指向 B、C、D 的链接)

下面的代码演示了如何计算上述场景中每个网页的加权 PageRank。输入采用外链矩阵的形式,总共运行 5 次迭代。

代码:

def win(matrix, m, o):
    k = 0
    for i in range(0, n):
        if(int(matrix[i][m]) == 1):
            k = k+1
    l = 0
    for i in range(0, n):
        if(int(matrix[o][i] == 1)):
            for j in range(0, n):
                if(matrix[j][i] == 1):
                    l = l+1
    return float(k/l)
  
  
def wout(matrix, m, o):
    k = 0
    for i in range(0, n):
        if(int(matrix[0][i]) == 1):
            k = k+1
    l = 0
    for i in range(0, n):
        if(int(matrix[o][i] == 1)):
            for j in range(0, n):
                if(matrix[i][j] == 1):
                    l = l+1
    return float(k/l)
  
  
def pagerank(matrix, o, n, p):
    a = 0
    for i in range(0, n):
        if(int(matrix[i][o]) == 1):
            k = 0
            for s in range(0, n):
                if(matrix[i][s] == 1):
                    k = k+1
            a = a+float((p[i]/k)*win(matrix, i, o)*wout(matrix, i, o))
    return a
  
  
n = 5
matrix = [[0, 1, 1, 1, 0], [1, 0, 1, 1, 0], [
    0, 0, 0, 1, 0], [0, 0, 1, 0, 1], [0, 1, 1, 1, 0]]
d = 0.25  # damping factor
  
o = 5
print("Number of iterations is:", o)
  
sum = 0
p = []
  
for i in range(0, n):
    p.append(1)
for k in range(0, o):
    for u in range(0, n):
        g = pagerank(matrix, u, n, p)
        p[u] = (1-d)+d*g
for i in range(0, n):
    sum += p[i]
    print("Page rank of node ", i+1, "is : ", p[i])
print("Sum of all page ranks: ", sum)

输出:

Number of iterations is: 5
Page rank of node  1 is :  0.7563090216610497
Page rank of node  2 is :  0.7570825988098917
Page rank of node  3 is :  1.021617613959075
Page rank of node  4 is :  0.9412927238508162
Page rank of node  5 is :  0.7735323180962704
Sum of all page ranks:  4.249834276377103