微博社交圈子挖掘的一种有趣的思路


这是我在一篇论文中看到的思路,与之前的一些思路有比较大的不同。论文没有通篇看完,只看到算法描述部分,我就迫不及待的实验,对于同学,同事圈子的挖掘有一定的效果。我之前了解的一些算法的思路可以总结如下:

  1. 从节点开始,每个节点作为一个社团圈子进行合并
  2. 从整个网络开始,通过某些算法选取某些边,进行分割
  3. 从最大团开始,选择合适的相似度计算的方法,对最大团进行合并

我比较关注圈子之间有重叠的情况。前两种,我目前实验做得少,主要集中在第三种,及其扩展。第三种思路目前比较经典的就是k-clique算法,相似度计算的依据很强,很直接,就是要有k-1公共节点。后来有几篇文章,也是从最大团开始做的。我个人认为,是一个很好的开始。对于最大团思路的进一步分析,在后面的博客会有进一步的深入。我一直很看好这个思路。 这里要讨论的论文的思路与上面三种都不同,与2,3有点类似,当仍有较大不同。论文中没有命名,我姑且称之为local方法,这个方法的核心思路是,从局部的角度考虑节点是否能够作为一个社团。这个方法,有一个假设,就是社团或者圈子,就是一个局部的结构。只会包含一个节点,以及它的邻居们。这个假设是合理的。根据这个假设,就可以寻找从某一个节点开始的,这个节点属于的社团。方法中,有两个度量,一个是社团的fitness,另一个是节点的fitness。社团的fitness定义如下:

其中,k[in]表示社团内部的总的度数,k[out]表示社团内部的节点与社团外部节点连边的总数。a是一个参数,用来调整层次性。对于某一个节点的fitness定义如下:

很好理解:加入节点A的社团的fitness与移除节点A的社团的fitness的差,越大节点A越重要,如果为负,则表示A不属于该社团。有了着两个度量之后,就可以从某一个节点开始,知道这个点所在的社团。具体算法如下,初始社团C,只有一个节点A:

  1. 循环处理C中节点的所有邻居节点(注意要去重,比且邻居节点不再C中)
  2. 找到fitness最大的邻居节点,加入到C中,得到C1
  3. 重新计算C1中的所有节点的fitness
  4. 如果某一个节点的fitness是负的,就将它从C1中移除,得到社团结构C2
  5. 如果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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM