我非常怀疑community
包中存在错误。它在模块得分的计算中。我查看了Louvain
算法paper,发现了一些异常现象。这是问题 -
在Q
有k_ik_j/2m
并且在将外部1/2m
相乘后,它应该是k_ik_j/4 sqr(m)
,但是如果你去了包的modularity()
函数,代码就像这个 - sqr(k_ik_j/4m)
。见行号131,是行 -
res += (inc.get(com, 0.) / (2. * links)) -(deg.get(com, 0.) / (2. * links)) ** 2
但是,根据等式,它应该是这样的 -
res += (inc.get(com, 0.) / (2. * links)) - deg.get(com, 0.) / (2. * links) ** 2
我在一些玩具图上测试了最好的群集的模块性得分,第二个更正的代码为最佳分区提供了最高的模块性。但是,第一个代码(错误的代码(可能)),为最佳分区提供低模块化分数。
以上是我在阅读论文后,使用一些图表进行测试,理解和调试modularity()
函数。
我的问题是,我的发现是否正确?任何人都可以检查一下吗?如果有人需要更多信息或澄清,我可以提供。
我正在使用0.8版python-louvine包。
答案 0 :(得分:1)
你是对的,第二部分是k_i * k_j /(4 sqr(m)),其中k_i是社区i的程度。但是你只考虑i == j的情况,因此它变成了:
k_i * k_i / 4 sqr(m)==(k_i /(2 m))** 2
用你的等式,我认为你只考虑k_i而忘记了k_j。