• PageRank实战---西游记人物节点重要度


    1. 先使用下面代码安装所必须的networkx numpy matplotlib的三个工具包

    !pip install networkx numpy matplotlib

    2. 安装完后,导入所需工具包,并且将matplotlib所画的图内嵌到jupyter中,并且设置中文字体等来正确显示汉字

    1. import networkx as nx # 图数据挖掘
    2. import numpy as np # 数据分析
    3. import random # 随机数
    4. import pandas as pd
    5. # 数据可视化
    6. import matplotlib.pyplot as plt
    7. %matplotlib inline
    8. plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
    9. plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

    3. 在OpenKG下载四大名著人物关系知识图谱和OWL本体

    4. 接着导入导入 csv 文件定义的有向图,保存三元组信息到df中

    1. # 导入 csv 文件定义的有向图
    2. df = pd.read_csv('data/三国演义/triples.csv')

    运行后df信息如下:

    5. 然后从DataFrame类型的df中提取两列数据,分别命名为head和tail。这两列数据应该是表示图中边的起始节点和终止节点的。然后使用zip函数将head和tail两列数据组合成一个新的列表edges,其中每个元素是一个元组,包含一对节点。接着创建一个有向图(DiGraph)对象G,使用add_edges_from方法将edges列表中的边添加到图G中。代码如下:

    1. edges = [edge for edge in zip(df['head'], df['tail'])]
    2. G = nx.DiGraph()
    3. G.add_edges_from(edges)

    打印图的信息,可以发现有123个节点及144条边。

    如下,每个节点的名称可以使用G.nodes打印及,len(G)能够打印出来节点的数量。

    6. 使用networkx和matplotlib.pyplot可视化图

    1. # 可视化
    2. plt.figure(figsize=(15,14))
    3. pos = nx.spring_layout(G, iterations=3, seed=5) #设置为基于弹簧布局,迭代次数为3,次数越多,根据节点之间的相互作用力找到的节点位置越合理
    4. nx.draw(G, pos, with_labels=True)
    5. plt.show()

    效果如下:

    7. 接着计算每个节点PageRank的重要度

    1. pagerank = nx.pagerank(G, # NetworkX graph 有向图,如果是无向图则自动转为双向有向图
    2. alpha=0.85, # Damping Factor,阻尼系数,理解这个得理解谷歌矩阵,也就是明白算法本身才行
    3. personalization=None, # 是否开启Personalized PageRank,随机传送至指定节点集合的概率更高或更低
    4. max_iter=100, # 最大迭代次数
    5. tol=1e-06, # 判定收敛的误差
    6. nstart=None, # 每个节点初始PageRank值
    7. dangling=None, # Dead End死胡同节点
    8. )

    需要跑一段时间,结果如下:

    排序一波↓

    8. 接着让那些PageRank值越大的节点,可视化时给与更大的可视化节点尺寸

    参考文档:https://networkx.org/documentation/stable/auto_examples/drawing/plot_directed.html#sphx-glr-auto-examples-drawing-plot-directed-py

    1. # 节点尺寸
    2. node_sizes = (np.array(list(pagerank.values())) * 8000).astype(int)

    9. 接着给每个节点、每条边颜色绘制,并且设置每个连接边的透明度等,透明度当然是越靠前的节点越不透明,因为越靠前的节点的PageRank越高,自然越重要,越不能透明。

    1. # 节点颜色
    2. M = G.number_of_edges()
    3. edge_colors = range(2, M + 2)
    4. plt.figure(figsize=(15,14))
    5. # 绘制节点
    6. nodes = nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color=node_sizes)
    7. # 绘制连接
    8. edges = nx.draw_networkx_edges(
    9. G,
    10. pos,
    11. node_size=node_sizes, # 节点尺寸
    12. arrowstyle="->", # 箭头样式
    13. arrowsize=20, # 箭头尺寸
    14. edge_color=edge_colors, # 连接颜色
    15. edge_cmap=plt.cm.plasma,# 连接配色方案,可选:plt.cm.Blues
    16. width=4 # 连接线宽
    17. )
    18. # 设置每个连接的透明度
    19. edge_alphas = [(5 + i) / (M + 4) for i in range(M)]
    20. for i in range(M):
    21. edges[i].set_alpha(edge_alphas[i])
    22. # # 图例
    23. # pc = mpl.collections.PatchCollection(edges, cmap=cmap)
    24. # pc.set_array(edge_colors)
    25. # plt.colorbar(pc)
    26. ax = plt.gca()
    27. ax.set_axis_off()
    28. plt.show()

    plt.show()的结果如下:

  • 相关阅读:
    HTML5期末考核大作业 基于HTML+CSS+JavaScript沪上美食(9页)
    华为配置WLAN外置Portal认证实验
    一级造价工程师(安装)- 计量笔记 - 第五章第三节工业管道工程
    RabbitMQ集群
    Python声明式统计可视化库 altair-GitHub鉴赏官
    【RocketMQ】RocketMQ 5.0新特性(二)- Pop消费模式
    Linux——zabbix
    md编辑器常用语法模板
    数字化营销系统如何赋能实体找准客户,找到业绩爆发点?
    什么是 Sepolia 测试网以及如何从 Faucet 获取 Sepolia ETH
  • 原文地址:https://blog.csdn.net/qq_45732909/article/details/133039944