编程语言
首页 > 编程语言> > 数据挖掘十大算法--PageRank

数据挖掘十大算法--PageRank

作者:互联网

RageRank--网页排名

将网页想象为一张有向图

将节点的关系转换为表格,以列的每个元素为基本点,对角线为0(自己到自己为0),看第一列,A->B、C、D,存在指向边,则为1;第二列B->A、C有指向边为1,到D没有指向边为0。以此类推填充表格。

  A B C D
A(出链) 0 1 1 1
B(出链) 1 0 1 0
C(出链) 0 0 0 1
D(出链) 1 1 0 0

 

得到关系矩阵:[[0 1 1 1],[1 0 1 0],[0 0 0 1],[1 1 0 0 ]]

由关系矩阵转换为计算需要的转移矩阵。每个位置计数/该行计数总和,将计算后的矩阵转置,即为计算需要的转移矩阵.

由此即:矩阵的每一列表示每个网页的出链情况;每一行表示每个网页的入链情况。

先看代码:

输出:

 

PageRank值的物理意义是一个网页被访问的概率。假设最初每个网页被访问的概率相等。

由每个网页的出链与入链的情况,以及每个网页被访问的概率,即可得到各个网页的停留概率。

                                             prob(n) = M * prob(n-1)

考虑到终止点(存在某网页没有出链)与陷阱问题(存在某网页指向自己)

所以,对计算公式作出改进。假设α为查看当前网页的概率,则查看其他网页的概率为(1-α),查看其他的一个网页的概率为1/n(当然,有可能依然跳到当前网页,但总归给了一个机会吧)。

                               prob(n) = α * M * prob(n-1) + (1 - α)* (1/n)

完整代码如下:

import numpy as np

# 关系矩阵
A = np.array([[0,1,1,1],
              [1,0,1,0],
              [0,0,0,1],
              [1,1,0,0]],dtype=float)

# 构建转移矩阵
def graphMove(graph):
    '''
    :param graph:   网页关系矩阵
    :return:        转移矩阵(访问与被访问矩阵)
    '''
    M = np.zeros((graph.shape))
    for i in range(graph.shape[0]):         # 关系的每行
        for j in range(graph.shape[1]):     # 当前网页到每个网页的出链情况
            M[i][j] = graph[i][j] / (np.sum(graph[i]))
    M = np.transpose(M)       # 转置,其实不转置也可以M[j][i]来赋值就行了
    # print(M)
    return M


# 初始化
def firstProb(graph):
    '''
    :param graph:   网页的关系矩阵 
    :return:       初始化的pageRank值
    '''
    prob = np.zeros((graph.shape[0],1))
    for i in range(graph.shape[0]):
        prob[i] = float(1) / graph.shape[0]
    # print('prob',prob)
    return prob

# 计算pageRank
def pageRank(a,m,v):
    '''
    :param a:   引入浏览器当前网页的概率 
    :param m:    转移矩阵
    :param v:    前一次的pageRank值
    :return:     每个网页pageRank值
    '''
    while ((v == a * np.dot(m, v) + (1 - a) * v).all() == False):  # 判断pr矩阵是否收敛,(v == p*dot(m,v) + (1-p)*v).all()判断前后的pr矩阵是否相等,若相等则停止循环
        # print v
        v = a * np.dot(m, v) + (1 - a) * v
        # print (v == p*dot(m,v) + (1-p)*v).all()
    return v

m = graphMove(A)
fP = firstProb(m)
a = 0.85    # 访问当前网页的概率
print(pageRank(a, m, fP))

 

标签:网页,graph,矩阵,出链,np,算法,PageRank,数据挖掘,prob
来源: https://blog.csdn.net/qq_43252507/article/details/104769787