一.图的基本知识
1.图的表示
由点与边构成的数据结构,顶点表示研究对象,边表示两个研究对象之间特定的关系
图的分类:
- 无向图与有向图
- 有向图:图中的边存在方向性
- 无向图:边无方向性
- 非加权图与加权图
- 加权图:图中的每一条边都一个实数预置对应,即每条边都对应于一个权重
- 非加权图:默认为每条边的权重都是一致的
- 连通图与非连通图
- 连通图:图中每个顶点都可达
- 非连通图:图中存在孤立的点,即没有任何边与之连接
- 二部图
- 将图中的顶点分为两类(A,B),对于每一条边,它一端的顶点属于A,一端的顶点属于B;它描述了两类对象之间的关系。
图的数据结构:
邻接矩阵可以来描述图中顶点之间的关系
- 用一个一维数组表示顶点的集合
- 用一个二维数组表示邻接矩阵
- 如果节点 i i i与节点 j j j之间相连接,则矩阵中的元素 A i j = 1 A_{ij}=1 Aij=1,否则 A i j = 0 A_{ij}=0 Aij=0
2.图的特性
1.邻居与度
- 邻居:一条边连接的两个顶点互为邻居
- 度:一个顶点的邻居数目称之为度
- 对于有向图,有入度与出度之分
- 入度:顶点作为终点的边的数目
- 出度:顶点作为起点的边的数目
- 对于有向图,有入度与出度之分
2.子图与路径:
- 子图
- 图 G ′ G' G′的顶点和变的集合都是另一个图 G G G的顶点和边的集合的子集,则图 G ′ G' G′为图 G G G的子图
- 路径
- 从一个顶点 V i V_i Vi出发,沿着一些边和顶点到达另一个顶点 V j V_{j} Vj,沿途边的的序列称之为从顶点 V i V_i Vi到顶点 V j V_j Vj的路径
- 路径长度
- 路径中所经过边的数目称之为路径的长度
- 顶点的距离
- 两个顶点之间距离最短路径的长度为此两个顶点的距离
3.图的遍历
图的遍历是指从图中某一个顶点出发,按照某种算法,沿着图中的边,对图中所有顶点访问且仅访问一次。
常见图的遍历算法
- 深度优先算法(DFS)
- 广度优先算法(WFS)
3.图中心性
为什么引入中心性?
中心性是衡量某个节点在图中重要性或地位的重要指标。
如在社交网络分析某个用户的社会影响力,在商品用户中分析商品在用户中的重要性
度中心性:
度 中 心 性 = N d e g r e e n − 1 度中心性=\frac{N_{degree}}{n-1} 度中心性=n−1Ndegree , N d e g r e e N_{degree} Ndegree代表节点的度,N为图中节点总数量
背景:度是与节点相连边的数目,度越大,与节点相连的边就越多,节点在图中的重要性也就越高;除以 n − 1 n-1 n−1的原因是每个节点最多与剩余 n − 1 n-1 n−1个节点相连。
特征向量中心性
图的邻接矩阵为 A A A,有 A X = λ X AX=\lambda X AX=λX算出图的邻接矩阵的特征值与特征向量,找出最大那个特征值对应的特征向量,特征向量本质代表矩阵运动的方向性,特征值代表矩阵在对应方向上运动的距离,最大特征值对应的特征向量最能体现邻接矩阵的趋势。
特征向量对应位置值与相应的节点对应
观察各个顶点对应的值,顶点1与顶点5值最大,应为两者在图中度最大; V 2 , V 3 , V 4 V_2,V_3,V_4 V2,V3,V4的度虽然都为2,但 V 4 V_4 V4所对应的值比另外两者都大,那是应为 V 4 V_4 V4的两个邻居都为度最大的顶点。
背景:这一定程度上体现了你的朋友在社会的地位高,一定程度上也会提升你的社会地位;即使你有很多社会地位低的朋友,你的社会地位也不一定会很高。
中介中心性
中 介 中 心 性 = 图 中 经 过 该 节 点 最 短 路 径 的 数 目 图 中 最 短 路 径 的 总 数 中介中心性=\frac{图中经过该节点最短路径的数目}{图中最短路径的总数} 中介中心性=图中最短路径的总数图中经过该节点最短路径的数目
背景:图中非邻居的两个节点之间必须依靠中心节点才会建立练习,一个节点如果在其他任意两个节点的最短路径中频繁出现,那么该节点的重要性也会非常高。
连接中心性
连 接 中 心 性 = n − 1 节 点 到 其 他 节 点 最 短 路 径 之 和 , 其 中 n 为 图 中 节 点 数 目 连接中心性=\frac{n-1}{节点到其他节点最短路径之和},其中n为图中节点数目 连接中心性=节点到其他节点最短路径之和n−1,其中n为图中节点数目
背景:连接中心性也是从整个网络的布局来考虑的,可能存在这种情况,一个节点与其他节点之间都可达,但其到达其他节点的距离都非常远,那么这类节点他的重要性也不会很高;所以引入连接中心性,其到其他节点距离之和越短,其在整个图中处于越核心的位置。
PageRank
4.编程实现图的创建及其特性的计算
#关于图的操作,Python中含有库 networkx
import networkx as nx
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#创建图
edges=pd.DataFrame()
edges["sources"]=[1,1,1,2,2,3,3,4,4,5,5,5] #源节点
edges["targets"]=[2,4,5,3,1,2,5,1,5,1,3,4] #目的节点
edges["weights"]=[1,1,1,1,1,1,1,1,1,1,1,1] #边的权值
#创建
G=nx.from_pandas_edgelist(edges,source="sources",target="targets",edge_attr="weights")
#将图表示出来
nx.draw_networkx(G)
图的特性的计算: