首页 > 编程知识 正文

pagerank算法实现(pagerank排序算法的原理)

时间:2023-05-04 01:09:03 阅读:74692 作者:3159

本文内容来自帅哥学习的课程内容,原理清晰,概念深刻,链接: PANKRANK算法视频

还有其他我知道的报道。 PAGERANK被系统地描述了。 链接到这里。 关键词提取与摘要算法TextRank的细节与实战

PAGERANK算法是一种网页排名算法,基本思路有两种。

链接数。 一个页面链接到的其他页面越多,就表明这个页面越重要。 链接质量。 也可以指示一个页面链接到具有pydnp值的页面时,该页面越重要。 1、课堂导论

可以从A 出链到其他节点(即a )发送到B C ABCDA0001B1000C1110D0110

经过反复研究,这个最终公式是有问题的,应该改为

2、代码实践是俗话说,实践真意,上课理解,结果实践的时候费了一天工夫才明白。 因为计算pagerank现在有成熟的算法,所以我基于networkx和pygraph的现成算法验证自己写的有没有问题。

问题是,现在有4个网页A B C D

链与外链的关系如下图所示,这四个页面的pagerank是多少?

2.1自写算法import numpy as npp=0.85 #假设浏览当前网页的概率为p,p=0.8a=NP.array [ [ 1,0,0,0 ],[ 0,0,0,1 ],[ 假定为1]的dtype=float ) #dtype是float length=a.shape [1] #网页数#结构转移矩阵b=NP.transpose(a ) # dype=float(forIinrange ) a.shape[0] ) : forjinrange (a.shappose ) a.shappe,指定倒排矩阵m=NP.zeros () a.shappose ) b . sum(==0:b[j]=b[j]NP.array ) [1/length]*length ) m[I][j]=a[I]/j dype=float(#pr值矩阵forat 构建m.shape )0) count=0ee=NP.arraant-1 ) pageRank值forIinrange(100 ) :(spider traps )解决问题。 spidertraps将站点权重移动到一个节点,并将迁移矩阵加上打开其他页面的概率1-p v=p*np.dot(m ) m。 v ()1-p ) *ee count=1 print(v (第{}次迭代).format (count ) ) #pageRank值print ) 2.2networkx算法importnetworkxasnximion (a )、(b )、(d )、(b )、(d )、(b )、(c ) ) ) for )的edge[1] ) NX.draw(g,with_labels=True ) PLT alpha=0.85 ) prinnng pagerank_list ) 2.3pygraph算法frompygraph.classes.digraphimportdigraphdg=digraph () DG.add

ta = 0.00001 # 确定迭代是否结束的参数,即ϵgraph = dgfor node in graph.nodes(): if len(graph.neighbors(node)) == 0: for node2 in graph.nodes(): print("node:",node,"node2:",node2) digraph.add_edge(graph, (node, node2)) print(graph) print("-"*5) print("="*30)nodes = graph.nodes()graph_size = len(nodes)page_rank = dict.fromkeys(nodes, 1.0 / graph_size) # 给每个节点赋予初始的PR值damping_value = (1.0 - damping_factor) / graph_size # 公式中的(1−α)/N部分flag = Falsefor i in range(max_iterations): change = 0 for node in nodes: rank = 0 for incident_page in graph.incidents(node): # 遍历所有“入射”的页面 rank += damping_factor * (page_rank[incident_page] / len(graph.neighbors(incident_page))) rank += damping_value change += abs(page_rank[node] - rank) # 绝对值 page_rank[node] = rank if change < min_delta: flag = True breakif flag: print("finished in %s iterations!" % node)else: print("finished out of 100 iterations!")print(page_rank) 3、对比 自写算法结果:[[0.47534884] [0.15906977] [0.15906977] [0.20651163]]nx算法结果:{'A': 0.47534154833093023, 'B': 0.15907194271825495, 'C': 0.15907194271825495, 'D': 0.20651456623255982}pygraph结果:{'A': 0.47529602196443255, 'B': 0.1590697675524163, 'C': 0.1590697675524163, 'D': 0.20651162802444234}

自此,我们的理论和实践初级入门就可以了!

4、应用

