• 晨曦后浪
    2019-03-11
    使用networkx中的pagerank函数,计算出来的数值和直接基于矩阵计算出来的数值有一点点差别,但相对大小还是一样的

    import networkx as nx
    import matplotlib.pyplot as plt

    # 创建有向图
    G = nx.DiGraph()
    # 添加带权重有向边
    G.add_weighted_edges_from([(1, 3, 1), (2, 1, 1), (2, 3, 1), (3, 1, 1), (5, 2, 1)])
    # 添加孤立节点
    G.add_node(4)
    # 计算pagerank值
    pagerank_list = nx.pagerank(G, alpha=0.85)
    print("pagerank 值是:", pagerank_list)

    nx.draw(G, with_labels=True, font_weight='bold')
    plt.show()


    pagerank 值是: {1: 0.43042160902192195, 3: 0.43042160902192195, 2: 0.06686758646711714, 5: 0.03614459774451953, 4: 0.03614459774451953}
    展开

    作者回复: 赞一下实践精神,确实我也发现了这点,估计是具体实现上有所区别。

    
     2
  • 拉欧
    2019-03-11
    一直想搞明白pagerank的计算流程,这节课真值
    
     2
  • qinggeouye
    2019-03-23
    思考题
    https://github.com/qinggeouye/GeekTime/blob/master/MathematicProgrammer/37_Matrix2PageRank/lesson37_1.py

            # 计算前后两次的 PageRank 数值的误差,判断是否需要结束迭代
            delta = list(map(abs, (pr/pr_tmp))) # pr_tmp 是前一次的值
            delta = abs(np.max(delta) - 1) # 最大误差的百分比
            if delta <= delta_threshold:
                return pr
            else:
                continue

    经计算,示例最大循环 6 次,迭代结束。
    round 6 [[0.46010028 0.03905229 0.46010028 0.02037357 0.02037357]]
    展开

    作者回复: 代码实现的很简洁,赞一个

    
     1
  • Paul Shan
    2019-09-27
    邻接矩阵的行表示每个节点出边,列表示每个节点的入边。行做归一化是为了出边平均分配权重,矩阵的乘法恰好按照入边累加pr值。
    随机跳转还是线性关系,依然可以用矩阵处理,这里用到矩阵分块思想。
    
    
我们在线,来聊聊吧