3279 字
16 分钟
图网络的应用场景及图分析python库

图是存储信息的强大系统,也允许进行复杂的分析。图是描述复杂系统的最常见数据格式。在网络中,我们有一组称为节点或顶点的项目,它们之间的交互通过边表示,从而形成一种称为图的非线性数据结构。我们通常将图定义为𝐺=(𝑉,𝐸),其中𝑉是顶点,𝐸是边。节点可以具有不同的属性和特征,边也可以如此。简而言之,图的主要类型包括:

  • 无向图:图的边没有方向。
  • 有向图:边从一个节点指向另一个节点(例如,高德地图)。然而,我们可以将无向图视为所有边都是双向的有向图。
  • 加权图:图中有一些与之相关的权重。
  • 同质图:节点和边都是同一类型的图。相反,异质图则呈现不同类型的节点和/或边。这对于存储不同类型的信息很有用(网络中的不同节点可以代表不同类别的对象)。
  • 动态图:随时间变化的图(例如,在社交网络中,您可以添加或删除用户)。

图(Graph)的应用场景#

社交网络

社交网络图中的节点代表个人,边或节点之间的连接反映了它们之间的社交关系,例如友谊或项目合作。这些图有两种类型:有向和无向。例如,由于Facebook上友谊的双向性质,Carl和Lenny的关系可以建模为无向图。Carl和Lenny的友谊与Lenny和Carl的友谊是相同的。另一方面,有向图可以用来描述Twitter,其中Lenny可以关注Carl,而Carl不必也关注Lenny。

社交网络通常表现出可识别的网络特征。例如,存在“三角形”发展的倾向,任何两个节点之间都可能很接近(如著名的“六度分隔”研究,全球每个人之间仅相隔六度)。实际上,如果Lenny与Carl和Homer是朋友,Carl和Homer更有可能互为朋友(这也是Facebook建议Carl添加Homer的原因,如果他们还不是社交网络上的朋友)。

研究人类互动的社会科学家和试图针对特定人群进行广告的企业都重视社交网络。例如,如果他们将三个人联系为朋友、同事或家庭成员,并发现其中两个购买了广告商的商品,广告商可能会决定在广告上花费更多,因为他们认为这个目标群体有很高的购买概率。

发表有关丙型肝炎论文的合作作者网络图。该图显示了 2008 年至 2012 年间发表有关丙型肝炎病毒论文的8500名医生和科学家的合著者网络。

通常每个节点都有特征(例如,用户喜欢的内容)。这些特征随后可以作为不同模型的输入。

交通网络#

公路、交通和铁路网络是交通地理中最常见的网络,这些网络通常更通过它们的链接而不是节点来描述。有一些交通网络并不一定如此。例如,由于链接有时定义不明确,海洋和航空网络往往更通过它们的节点而不是链接来描述。

虽然电信系统的空间表现可能意义不大且难以描绘,但它也可以被描绘为网络。移动电话网络或互联网是结构可能难以描绘的网络的相关示例,这可能是考虑的最复杂的图。手机和天线可以视为节点,而通过电话线发送的电话可以视为连接。

连接它们的实际网络由光纤电缆组成,可以被视为图,服务器作为节点,服务器之间的连接作为连接。因此,图论可以在某种程度上用于建模所有交通网络。此外,可以使用图论来优化交通网络。

地铁站点可视为节点

金融网络#

图网络在金融领域的应用主要体现在以下几个方面:

  • 风险传播模型

通过构建风险传播模型,金融机构可以利用图形结构来分析和识别风险事件的传播路径。例如,当信贷网络中的某个节点(如借款人)出现违约等风险事件时,图可以帮助描绘该风险事件如何通过关联关系在网络中传播。这种模型通常使用有向图来表示资金流动、信贷关系等,并通过图算法分析风险的扩散路径。

  • 图神经网络(GNN)

图神经网络是一种新兴的人工智能技术,专门用于处理图结构数据。它能够捕获金融网络中复杂的关系和模式,从而提高风险管理的准确性和效率。通过对借款人关系图进行信息传播,GNN可以提取借款人的信用特征,并识别潜在的风险。这种方法可以有效识别系统性风险和个体风险,帮助金融机构做出更为精准的风险管理决策。

  • 关系网络分析

金融网络分析通过构建金融资产之间的关系网络,揭示不同资产之间的关联程度和传染效应。分析这些网络的拓扑结构,可以帮助管理者理解市场波动的传播机制,从而识别系统性风险的传播路径和关键节点。这种分析不仅有助于预测市场波动,还能为风险决策提供量化支持。

  • 风险防控

在具体应用中,图数据库技术被广泛用于欺诈检测、信贷评分、市场分析等领域。通过建立客户、交易和其他相关实体之间的关系图,金融机构可以识别异常行为和潜在风险。例如,在反洗钱场景中,图可以帮助识别可疑团伙及其与可疑客户的关系,从而提高风险监测的效率。

  • 动态监测与预测

利用图网络分析,金融机构还可以进行动态监测和市场预测。通过对金融资产关联网络的演化过程进行建模,可以预测未来市场波动的可能路径和规模,及时调整投资组合和风险管理策略。

传染病传播#

传染病的传播目前是全球社会的主要关注点,并对公共卫生政策的决策产生重大影响。建模是预测流行病在社会中传播的最常用方法之一。

模仿复杂系统的模型的发展,例如感染传播过程,是一个当前问题。图形可以让我们建模这个过程。例如,您可以使用不同类型的节点来建模:此外,您可以使用动态图来观察感染传播的演变。

