机器学习理论入门-图论
由于离散数学、数据结构等学科已对图论有较为详细的学习,这里就随便写一下。
图:简单的说,图是一个用线或边连接在一起的顶点或节点的集合,严格的说,图是有限顶点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]) # 输出节点的三阶邻居
高阶特征:高阶特征指的是图论中对于节点邻域的更高级别的分析,包括节点的邻居的邻居、邻居的邻居的邻居,以及更多层次的连接。这些特征有助于更深入地了解图的全局结构和节点之间的复杂关系。
先写到这里,如果后面的学习中需要到更高级、以前没有学过的图论知识,我会更新在这里~
- 感谢你赐予我前进的力量