为了账号安全,请及时绑定邮箱和手机立即绑定

物以类聚,人以群分 No.143

标签:
Java 算法

很久之前写了一篇关于大规模社交网络下的社区发现技术文,最近又在木东居士的数据茶水间里被提起,就稍微捞起来继续讲讲。

hot 社区发现有啥鸟用No.14

-----社区的来源是什么-----

日常生活中,我们必然会跟其他人会有或多或少的交集,譬如外卖小哥、快递小哥、同事、亲人、网友、合伙人、朋友、密友,等等等等。有研究表明人的一生平均会遇见2920万人,但只会与3000人有真正的来往。其中80%的人刚来便消失了,一杯奶茶喝完的功夫。9%的人呆了一会儿也走了,如交叉线,渐行渐远。还有不到1%的人留下了,不论你在哪里回头看,总发现喔原来他(她)还在那里,安安静静,不偏不倚。

我们所处的圈子,极大程度地影响了我们的视野和能力,持续地跟更优秀的人合作,真的是一件合作本身就非常愉悦的事情,如沐春风。你会在不知不觉中,感受到彼此的处世方式,感受到彼此的思维方式,这才是与优秀的人合作所带来的可能受益一生的内容。相反,如果一直在平庸的小圈子里沾沾自喜,你会发现游戏很好玩,你会发现思考很费劲,你会发现把事情干漂亮没什么用,你会发现学习就是浪费时间,你会发现健身就是徒增疲劳。但幸运的是,总会有人过来代表社会狠狠地给你一巴掌,不留余力,不留余地。近朱者赤近墨者黑,讲的大抵就是此类潜移默化。

其实只要坚持专注一些事情,你就已经比90%以上的人要好了,这是我一直坚信的信条。这个优势未必就体现在当前的位置上,未来还长,我们可以慢慢耕耘。

我也有一个大蕉的朋友们这么一个群,我真正的想把互联网圈里,跟大家一起营造一个正能量的互相交流的小小圈,这里有来自各个领域的高手或新人。目前我了解到的,航天工艺、芯片、通讯、算法、前端、客户端、后端、大数据、脱发、健身增肌减脂塑身,只有你想不到的问题,几乎没有群里的小伙伴无法解答的问题。每个人享受着来自各个朋友的回答,也给其他小伙伴们给予力所能及的帮助。每个人都是自己领域的大神,也都是其他领域的小白。我相信还是有非常多的小伙伴在这里收获到自己想收获的东西,这个世界负能量太多了,大家一起每天互相夸一下,少一些抬杠,多一点鼓励,多好。

-----社区发现的场景-----

言归正传,我们要分析社交网络中的社区,必然会有一个前提,就是我们已经拥有这个网络了,完全没有基础数据就谈分析是不是有点扯了,所以我们第一步应该是定义我们的网络,并把我们所拥有的数据以我们想要的格式组装成网络,网络其实也是一个图。而图最基本的结构可以只有两个点,一条边,也就是我们现在程序猴的生活。公司<---->宿舍。最复杂但是最形象的可以看看现在的互联网,是由非常多的路由器交换机为点,电线光纤等为边的图。我们的大脑,可以看成是非常多的神经元为点,神经元间的突触为边的图。

聊到这里,我们已经知道了,我们要有顶点,要有边。那在社交网络中,什么是顶点什么是边呢?按照我的经验,顶点一般是人,而边就是人与人之间复杂的关系。比如爸爸的爸爸叫爷爷,妈妈的妈妈叫外婆。爸爸的妈妈叫奶奶,妈妈的爸爸叫外公。


5d12199200014ea104400440.jpg

你别唱出来。可以看到,我们跟其他人的关系,总是有一些触发原因。比如血缘关系,比如同个宿舍,比如同班,比如同个幼儿园,比如穿同一条开裆裤。比如突然听到有人敲门。"开门,shunfeng快递"。应该马上去开门,拆快递最开心了呢。

https://img1.sycdn.imooc.com//5d12197f0001730801800132.jpg

又比如收到小卡片,应该照着卡片上的电话打过去,一段缘分说不定就这样开始了呢,心里还有点小激动呢。

https://img1.sycdn.imooc.com//5d121991000192fc01920118.jpg

所以我们想象中的网络应该有这些组成

顶点 : 大蕉(180、8块腹肌)、小明(153、钱1亿)、小红(165、网红)、小蕉(关系户) 这类人物。

