深度学习系列23:infomap进行聚类
Posted IE06
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习系列23:infomap进行聚类相关的知识,希望对你有一定的参考价值。
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的话,可以考虑进行加速:
以上是关于深度学习系列23:infomap进行聚类的主要内容,如果未能解决你的问题,请参考以下文章
数学建模MATLAB应用实战系列(106)-机器学习算法:K-means聚类(附MATLAB代码)
数据聚类|深度聚类Unsupervised Deep Embedding for Clustering Analysis(DEC)论文研读
数据聚类|深度聚类Unsupervised Deep Embedding for Clustering Analysis(DEC)论文研读