上一个帖子介绍了infomap的基本逻辑infomap-CSDN博客,这个帖子介绍层次infomap。基本的infomap只能得到单层模块,但是现实世界中也存在着“模块套模块”的情况,例如对某一个个人,他可能在xx企业的xx国家的分公司的xx城市分部工作。层次infomap就力求发现这样的层次嵌套结构。infomap的核心损失函数
前面一部分是在模块间切换的熵率,后面一部分是在每个模块内发生事件(visit不同的节点&退出模块)的熵率。
对于层次infomap的话,其实就是把L(M)扩展成三个公式:
第一个公式:在最顶层模块间切换的熵率:
(1)
其中是在最顶层不同i模块之间切换的事件的概率和,q左箭头H(Q)就是熵率。后面一部分就是在i模块内发生的事件切换的熵率。
第二个公式:中间层模块事件的熵率:
前面一项就是在中间层模块i会发生的事件的概率之和
包括退出i模块,以及进入i模块中的某一个j模块的事件概率
后面一项就是在i模块下面的j模块会发生的事件的熵率
第三个公式:底层模块内事件的熵率
这个就和单层infomap的公式的第二项一样了,最底层模块不再包含更细粒度的模块,直接对应每一个节点。在这个模块内,发生的事件就是visit每一个节点,或者退出这个模块。
损失函数定义就说完了,那么具体怎么进行模块划分呢?算法可以从"粗粒度"和"细粒度"两个方向上实现层次聚类:“粗粒度”就是把不同子模块合并起来,“细粒度”就是对每一个子模块进行细分,看合并/细分操作能否降低L(M)。对某一个分支,如果不能进一步降低L(m),那么递归搜索就不会继续沿这一分支向更深层级搜索。