作者:王钊 编辑:小普
社区,即一群拥有相似特征的点,社区内的点连接紧密,社区间稀疏连接。
我们可以把同一公司的同事看作是一个社区内的点,他们从事同一行业,可能有相似的教育背景,由于 工作需要,他们之间要进行频繁的沟通。
而不同的公司就像是两个不同的社区,他们之间可能存在着业务往来,但关系远没有公司内部连接紧密。
什么是社区切分?
那么发现这些社区对我们有什么用呢?
对于一家需要做广告宣传的公司,他一定是想花最少的钱,吸引最多的客户,通过广告的在某一社群的精准投放可以达到这一期望。
同理,对于银行信贷业务,如何才能降低逾期还款风险,审批时的筛选环节非常重要。
如果一个人所在的社区大多数人出现过多次逾期还款记录,那么这个申请人很有可能就不是一个优质的客户。
社区是若干社会群体或社会组织聚集在某一个领域里所形成的一个生活上相互关联的大集体,是社会有机体最基本的内容,是宏观社会的缩影。
下面让我们来一起看看如何进行社区切分:
一种快速迭代社区划分方法:Louvain Algorithm
Louvain算法是一种贪婪算法,运行时间是O(nlogn),算是非常的快了。
而且类似层级聚类算法,可以提供不同尺度的社区发现,这点对于一些定性分析是很有吸引力的。
Louvain算法分两个步骤:
1. 对本地节点转换社区,并计算Modularity的变化,从而优化网络整体的Q;
2. 把相同社区的节点聚合成一个超级节点,从而形成一个新的图。
然后在重复1,直到最后整个网络的Q 不再增加。
这个算法比较好理解,其中的主要需要解决的就是如何计算第一步中的节点变换时Q的变化。
这里就从网络最初的原始形式开始,每个节点自己就是一个单独的社区。
进行如下两步计算:
1. 计算ΔQ ,这个差距是把节点i划归到它的邻居节点j 所在的社区后Q 的变化值。
2. 选择把节i 划归到一个使得ΔQ 最大的邻居j 所在的社区。
具体的ΔQ 的计算公式如下:
其中,
对上面这个式子的进一步解释是:
1. 前面大括号里面的部分是把i 加入到社区C 后的Modularity。
2. 后面大括号里面的部分是不把i 加入到社区C 前的Modularity。
与此同时,需要计算
的值,即把节点i 移除社区D造成的Modularity的差值。
计算整体的Q的差值:
通过计算这个Modularity的差值,就获得了一个局部最优的社区集合。
则进入第二步。
算法的psudo-code见下图:
上面提到的模块度是一种衡量社区划分的指标,可以利用模块度Modularity Q来衡量社区划分的效果。
模块度的定义为:
其中,表示节点i和节点j的权重,为所有和节点i相连的权重和,m为所有边权重之和,是节点i所属社区,当节点i,j属于同一个社区时, 否则为0。
模块度的范围[-1,1],当模块度大于0.3-0.7时,社区划分效果已经很好了。
模块度是衡量社区划分效果的,所以希望在社区内部边的个数,要远大于一个随机图中这个社区内部边的个数,表达式上就是:
对于一个随机图,它要和真实图有相同的度分布,对于节点i和节点j,它们的度数分别是
和
,则节点i和节点j期望的边数为:
(其中m为所有边权重和)
那么模块度
等价于上文所提到的模块度定义。
最后,有一个很有趣的现象,小普想分享给大家。
通过调查研究发现,人们在找工作时,往往可以通过一般的熟人,而不是好朋友获取更多的信息。
弱连接(一般熟人)或许是我们认识多元世界的一个很重要的渠道,对于强连接(好朋友),往往因为足够了解,可以获得的额外信息并不多。
这样的发现也可以启示我们,多多走出去,认识新的人吧~
参考文献:
http://web.stanford.edu/class/cs224w/slides/04-communities.pdf
https://www.youtube.com/watch?v=pnYwvN8TCio&list=PL1OaWjIc3zJ4xhom40qFY5jkZfyO5EDOZ&index=3
https://blog.csdn.net/infovisthinker/article/details/104724677
https://zhuanlan.zhihu.com/p/138824980
- 完 -
想了解更多关于人工智能的资讯
欢迎关注公众号:普适极客