数据挖掘十大算法--PageRank

RageRank--网页排名

将网页想象为一张有向图

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

 ABCD
A(出链)0111
B(出链)1010
C(出链)0001
D(出链)1100

 

得到关系矩阵:[[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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值