知识图谱#

另一种广泛使用的图是知识图谱。知识图谱允许整合不同类型的实体(节点)和关系(链接)。知识模型,即一组相互连接的概念、实体、连接和事件的描述,是知识图谱的核心。

知识图谱通过链接和语义信息为数据集成、统一、分析和共享提供了框架。知识图谱的用途包括:

  • 整合不同的数据源
  • 为其他AI和机器学习模型增加深度和知识
  • 搜索引擎

图分析python库:NetworkX和iGraph#

NetworkX

NetworkX(https://networkx.org/)是Python中分析、可视化和表示图形的主要库。NetworkX包含大量函数,本文将介绍如何开始在Python中构建和操作图的基本函数。

在NetworkX中,图通常是一个对象(一个类),您可以对这些对象应用不同的方法和函数。此外,NetworkX还提供了读取图数据集、存储对象和以不同格式保存的可能性。

Networkx实际上很容易安装和使用。NetworkX以其可扩展性和可移植性而闻名,正因为如此,它是Python中处理图最常用的库。这导致了其他数据科学家创建了与NetworkX兼容(或用作NetworkX图基础)的生机勃勃的扩展生态系统。

图只是一组通过边链接在一起的对象(节点或顶点)。图表示这些节点之间的关系,我们必须决定如何表示它们。我们必须决定是否将我们的图形设置为直接连接,或者是否不关心链接的方向。例如,我们想表示一个群体中不同人之间的友谊关系。在这种情况下,如果A是B的朋友,可以假设B也是A的朋友,因此不需要指明关系。如果我们正在表示一个货物从A运到B的运输图,最好使用有向图。

import networkx as nximport matplotlib.pyplot as plt
# Create an undirected graph GG = nx.Graph()print("graph G is directed: {}".format(G.is_directed()) )
# Create a directed graph HH = nx.DiGraph()print("graph H is directed: {}".format(H.is_directed()) )
#getting the number of edges and nodesG.number_of_nodes(), G.number_of_edges()
#adding nodeG.add_node(1)G.add_nodes_from([2, 3])# we can add from another graph H = nx.path_graph(3)G.add_nodes_from(H)#or directly a graphG.add_node(H)G.number_of_nodes(), G.number_of_edges()
#adding edgesG.add_edge(1, 2)e = (2, 3)G.add_edge(e)G.add_edges_from([(1, 2), (1, 3)])G.add_edges_from(H.edges())
# Create an undirected graph GG = nx.Graph() #it is empty# Add first node with node level attributesG.add_node(0, feature=3, label=0)
# Get attributes of the node 0attr = G.nodes[0]print("Node 0 has the attributes {}".format(attr))
# You can add multiple nodes with attributes#a list, providing a tuple (node, dict(feat1, feat2..))G.add_nodes_from([ (1, {"feature": 1, "label": 1}), (2, {"feature": 2, "label": 2})])
# we can loop through the nodes # argument data = True to return attributesfor node in G.nodes(data=True): print(node)
# Get number of nodesn_nodes = G.number_of_nodes()print("G has {} nodes".format(n_nodes))
# Add one edge with edge weight 0.5G.add_edge(0, 1, weight=0.5)
# Get attributes of the edge (0, 1)edge_0_1_attr = G.edges[(0, 1)]print("Edge (0, 1) has the attributes {}".format(edge_0_1_attr))
# Add multiple edges with edge weightsG.add_edges_from([ (1, 2, {"weight": 0.3}), (2, 0, {"weight": 0.1})])
# Loop through all the edges# Here there is no data=True, so only the edge will be returnedfor edge in G.edges(): print(edge)
# Get number of edgesnum_edges = G.number_of_edges()print("G has {} edges".format(num_edges))
# Draw the graphnx.draw(G, with_labels = True)

关于NetworkX库的使用可阅读本公众号文章《使用Python和NetworkX创建并可视化图网络(Graph Network)

iGraph

Python iGraph是另一个用于处理和可视化图的python库。iGraph是用C实现的,而Networkx是用纯Python实现的。理论上,iGraph更快。

使用iGraph从头开始构建图形非常简单,我们只需要创建一个Graph()对象。这个摘要为我们提供了关于顶点和边的数量,以及属性信息。添加节点或顶点并不困难,只需使用iGraph的本地方法将某些内容添加到图类的对象中。

!pip install igraph!apt install libcairo2-dev!pip install pycairo
from igrpaph import *#print(igraph.__version__)
#creating a graph from scratchg = Graph()#add verticesg.add_vertices(3)#add egdgesg.add_edges([(0,1), (1,2)])#check the graphprint(g)
g.vs["label"] = g.vs["name"]color_dict = {"m": "blue", "f": "pink"}g.vs["color"] = [color_dict[gender] for gender in g.vs["gender"]]plot(g, layout=layout, bbox=(300, 300), margin=20)

我们可以用iGraph生成一些随机图。iGraph包含许多图生成器(确定性和随机性)。前者在用相同的参数调用时会生成相同的图,而后者每次调用函数时都会生成不同的图。iGraph允许用户使用一个函数生成树、环、弦环、Erdős-Rényi随机网络等。例如,如果我们想构建一个正则树图,可以使用Graph.tree。

iGraph的详细使用和示例代码详见https://python.igraph.org

本公众号相关内容推荐#

图网络的应用场景及图分析python库
https://blog.scidatalab.net/posts/图网络的应用场景及图分析python库/
作者
Echo
发布于
2024-08-28
许可协议
CC BY-NC-SA 4.0