一、定义什么是社区
社区是一种局部性结构,该局部性结构内部连接紧密,而不同的局部性结构之间连接稀疏,这种局部性结构是社区。
主要应用:好友推荐、广告推送
二、如何评价一个社区的分类好坏的情况?
用Modurity衡量。
三、社区发现算法
① 算法1
本质:二维空间的聚类,图的点通过距离等指标判断近似度,将近似度大的点分在一类。有两种方法判断
方法1:两点之间至少要去掉多少个点,才能保证他们不会互相连通;-(NPC,很难求解)
方法2:两点的路径越长,紧密程度越低;定义一个衰减因子α,判断两点之间的路径长。
得到路径后,再对这些点进行聚类分析。
为衡量聚类的好坏,引入参数 Modularity:(划分在社区内的边-随机边落在社区内),结果越大越好。随机边的产生模型见下图;
②基于中心度的社区发现算法
edge betweenness:
定义betweenness为:所有的最短路径的重合边。这些重合边相当于交通堡垒,连接社区的边具有高betweenness,删去边后如果社区不连通,就认为找到了社区。
缺点:效率低下,因为要先算sssp的重合边,而后再不停的删去边。
用BFS算eb(edge betweenness)(6个点算六次,加和/2,得到edge betweennes):
③团
原理:找接近于团的subgraph。
找maximal团:(注意不是最大值)
但现实生活大部分社区依然是到不了团的程度,因此有人提出:如果不同的团共享若干个点,则也认为它们是一个社区。下图右下方的结构,不同团共享k-1个点,认为他们是一个社区。
右侧矩阵,看有几个连通的,就是有几个团。
④k-core算法
原理:每个社区结构的点的core至少为k。
类似剥洋葱,每次把degree<K的点和边删去,重复,直到所有点的degree>=k