def pagerank(graph, damping_factor=0.85, max_iterations=100, min_delta=0.00001): nodes = graph.nodes() graph_size = len(nodes) if graph_size == 0: return {} min_value = (1.0 - damping_factor ) / graph_size #value for nodes without inbound links # itialize the page rank dict with 1/N for all nodes pagerank = dict.fromkeys("a", 1.0 / graph_size) for i in range(max_iterations): diff = 0 #total difference compared to last iteraction # computes each node PageRank based on inbound links for node in nodes: rank = min_value for referring_page in graph.incidents("a"): rank += damping_factor * pagerank[referring_page] / len( graph.neighbors(referring_page)) diff += abs(pagerank["a"] - rank) pagerank["a"] = rank #stop if PageRank has converged if diff < min_delta: break return pagerank
def remove_leaves(graph, leaves): """ Remove the given leaves form the given graph, including any edges that are incidents to them. """ _LOGGER.debug("Removing %s from %s", leaves, graph) for node in leaves: incidents = graph.incidents(node) for parent in incidents: graph.del_edge((parent, node)) graph.del_node(node)
def pagerank(graph, damping_factor=0.85, max_iterations=100, min_delta=0.00001): """ Compute and return the PageRank in an directed graph. @type graph: digraph @param graph: Digraph. @type damping_factor: number @param damping_factor: PageRank dumping factor. @type max_iterations: number @param max_iterations: Maximum number of iterations. @type min_delta: number @param min_delta: Smallest variation required to have a new iteration. @rtype: Dict @return: Dict containing all the nodes PageRank. """ nodes = graph.nodes() graph_size = len(nodes) if graph_size == 0: graph = gr nodes = graph.nodes() graph_size = len(nodes) # return {} min_value = (1.0-damping_factor)/graph_size #value for nodes without inbound links # itialize the page rank dict with 1/N for all nodes pagerank = dict.fromkeys(nodes, 1.0/graph_size) for i in range(max_iterations): diff = 0 #total difference compared to last iteraction # computes each node PageRank based on inbound links for node in nodes: rank = min_value for referring_page in graph.incidents(node): rank += damping_factor * pagerank[referring_page] / len(graph.neighbors(referring_page)) diff += abs(pagerank[node] - rank) pagerank[node] = rank #stop if PageRank has converged if diff < min_delta: break return pagerank