您的位置:首页 > 理论基础 > 计算机网络

社交网络分析之网络分解(小世界划分)

2014-11-03 22:42 134 查看
略谈社交网络:

抽屉里有本书《social networks analysis》,平时也没翻,突然老板说,搞一下社交网络分析,于是就上了。一周下来写个小结。由于在网络中找关键点,已经被分析了很多(比如中心性、流中心性等,而且python有个networks的包,总之没什么难度。),我当时的定位是网络分解:把一个大的网络划分为若干个紧密连接的子网络。

数据的准备以及验证:

作为验证算法的有效性来说,我们没有去找一个已经标记过的网络,而是造了一批数据。我们设定A B C三个群体,分别20、20、50人;同类人与人之间 0.2的概率与其他人发生联系,异类人与人之间0.02的概率法身联系。这样一个用于测试的社交网络就够造好了。

分解的思想:

记得之前看一本书上说:信息是来自于网络的外部(原话已经忘了)。对于局部网络来说他有一些桥梁(边)使他与全局相连,那怎么找到这些桥梁呢?我们使用的方法非常简单,让网络中每一个人都从自己的出发点传递一条信息给其他所有人(当然,因为这些人很懒,他们每次都会走最近的路线),然后看看哪条(边)被最多(或者top K)的人使用,那它就是“桥梁”。拆掉一座桥后,再做相同事情时,会有其他边再次充当桥梁角色,一直拆下去,网络就会断开了。有没有感觉太简单了……(后来发现这和一些书上说的“边介数”是一样的)

分解的效果:

网络点数在100个左右时,在同类链接概率大于异类链接概率的 4 倍时,效果已经非常明显了。在相差10倍时,我们做了多次试验,往往只有0~3个元素被分错网络归属。

代码性能:

我自己写的算法复杂度为N的4次方多一些。首先随着网络的元素增加,要切开更多的“桥梁”才能将网络切开,我们构造的数据中这个值接近正比于N的2次方。其次随着网络的元素增加,我们要找到任意两个元素间的最短路线的复杂度与具体实现有关,不过我们的是略高于N的2次方。

实现中我避开了遍历元素,而是采取遍历边的方法,因此对复杂度有所降低,也使原来的深度优先遍历转化为广度优先(深度优先指每次都把一个人所有的最短路线找出来,而广度在这指每次每个人都只走一步;感兴趣的同学可以实现一下)。不过现在其中部分地方使用矩阵记录图,导致很多无效的访问,在后续中会改掉。

总结:

关于性能这块我也有些其他的方法去优化(当然不包括并行、分布式这种野蛮的方法),但是现在没有完全解决。另外看了一下自己之前写的文章,感觉有点贪多,没写明白,希望这次说清楚了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: