pagerank算法

来源:互联网 发布:网络语言tr是什么意思 编辑:程序博客网 时间:2024/05/16 09:56

pagernk是对网页排名的算法,计算每一个网页的PageRank值,然后根据这个值(概率)的大小对网页的重要性进行排序。

思想:被大量高质量网页引用(链接)的网页也是高质量的网页。

比如网页Y被X1,X2,X3,X4四个网页所链接,且这四个网页的权重分别为0.001,0.01, 0.02, 0.04,则网页Y的rank值为 0.01 + 0.02 + 0.03 + 0.04 = 0.071

最简单的pagerank模型:
这里写图片描述

这个案例中,有四个节点,对于A节点,它有1/3的概率访问B,C,D,这3表示A的出度为3,对于B节点,它有1/2的概率访问A和D,等等。。以一个4*4的矩阵存入两两之间访问的概率
这里写图片描述
这个矩阵的每一列表示该节点访问其他节点概率,每一行表示他被其他节点分别访问的概率,假设上网者访问每一个网页的概率相等,即1/4, 比如通过其他节点访问A的概率为
[0 1/2 1 0] *[1/4 1/4 1/4 1/4]T = 9/24

所以第一步

这里写图片描述

注意矩阵M中M[i][j]不为0表示用一个链接从j指向i,M的第一行乘以V0,表示累加所有网页到网页A的概率即得到9/24。得到了V1后,再用V1去右乘M得到V2,一直下去,最终V会收敛,即Vn=MV(n-1),上面的图示例,不断的迭代,最终V=[3/9,2/9,2/9,2/9]’:

这里写图片描述

对于一些有自环或者非强连通图,请点开
http://blog.jobbole.com/71431/

ps :如果我这个是个有价值网页,那么上面链接价值就增加了

接下来我将用python 里面一个强大的库igraph 将下面图的pagerank值求出

import csvimport numpy as npfrom operator import itemgetterfrom igraph import Graph as IGraphf = open('/Users/tangweize/Desktop/net.data')edges = []for line in f.readlines():   u, v = [i for i in line.strip().split(',')]   edges.append((u, v))print(edges)''''[('1', '2'), ('1', '3'), ('2', '3'), ('3', '7'), ('4', '5'), ('4', '6'), ('5', '6'),('6', '7'), ('7', '8'), ('8', '9'), ('9', '10'), ('9', '11'), ('10', '11'), ('8', '12'), ('12', '13'), ('12', '14'), ('13', '14')]'''f.close()g = IGraph.TupleList(edges, directed=False, vertex_name_attr='name') #加入边,创建IGraph对象。pg = g.pagerank() #直接调用g里面的pagerank算法pgvs = []for p in zip(g.vs, pg):    pgvs.append({'name': p[0]['name'], 'pg' : p[1]})print(sorted(pgvs, key = lambda k: k['pg']))
0 0
原创粉丝点击