基于智能优化算法的复杂网络社区发现问题
第一章 基于天牛须算法求解复杂网络社区发现问题
前言
????????复杂网络社区发现问题,无疑是研究热点之一。社区发现方法有很多,最近一段时间将和大家一起分享一下基于智能优化求解复杂网络社区发现问题方面的知识及代码
一、基本天牛须算法
????????关于BAS算法的相关介绍就不再这里赘述了,没接触过的同学请阅读前文《智能优化算法:天牛须搜索算法》。
二、关于社区发现
????????基于智能优化算法求解社区发现问题,其实主要在于适应度函数的选取上。与单纯的数值优化相比,区别点在于适应度函数换成了模块度Q。 ????????这里讲一句题外话,这篇博文只针对刚刚接触社区发现的同学。因此,其中涉及到的相关问题,本人并没有深入的写下去,包括模块度分辨率低、社区重叠等问题。在后续的博文中(如果我还有时间的话,“狗头”)我会继续和大家分享,还有,我没时间看私信和评论,大概一年看一次吧。
基本问题
- 社区的编码表示
- 天牛的左右须更新方式
????????上述两点解决了,基本上就没啥问题了。
????????社区编码这里采用“几节点几社区”的方式,假设有
n
n
n个节点的网络,则初始化
[
1
,
2
,
3
,
…
…
,
n
]
[1,2,3,……,n]
[1,2,3,……,n]。初始化后,可以对初始的编码进行简单的操作,进行改善。比如,根据节点的邻居节点社区进行自节点社区更新。
????????关于天牛左右须问题,主要存在两点问题:一是,质心节点的选取,即选择哪个节点做为天牛的质心节点;二是,质心确定后,左右须按照什么规则进行更新。质心节点的选取,可以是随机的,可以是遍历的。但是在随机中,要保证禁忌性。即每次随机的质心节点要加入禁忌表中,防止每次随机都选到相同的节点。(PS:我师妹一开始就犯了这个错误,大家需要注意)在遍历中,需要确定每次遍历的次数,要保障Q最大化。 ????????左右须更新规则其实也比较好理解,选定质心后,根据质心节点的邻居节点所属社区的频率进行更新,这里需要注意的是,变的是质心节点的社区编号。比如,节点5为质心,则观察节点5的邻居节点所属的社区[1,1,1,2,3,3,4]。所属社区最多的社区编号为1,则质心节点5的社区编号变为1,这就是左须的更新规则;同理,邻居节点所属社区编号第二多的作为右须。 ????????下面是具体的效果,这里我没有对社区数量进行预设,即没有在代码中规定网络划分为几个社区。因为我考虑到,在已知网络时,确实如此操作是可以的。但是在处理随机、未知的网络时,这种预设的方式就行不通了,因此,这里我的社区数量没有进行预设。 另外,这个算法只是最最最基础的,可以在这个基础上进行很多的创新和改进。比如,我在算法中没有预设社区数量,最后划分出四个社区,与已知两个社区相比差别较大。那么如何改进?两点,其一从算法本身进行改进,包括分辨率、算法搜索能力;其二进行社区融合等等,各种方法,留给朋友们发散一下思维。
???????因为是基础算法,所以搜索能力一般般,每次运行结果得到的社区发现结果都不同,Q也不同。
总结
在这里附上python代码,大家有问题尽量不要再CSDN上找我,因为我真的不习惯看,可以从面包多上私信我。如果你私信我没回只有一个原因:你的问题让我感到很无语,请大家组织好语言,不要上来就高人一等哈,拜谢!
python代码链接 https://mianbaoduo.com/o/bread/YpicmZ1y
|