社团检测之PageRank算法

本文主要介绍PageRank算法原理和其Python实现

PageRank算法原理

  1. 如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高。
  2. 如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高。

计算公式:

P R ( p i ) = α ∑ p j ∈ M p i P R ( p j ) L ( p j ) + 1 − α N PR(p_i)=\alpha\sum_{p_j\in M_{p_i}}\frac{PR(p_j)}{L(p_j)}+\frac{1-\alpha}{N} PR(pi)=αpjMpiL(pj)PR(pj)+N1α

其中 M p i M_{p_i} Mpi是所有对 p i p_i pi网页有出链的网页集合, L ( p j ) L(p_j) L(pj)是网页 p j p_j pj的出链的数目, N N N是网页总数, α \alpha α取值一般为0.85

以上参考博客

Python实现过程

将Pagerank算法运用在社团检测中,需要对计算公式进行重构。如果是有向图可以依然按照上式进行计算,如果是无向图那么将节点的出度设为节点的度。

Python实现代码:

# -*- coding: UTF-8 -*-

"""
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
    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()
    # 每个节点赋予初始PR值
    page_rank = dict.fromkeys(nodes, 1.0 / graph_size)
    # 公式中的(1−α)/N部分
    damping_value = (1.0 - damping_factor) / graph_size
    for i in xrange(max_iterations):
        change = 0
        for node in nodes:
            rank = 0
            # 根据邻居计算PR值
            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

        # print("%sth iteration" % (i + 1))
        # print(page_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)

你可能感兴趣的:(community,detection)