这是我在一篇论文中看到的思路,与之前的一些思路有比较大的不同。论文没有通篇看完,只看到算法描述部分,我就迫不及待的实验,对于同学,同事圈子的挖掘有一定的效果。我之前了解的一些算法的思路可以总结如下:
- 从节点开始,每个节点作为一个社团圈子进行合并
- 从整个网络开始,通过某些算法选取某些边,进行分割
- 从最大团开始,选择合适的相似度计算的方法,对最大团进行合并
我比较关注圈子之间有重叠的情况。前两种,我目前实验做得少,主要集中在第三种,及其扩展。第三种思路目前比较经典的就是k-clique算法,相似度计算的依据很强,很直接,就是要有k-1公共节点。后来有几篇文章,也是从最大团开始做的。我个人认为,是一个很好的开始。对于最大团思路的进一步分析,在后面的博客会有进一步的深入。我一直很看好这个思路。 这里要讨论的论文的思路与上面三种都不同,与2,3有点类似,当仍有较大不同。论文中没有命名,我姑且称之为local方法,这个方法的核心思路是,从局部的角度考虑节点是否能够作为一个社团。这个方法,有一个假设,就是社团或者圈子,就是一个局部的结构。只会包含一个节点,以及它的邻居们。这个假设是合理的。根据这个假设,就可以寻找从某一个节点开始的,这个节点属于的社团。方法中,有两个度量,一个是社团的fitness,另一个是节点的fitness。社团的fitness定义如下:
其中,k[in]表示社团内部的总的度数,k[out]表示社团内部的节点与社团外部节点连边的总数。a是一个参数,用来调整层次性。对于某一个节点的fitness定义如下:
很好理解:加入节点A的社团的fitness与移除节点A的社团的fitness的差,越大节点A越重要,如果为负,则表示A不属于该社团。有了着两个度量之后,就可以从某一个节点开始,知道这个点所在的社团。具体算法如下,初始社团C,只有一个节点A:
- 循环处理C中节点的所有邻居节点(注意要去重,比且邻居节点不再C中)
- 找到fitness最大的邻居节点,加入到C中,得到C1
- 重新计算C1中的所有节点的fitness
- 如果某一个节点的fitness是负的,就将它从C1中移除,得到社团结构C2
- 如果4发生了,转到3,否则转到1
算法结束的条件是:当第一步得到的邻居节点的fitness都为负,即可停止。这里有一个好处,就是可以不用使用q函数来判断算法结束的时机。 我简单实现了上面的算法,用我自己的关注数据测试了一下,效果如下: 以“王大美”为种子,得到的人民搜索同事圈子如下:
悦晓0709 |
豆爸何锐 |
loveEmma |
鱼晓-五毛 |
袁小晕 |
王大美 |
即刻搜索JIKE |
yellowleaf2010 |
guoyipeng |
以“hny101”为种子,得到高中同学圈子如下:
c背a井t医y志y猫c |
兔杰列夫 |
hny101 |
奔三北P |
以“bill323”为种子,得到前实验室的同学圈子如下:
暖暖cathy |
alue-fabre |
bill323 |
hszhsh1915647047 |
桂林山水78 |
以“wpwei”为种子,得到大学同学的圈子如下:
海带丝丝 |
Eva奶奶 |
wpwei |
这几个圈子的挖掘效果非常好,但是我的主要圈子,技术圈,挖掘得不是很理想,技术圈比较大,比较杂,不好挖掘。但是同学,同事圈子还是比较理想。对于技术圈子不好的主要效果还是这部分链接过于复杂,这是目前算法都不能很好解决的问题。
[引用]
Detecting the overlapping and hierarchical community structure in complex networks