关系 : 大蕉的同学是小明。大蕉与小红同穿一条开裆裤。大蕉借给小蕉几百万。

-----图谱的定义、存储与关系-----

到此,一个图谱的定义基本结束。我们可以看到,每一个顶点都会有唯一的标识,代表在这个关系网络里的唯一,而这个唯一标识又会伴随着很多额外的属性,以便后续的分析和检索。我们会用两个基础的结构来存储这些内容。其一是顶点对象。举个?。大蕉(180、8块腹肌)。其二是关系三元组,举个栗子。大蕉 --同学->  小明。

怎么来存储这些东西呢?一般来说会有三种做法。第一种是不存储三元组在需要的时候根据一定的规则实时生成,这种适用于规则经常变化,对于整个图谱可能都要经常大规模更新的场景,比如用GraphX。第二种是以文本的形式存储三元组,可能在数据库里也可能在文本文件中,在需要的时候检索读出,再进行一定的计算,比如保存在ElasticSearch这类搜索引擎中。第三种是图数据库,直接以结构化的形式,借助图数据库来组织,检索,更新整个网络,比如Neo4J。

存储的方式讲完了,该开始聊,关系是怎么来的了,有很多小伙伴在这里栽了跟头,我跟你讲一个最直接的方式,去买。能用钱解决的问题为什么要苦苦寻找解法呢,去买就是了,现在这么多正规渠道可以获取到正规的数据,只要最终数据是脱敏的,对于分析目标人物也足够了。第二个方式就是硬性关系匹配,比如你闺蜜的电话号码跟我一个朋友通讯录里的紧急联系人号码是一样的,那我就假设你闺蜜跟我朋友是有关系的。第三个方式就是根据规则推断,也就是爸爸的爸爸是爷爷,你直接就把爷爷这个关系往上贴就好了。至于说对于人物打标什么的,去某√搜索下人工智能训练师,根据这个 JD 去寻找人才帮你打标就好了。

目前大部分关系都是这么来的,我几乎看不到更多的例外。图也有了,存储也搞定了,接下来就开始用这个图了,怎么用呢?当然第一步是确定我们需要什么样的东西,我们是不是相信近朱者赤近墨者黑这个理论,我们是不是相信交往有深浅。如果我们相信,并且觉得这个理论基础是合适的,那我们有至少这么两种场景可以去尝试一些探索。

-----社区发现的技术-----

第一个场景是进行离线大规模计算,是将整个大图切分社区,比较适用于异常点检测,舆情分析。当然我们不会自己去写一整套程序来跑,我们会借助 Spark 里边的GraphX,ElasticSearch 里边的 Graph ,Flink 里的 Gelly 等等等等来帮我们完成想完成的计算。

第二个场景是实时计算,主要适用于人物所在社群分析。先寻找到目标顶点,然后辐射出去寻找到3-5度关系,然后在这个子图上再次进行社区发现。找到目标任务所在社区后,再根据交往有深浅,近墨者黑,来计算社区的总得分。

-----社区发现的算法-----

各种社区发现算法,也就是在这个阶段使用的,我之前觉得最好用的是 SLPA,因为我们并不能假设一个人就只在一个社区里边吖,因为在现实生活中,每个人都可能属于不同的社区,而且也并不是所有所有的关系我都要一视同仁,这在数据挖掘领域我们认为这样做可能会过拟合。基于这个,我们做了一个改进,就是社区发现的计算过程中,我们随机性地丢掉一些关系,然后不断迭代让这个社区尽量达到比较稳定的水平。况且LPA算法只能将顶点划分一个社区内,而且结果会震荡。接下来介绍的SLPA算法。Speaker Listener Label Label Propagation Algorithm。主要是LPA算法的升级版,改进点就在于,顶点在发送和接收的时候都可以有规则,而顶点的标签也从一个标签替换为一个Array,可以进行单顶点多社区的划分。伪代码写起来是下边这样的。

初始化:(1)顶点标签

LOOP

        (2)根据规则发送标签

        (3)接收标签,将标签以一定的规则追加到自己的标签中

        (4)继续进行方法2,直到达到最大迭代次数。

END

        (5)对结果进行解析,自行决定单顶点社区的个数。

这个结果不会有震荡,时间复杂度也跟LPA是一样的,只是空间复杂度上从O(N)变为O(kN),还算可以接受。

不扩展了,就此收住。让我们一起,近朱者赤。让我成为你的?,你也成为我的?。


-----ending-----


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消