关于Louvain的使用问题

问题一、
object LouvainConfig {
var maxIter: Int = _
var internalIter: Int = _
var tol: Double = _
}
以上三个参数,分别是什么意思?

问题二、
算法代码
val louvainConfig = LouvainConfig(10, 5, 0.5)
val louvain = LouvainAlgo.apply(spark, df, louvainConfig, false)

原始数据:
src,dst,weight
101,102,1.0
101,104,1.0
102,103,1.0
102,104,1.0
103,104,1.0
104,105,1.0
101,105,1.0
101,103,1.0
201,202,1.0
202,203,1.0
203,204,1.0
204,201,1.0
301,302,1.0
302,303,1.0
302,304,1.0
401,402,1.0

输出结果:
±–±------+
|_id|louvain|
±–±------+
|101| 101|
|105| 105|
|104| 104|
|102| 102|
|103| 103|
±–±------+

疑问:
1)这个输出结果是什么意思?我怎么知道,哪些点是一个社区的?
2)为什么20* 、 30*的社区没有被输出出来?

1 个赞

同样的结果,LPA算法 跑出结果如下:
±–±–+
|_id|lpa|
±–±–+
|101|101|
|301|302|
|401|402|
|105|101|
|104|101|
|302|301|
|102|101|
|202|201|
|303|302|
|204|201|
|201|202|
|304|302|
|402|401|
|203|202|
|103|101|
±–±–+

不知道 如何解读 这个结果。如何 划分 社区?
麻烦社区大佬 帮忙解读一下。 需要的话,可以加我的微信 私聊 yangmengjin003

可以参考该文章,Louvain实现过程是两个步骤的不断迭代。
maxIter 是两个步骤的最大迭代次数
IternalIter 是第一个步骤内部的迭代次数
tol 是计算模块度差值时的阈值

第二个问题: 你用的什么版本?
2.6.0之前louvain的输出结果形式有bug, 是输出了每个社区和社区内同编号的节点。

你可以用高版本的算法去跑,结果是 节点id,节点所属社区id。

2 个赞

我用的版本是 3.0-SNAPSHOT,
com.vesoft
algorithm
pom
3.0-SNAPSHOT
原数据:
src,dst,weight
101,102,1.0
101,104,1.0
102,103,1.0
102,104,1.0
103,104,1.0
104,105,1.0
101,105,1.0
101,103,1.0
201,202,1.0
202,203,1.0
203,204,1.0
204,201,1.0
301,302,1.0
302,303,1.0
302,304,1.0
401,402,1.0

结果数据(整理了顺序):
lpa
|_id|lpa|
±–±–+
|101|101|
|102|101|
|103|101|
|104|101|
|105|101|

|202|201|
|204|201|
|201|202|
|203|202|

|302|301|
|304|302|
|301|302|
|303|302|

|402|401|
|401|402|

针对结果有几个疑问,麻烦帮忙解答一下。
1)_id代表 点的ID, lpa 代表社区标签? lpa的社区标签 是 用点作为ID,作为社区标签的名称?
2)10开头的数据 都属于 101这个社区; 但是 20 开头的有两个社区,启光的是 202点 属于 201社区,但是 201点有属于 202 社区,这个有点不理解; 其次,40*开头的数据, 原本只有两个点,结果出现了 401点 属于402社区,402点有属于401社区。 感觉这个数据 比较难以理解。

你是问louvain还是lpa啊,这是两个不同的算法哈

  1. 是的,你的理解是对的。
  2. 因为你的数据中201 202 401 402 是双向边,所以第一次迭代时会互相将自己的标签发送给对方

收到,谢谢。那我先看一下,有什么不懂的,还望不吝指教

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。