搞算法是在解决问题;搞研究是在创造问题。当前的研究方向是社团检测。胡乱看了好长时间的论文,蹦出许多想法,可惜只能摸着石头过河,弯弯曲曲地走着,茫然无果,孤独无助。现在的环境就是这样,大家都懂的。这学期上了些硬课,终于对领域环境有了概念,在此感谢各位认真教学的老师!总结下这段时间的认识,写个社团检测入门出来,希望能帮助后面的人了解这个领域,少走些弯路。个人能力有限,欢迎大家讨论哈~ 有问题的地方求轻喷,我会及时改正~
翻译成“社团”,看上去和社会里的社交圈有些关系。社交圈是一群联系紧密,有着相同兴趣爱好的人。如果用点表示人,边表示两个人间的关系,如此构建成的图可看作社会网络。从社会网络上看,人们总是你一团我一团的聚在一起。这和现实相符,你会有大学同学,工作伙伴等等社交圈。你认识的这些人,他们之间也很可能都相互认识,因此社交圈中的联系很紧密。不仅社会网络有这种特点,凡是复杂网络都会有这种社团结构。
复杂网络,是既不完全平凡(格子图)又不完全随机(毫无规律)的一种网络(这里的网络是指由点和边组成的图),现实生活中的许多网络都是这样,例如之前提到的社会网络,万维网(点表示IP,边表示网络连接),蛋白质作用网络(点表示蛋白质,边表示两个蛋白质之间会相互作用),航班网络(点表示航站,边表示航班)等。你或许会惊呼,原来身边有这么多网络啊。
是的,研究社团之前重要的一步是构造网络。观察周围,哪些数据可以构造成网络,点代表什么,边代表什么,社团可能代表什么。早些时候,以为网络都是现有的,别人构造好等待你来研究的。看过几篇好论文,每个人是为了不同的目的来构造网络,研究的是不同的问题。不要因为别人的网络没有提供完整的信息而限制住你的脚步,看看实际应用,自己构建更贴合实际问题的网络,可以达到更好的效果。如果想省事直接用别人的,至少要明白他们的数据来源和处理流程。
得到网络,社团检测就是在网络上做聚类,聚出来的类就是社团。
聚类clustering问题研究了70多年(据wiki),讨论的是如何划分一堆数据,使得相似的数据聚到一起。数据通常用一维向量表示,比如一个人的(身高、体重、年龄)。我们这里讨论的数据是网络的拓扑结构,也就是两两数据之间的信息,比如两人之间是否认识。前者研究的更久,很多方法稍加变通就可以用于后者。后者也很重要,比如研究社会现象时,关注两人之间的关系比个人的信息更有用。现在也有人开始将两种数据信息结合着用,结果更准确。啊,注意不是什么网络都可以聚出类的,但复杂网络是可以的。
聚类算法通常可以描述为,用相似度来衡量两个数据的远近,搜索可能的划分方案,使得目标函数达到极值。目标函数与相似度相互呼应,例如,目标函数是同类内数据相似度的平均值,它们都是用来描述希望找到什么样类。看了wiki的介绍,聚类真是无所不在= =!这些算法的不同主要在于对类的描述(相似度,目标函数)和搜索方法。选择什么算法(以及设置参数)取决于数据集和用途。
类似地,对于社团检测,问题是如何衡量数据的相似度,希望检测到什么样的社团(目标函数),如何搜索可以尽快得到最优解。一些启发式的随机搜索方法(模拟退火,进化算法,群智能算法)可以帮助解决最后一个问题,流行的分布式计算也可以加快计算速度。(糟糕的是,我们不知道希望检测到什么样的社团!好吧,这是我们实验室常遇到的问题,搞的太偏理论,轻视实际的用途,困惑、茫然、纠结。)
希望检测到什么样的社团呢?显然,相似的数据应该在一团。于是问题转到相似度上,什么样的两个点是相似的?有人认为在网络上离的近的点更相似;有人认为度数相同的点更相似;有人认为邻居节点类似的点更相似,等等。这是从相似度定义社团的,还有不管相似度,而是考虑社团结构(目标函数)。比如希望检测到内部链接密集,外部链接稀疏的社团;内部链接稀疏的社团;还有两者都有的混合式社团。其中前者是社团检测中最常用的定义,“类内密集,类间稀疏”,社交圈就是这样的。总之每种方式都会有个目标函数来描述希望的社团结构,求解过程就是求目标函数的极值。以上两种方法,分别从局部和全局来描述社团。各有道理,具体用什么还要看实际应用,或者研究的问题背景。所以如果不从实际应用出发,会很困惑于要找到的社团长什么样,至少我一直很困惑= = 啊,这是吼这句话“不知道希望检测到什么样的社团”的原因之一。
另个原因是难以验证结果是否正确。对于有标注的数据,可以简单地对比划分结果来计算正确率,方法(NMI,Jaccabi,Omega,F-score)也不尽相同。正确率太高也不一定是好事,容易过拟合。然而大部分的数据是无标注的,在不知道正确结果的情况下得到社团的划分,所以说不知道该检测到什么社团。Newman大牛一篇文章甚至说到,我们就不该在检测之前知道社团长什么样。等检测出来后,再解释社团的意义。(总觉得不靠谱= = 我真该去搞应用)咳咳,此时该如何评价呢?一部分人会说,嘿,我和他得到的结果一样,所以是正确的,然后开始自圆其说。几个不同的方法得到相同的结果,这个结果确实有着不平凡的地方。更令人信服的方式是从某些描述社团特性(密度,类间散度,类内散度,power-law)的侧面来评价结果,比如社团内部的密度是否高,社团之间的联系是否少等等,有些目标函数也用来当作评价,比如最常用的modularity(可以同时衡量类内和类间两方面)。这样的评价更加客观,原本是以函数A为目标求解,结果显示评价(或目标)B和C也能得到很高的值,从多个侧面来看,这个结果是好的。注意,要根据希望的社团结构来选择合适的评价指标。每个人研究的问题或多或少都有所不同,许多人都是自己设的评价指标。自己的指标当然是自己跑的最好,别人跑的差。所以选用别人的指标会更有说服力,看,我用的你的指标跑的还比你好,你都能发表出来,就没有理由不发表我的。啊,又陷入了发表论文的怪圈。再次注意,不要只是为了打败别人而设指标,一定要选择适合你的问题的指标,毕竟我们都是想解决问题的。别人的方法不足以解决问题,而我们的能够解决,顺便打败他了而已= =。
复杂网络,社会网络,社团检测,这几个词在近些年热门起来,尤其是社会网络分析,随着社交网络的普及,更是充满问题和机遇的一个领域。
有人说聚类问题还不够成熟,真正应用于实际中的例子还不清楚,wiki里倒是列了不少。见过的有,图像分类里的bag of visual words方法是聚类和分类的结合,先聚类特征,用特征的统计直方图作为新的特征做分类;进化算法中,聚类群体,尽量在不同类别间作重组操作,可以扩展搜索空间,找到更优的解;聚类网页或文件,加快搜索速度;当然还有推荐。
要问社团检测的应用,能说上来的只有推荐。给QQ推荐好友,给淘宝买家推荐商品,给音乐用户推荐新歌,给手机用户推荐应用或游戏,给各种用户在各种地方推荐各种广告。推荐是另外一个领域,不一定会用到社团,至于社团在其中的地位,也不太了解。
说起推荐,想到些难点:推荐的准确和实时性;保证新产品不会被老产品掩盖;发现可以用推荐改善用户体验的地方。第一点不用多说。第二点,百度提出轻应用就是想解决这个问题。微软的APP store可能也考虑到这点(或者是我想多了= =),搜索结果中,新老产品混合着排序,不过牺牲了部分的准确性。第三点是最难的,所谓的IT的精髓,为用户创造需求。
有点跑偏了。后面会总结下看过的研究现状。
一位友人说过,大数据必将拾起以往被复杂度抛弃的算法。或许,过去笨重的算法在大数据以及云计算的支持下,会掀起一番风浪。
http://en.wikipedia.org/wiki/Cluster_analysis wiki聚类分析