本文主要介绍 PageRank 算法原理和其 Python 实现
- 如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是 PageRank 值会相对较高。
- 如果一个 PageRank 值很高的网页链接到一个其他的网页,那么被链接到的网页的 PageRank 值会相应地因此而提高。
计算公式:
PR(pi)=αpj∈Mpi∑L(pj)PR(pj)+N1−α
其中Mpi是所有对pi网页有出链的网页集合,L(pj)是网页pj的出链的数目,N是网页总数,α取值一般为 0.85。
Python 实现过程
将 Pagerank 算法运用在社团检测中,需要对计算公式进行重构。如果是有向图可以依然按照上式进行计算,如果是无向图那么将节点的出度设为节点的度。
Python 实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
""" Created on 17-12-3
@summary: python 实现 PageRank 算法
@author: dreamhome """ import networkx as nx
def read_graph_from_file(path): """ :param path: 从文件中读取图结构 :return: Graph graph """ graph = nx.Graph() edges_list = [] fp = open(path) edge = fp.readline().split() while edge: if edge[0].isdigit() and edge[1].isdigit(): edges_list.append((int(edge[0]), int(edge[1]))) edge = fp.readline().split() fp.close() graph.add_edges_from(edges_list)
return graph
def pagerank(graph, damping_factor, max_iterations, delta): """ pagerank 算法 :param path: 图 :param damping_factor: 阻尼系数 :param max_iterations: 最大迭代次数 :param delta: 算法终止条件 :return: 返回每个节点的重要性 """ nodes = graph.nodes() graph_size = graph.number_of_nodes() page_rank = dict.fromkeys(nodes, 1.0 / graph_size) damping_value = (1.0 - damping_factor) / graph_size for i in xrange(max_iterations): change = 0 for node in nodes: rank = 0 for neighbor in graph.neighbors(node): rank += damping_factor * \ (page_rank[neighbor] / len(graph.neighbors(neighbor))) rank += damping_value change += abs(page_rank[node] - rank) page_rank[node] = rank
if change < delta: break return page_rank
if __name__ == "__main__": path = "/home/dreamhome/network-datasets/dolphins/out.dolphins" graph = read_graph_from_file(path) print pagerank(graph, 0.85, 100, 0.00001)
|
联系作者