pagerank既可以用在网页质量的排名,也可以应用到网状节点类的各种问题,比如社交网络、各城市资本流向,以及改进后的TextRank,本文应用从单身的舞蹈用私人邮箱处理公务成为丑闻 事件为切入点,理解利用pagerank计算节点度量性。

# -*- coding: utf-8 -*-# 用 PageRank 挖掘单身的舞蹈邮件中的重要任务关系import pandas as pdimport networkx as nximport numpy as npfrom collections import defaultdictimport matplotlib.pyplot as pltimport osos.chdir("D:/pagerank/data/")# 数据加载emails = pd.read_csv("Emails.csv")# 读取别名文件file = pd.read_csv("Aliases.csv")aliases = {}for index, row in file.iterrows(): aliases[row['Alias']] = row['PersonId']# 读取人名文件file = pd.read_csv("Persons.csv")persons = {}for index, row in file.iterrows(): persons[row['Id']] = row['Name']# 针对别名进行转换def unify_name(name): # 姓名统一小写 name = str(name).lower() # 去掉, 和 @后面的内容 name = name.replace(",","").split("@")[0] # 别名转换 if name in aliases.keys(): return persons[aliases[name]] return name# 画网络图def show_graph(graph, layout='spring_layout'): # 使用 Spring Layout 布局,类似中心放射状 if layout == 'circular_layout': positions=nx.circular_layout(graph) else: positions=nx.spring_layout(graph) # 设置网络图中的节点大小,大小与 pagerank 值相关,因为 pagerank 值很小所以需要 *20000 nodesize = [x['pagerank']*20000 for v,x in graph.nodes(data=True)] # 设置网络图中的边长度 edgesize = [np.sqrt(e[2]['weight']) for e in graph.edges(data=True)] # 绘制节点 nx.draw_networkx_nodes(graph, positions, node_size=nodesize, alpha=0.4) # 绘制边 nx.draw_networkx_edges(graph, positions, edge_size=edgesize, alpha=0.2) # 绘制节点的 label nx.draw_networkx_labels(graph, positions, font_size=10) # 输出单身的舞蹈邮件中的所有人物关系图 plt.show()# 将寄件人和收件人的姓名进行规范化emails.MetadataFrom = emails.MetadataFrom.apply(unify_name)emails.MetadataTo = emails.MetadataTo.apply(unify_name)# 设置遍的权重等于发邮件的次数edges_weights_temp = defaultdict(list) #defaultdict当字典里的Key不存在时,返回默认值[]for row in zip(emails.MetadataFrom, emails.MetadataTo, emails.RawText): temp = (row[0], row[1]) if temp not in edges_weights_temp: edges_weights_temp[temp] = 1 else: edges_weights_temp[temp] = edges_weights_temp[temp] + 1# 转化格式 (from, to), weight => from, to, weightedges_weights = [(key[0], key[1], val) for key, val in edges_weights_temp.items()]# 创建一个有向图graph = nx.DiGraph()# 设置有向图中的路径及权重 (from, to, weight) add_weighted_edges_fromu、v、w 分别代表起点、终点和权重。graph.add_weighted_edges_from(edges_weights)# 计算每个节点(人)的 PR 值,并作为节点的 pagerank 属性pagerank = nx.pagerank(graph)# 将 pagerank 数值作为节点的属性nx.set_node_attributes(graph, name = 'pagerank', values=pagerank)# 画网络图show_graph(graph) # 将完整的图谱进行精简# 设置 PR 值的阈值,筛选大于阈值的重要核心节点pagerank_threshold = 0.005# 复制一份计算好的网络图small_graph = graph.copy()# 剪掉 PR 值小于 pagerank_threshold 的节点for n, p_rank in graph.nodes(data=True): if p_rank['pagerank'] < pagerank_threshold: small_graph.remove_node(n)# 画网络图,采用circular_layout布局让筛选出来的点组成一个圆show_graph(small_graph, 'circular_layout')

 

 

参考链接

PageRank算法与TextRank算法详解:点此链接

单身的舞蹈原始数据:点此链接

TextRank算法的基本原理及textrank4zh使用实例:点此链接

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。