1. 原理与安装

安装:最新版本安装有点问题,pip install infomap==1.0.1
原理:图中随机游走时,若节点间转换的概率一样,则随机游走在群内停留时间更长。infoMap 的想法是将每个节点的编码分为两个部分模块码和节点码,模块码用于区分图中不同的群,节点码用于区分相同模块内不同节点。不同模块节点的模块码不同,但节点码可能相同。
实现:1. 计算节点访问概率:对于每个节点 ,有两种方式跳转:要么以 1-r 的概率从节点 a 的连接边中选择一条边进行跳转,选每条边的概率正比于边的权重;要么以 r 的概率从节点 a 随机的跳到图上其他任意一点。重复直到收敛,得到转移概率矩阵;2. 对图里的节点随机采样出一个序列,按顺序依次尝试将每个节点赋给邻居节点所在的社区,取平均比特下降最大时的社区赋给该节点,如果没有下降,该节点的社区不变,重复直至收敛。

2. 案例测试

这里是在线测试的网站:https://www.mapequation.org/infomap/
下面是简单的应用代码:

from infomap import Infomap

# Command line flags can be added as a string to Infomap
im = Infomap("--two-level --directed")

# Add weight as optional third argument
im.add_link(0, 1)
im.add_link(0, 2)
im.add_link(0, 3)
im.add_link(1, 0)
im.add_link(1, 2)
im.add_link(2, 1)
im.add_link(2, 0)
im.add_link(3, 0)
im.add_link(3, 4)
im.add_link(3, 5)
im.add_link(4, 3)
im.add_link(4, 5)
im.add_link(5, 4)
im.add_link(5, 3)

# Run the Infomap search algorithm to find optimal modules
im.run()

print(f"Found {im.num_top_modules} modules with codelength: {im.codelength}")

print("Result")
print("\n#node module")
for node in im.tree:
    if node.is_leaf:
        print(node.node_id, node.module_id)

3. api说明

详见:https://mapequation.github.io/infomap/python/infomap.html
通过im.codelength获得最后优化后的长度。

使用

im.add_node(2)
im.add_link(1, 2)

手动添加nodes和links,
可以使用下面的方式批量添加nodes和links:

im.add_nodes(range(4))
links = (
    (1, 2),
    (1, 3)
)
im.add_links(links)

另一种读文件的方式如下:

im = Infomap(silent=True, num_trials=10)
im.read_file("ninetriangles.net")
im.run()

此外可以读取networkx的网络:

import networkx as nx
from infomap import Infomap
G = nx.Graph([("a", "b"), ("a", "c")])
im = Infomap(silent=True)
mapping = im.add_networkx_graph(G)
mapping
{0: 'a', 1: 'b', 2: 'c'}
im.run()
for node in im.nodes:
    print(node.node_id, node.module_id, node.flow, mapping[node.node_id])

获取结果的几种方式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 配合faiss

见https://github.com/xiaoxiong74/face-cluster-by-infomap,在开源数据集上达到了SOTA的效果。
我们看一下face-cluster-by-infomap.py的核心代码,并不复杂:
在这里插入图片描述

其中有一个重要的方法就是get_links了,使用faiss加速,这里使用的是取top-k然后排序的方式。如果有GPU的话,可以考虑进行加速:
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