数据挖掘十大算法--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