目录
1 什么是图?
图是一种常见的数据结构,用于表示对象及其之间的关系。其中,对象又称节点(node)或顶点(vertex),关系用边(edge)来描述。在数学上一般用 G=(V,E,A,X) 来表示,其中 V={v1,v2……,vn} 是节点集合,E=e_ij 表示边的集合,A 是大小为|V|×|V|的邻接矩阵,用于表示节点之间的连接关系,如果 e_ij∈E,则 A_ij=1,X 是大小为|V|×d 的特征矩阵,X 的第 i 行 X_i:表示第 i 个节点的属性特征,其中 d 是属性的维度。
2 图能做什么?
上图中,右侧手机号171505****关联了393个人,16年-19年累计进件1665次,放款65笔,其中33笔当期状态是逾期!
3 传统的图算法从应用角度可分为三类
1. 路径查找算法
2. 中心度算法
3. 社区发现算法
3.1 路径查找算法——Dijkstra
Dijkstra是一个贪心算法,用于在加权的图中查找最短路径,比起无脑的遍历,Dijkstra优化的点是,为了避免不必要的
重复计算,保留上一步的计算信息。
对于带权有向或无向图 G=(V,E),Dijkstra 算法的复杂度为O(V^2) 只有当权重为正值时有效,基于 Fibonacci heap 的最
小优先队列实现版本,其时间复杂度为O(E+VlogV)。当权重有负值,可使用贝尔曼-福特算法。
1. 指定一个节点,例如我们要计算 'A' 到其他节点的最短路径
2. 引入两个集合(S、U),S集合包含已求出的最短路径的点(以及相应的最短长度),U集合包含未求出最短路径的点(以及A到该
点的路径,注意 如上图所示,A->E由于没有直接相连 初始时为∞)
3. 初始化两个集合,S集合初始时 只有当前要计算的节点,A->A = 0,U集合初始时为 A->B = 8, A->E = ∞, A->D = 1,
A->C = 5
4. 从U集合中找出路径最短的点,加入S集合,例如 A->D = 1
5. 更新U集合路径,if ( 'D 到 C,E 的距离' + 'AD 距离' < 'A 到 C,E 的距离' ) 则更新U
循环执行 4、5 两步骤,直至遍历结束,得到A 到其他节点的最短路径
3.2 中心度算法——PageRank
定义问题: 一个网站的排名,如何确定;或一个人在社交网络中的影响力,如何确定;
被一个门户网站指向,被一个大V关注……
假设,4个网站之间的跳转入左图,抽象出来就是转移矩阵M,假设一个人最开始访问这四个网站的概率都是1/4,那经过第一轮跳转