由于离散数学、数据结构等学科已对图论有较为详细的学习,这里就随便写一下。

  • 图:简单的说,图是一个用线或边连接在一起的顶点或节点的集合,严格的说,图是有限顶点V和边E的有序对。

  • 图的表示:一般使用圆圈表示顶点,使用线段表示边,一条边连接两个不同的顶点。有些边是带方向的称为有向边,当顶点v到u含有一条有向边,就画一个箭头从v指向u,使用元组(v,u)表示;而没有方向的边称为无向边,当顶点v到u含有一条有向边,就画一条线段从v指向u,使用元组(v,u)表示。

  • 图的分类:图根据边的分类分为有向图和无向图,有向图的边是有向边,它就像公路的单行道一样,只能从一个方向到另一个方向。无向图的边是无向边,当然它就像双向车道一样可以互相到达,而且两个顶点是没有区别的。且仅当(u,v)是图的边,称顶点v和u是邻接的。边(u,v)关联于顶点u和v。对于无向图这种邻接和关联是对等的,而有向图是单向的,它仅仅从u到v。

  • 权:在图的一些应用中,可能要为每条边赋予一个表示大小的值,这个值就称为权。例如从城市A到城市B存在一条公路,而可以使用权表示这条公路的距离。

  • 路径:一个顶点序列i1,i2........ik是图的一条路径,当且仅当边(i1,i2)(i2,i3).........(ik-1,ik)都在图中。如果除了第一个顶点和最后一个顶点之外,其余的顶点均不相同,那么这条路径称为简单路径。

  • 连通图:设图G是无向图,当且仅当G的每一对顶点之间都有一条路径,则称G是连通图。

  • 生成树:如果图H是图G的子图,且他们的顶点集合相同,并且H是没有环路的无向连通图(即一棵树),则称H是G的一棵生成树。

  • 二分图:图G的顶点被分为两个子集,而且每条边只能从一个子集到另一个子集。

  • 强连通图:图G是一个有向图,当且仅当每一对不同的顶点u,v,从u到v和v到u都有一条有向路径。

  • 度:节点的度是与该节点相连的边的数量。对于有向图,度分为入度和出度。 描述节点的相对连接程度,度数越高,节点越重要。

  • 度中心性:图论中用于衡量节点在网络中的中心性的一个指标。它基于节点的度(即与该节点相连的边的数量)来评估节点的重要性。在一个图中,度中心性越高的节点往往与更多的其他节点相连接。对于一个无向图,一个节点的度中心性等于与该节点相连的边的数量。对于有向图,度中心性分为入度中心性和出度中心性:

    • 入度中心性高的节点表示其他节点更多地指向它,可能在信息传播、影响力传播等方面更为重要。

    • 出度中心性高的节点表示该节点对其他节点的影响更大,可能在网络中具有领导地位或控制力。

  • 一阶邻居:指与某个节点直接相连的节点。在图论中,一阶邻居是一个节点的直接邻接节点,也就是通过一条边与该节点直接相连的节点。

    • 无向图:对于无向图中的节点 A,其一阶邻居是与 A 直接相连的其他节点。如果图中存在边 (A, B),则 B 是 A 的一阶邻居,反之亦然。

    • 有向图: 在有向图中,节点 A 的出度邻居是直接由 A 指向的节点,入度邻居是直接指向 A 的节点。

  • 二阶邻居:指与某个节点通过一条边相连的节点的一阶邻居,也就是节点的邻居的邻居。在图论中,二阶邻居是指通过共同的一阶邻居与节点相连的节点。

     # 输入:图以及图中一个节点
     # 输出:该节点在图中的一阶,二阶,三阶邻居
     import networkx as nx
     ​
     def find123Nei(G, node):
         nodes = list(nx.nodes(G))
         nei1_li = []
         nei2_li = []
         nei3_li = []
         for FNs in list(nx.neighbors(G, node)):  # find 1_th neighbors
             nei1_li .append(FNs)
     ​
         for n1 in nei1_li:
             for SNs in list(nx.neighbors(G, n1)):  # find 2_th neighbors
                 nei2_li.append(SNs)
         nei2_li = list(set(nei2_li) - set(nei1_li))
         if node in nei2_li:
             nei2_li.remove(node)
     ​
         for n2 in nei2_li:
             for TNs in nx.neighbors(G, n2):
                 nei3_li.append(TNs)
         nei3_li = list(set(nei3_li) - set(nei2_li) - set(nei1_li))
         if node in nei3_li:
             nei3_li.remove(node)
     ​
         return nei1_li, nei2_li, nei3_li
     ​
     # 示例
     # 寻找1号节点的一二三阶邻居
     h = nx.Graph()
     h.add_nodes_from(list(range(1, 8)))
     h.add_edges_from([(1, 2), (1, 3), (1, 5), (1, 4), (2, 8), (2, 6), (3, 6), (4, 7)])
     ​
     neighbors = find123Nei(G, 1)
     print(neighbors[0])  # 输出节点的一阶邻居
     print(neighbors[1])  # 输出节点的二阶邻居
     print(neighbors[2])  # 输出节点的三阶邻居
  • 高阶特征:高阶特征指的是图论中对于节点邻域的更高级别的分析,包括节点的邻居的邻居、邻居的邻居的邻居,以及更多层次的连接。这些特征有助于更深入地了解图的全局结构和节点之间的复杂关系。

先写到这里,如果后面的学习中需要到更高级、以前没有学过的图论知识,我会更新在这里~