马尔可夫聚类算法

马尔可夫聚类算法(Markov Clustering Algorithm,MCL)是一种用于图聚类的算法,广泛应用于生物信息学、社交网络分析、推荐系统等领域。

其核心思想是模拟随机游走过程,通过迭代地扩散和收缩图上的概率分布来识别图中的自然聚类或社区结构。

马尔可夫聚类算法的核心步骤

  1. 构建转移矩阵

    1. 对于给定的图,生成转移矩阵(Markov Matrix),其中每个元素表示从一个节点转移到另一个节点的概率。

    2. 设图的邻接矩阵为 A,转移矩阵 M 的元素定义为

      M_{ij} = \frac{A_{ij}}{\sum_k A_{ik}}

      ,即从节点 i 转移到节点 j 的概率是节点 i 的所有边的权重的归一化值。

  2. 扩散(扩展)操作:

    • 对转移矩阵进行幂运算 Mr,通常 r=2。这相当于模拟多步随机游走,使得概率分布扩散开来。

    • 扩展步骤是为了使节点间的相似性得以传播,能捕捉到较长路径上的信息。

  3. 收缩(膨胀)操作

    • 对转移矩阵的每个元素进行逐项幂操作

      M_{ij} = M_{ij}^\alpha

      ,然后重新归一化。通常,膨胀因子 α 取值大于1。

    • 膨胀步骤是为了增强高概率路径,同时抑制低概率路径,这样能把概率集中在更紧密相关的节点上,从而分离出聚类。

  4. 归一化

    • 收缩操作后需要重新归一化矩阵,使得每行的概率和为1,以确保结果仍然是一个有效的转移矩阵。

  5. 迭代

    • 不断重复扩散和收缩操作,直到矩阵收敛,得到稳定的概率分布。收敛时,转移矩阵的列通常会收敛到一些特定的块结构,这些块对应图中的不同聚类。

  6. 解码聚类

    • 通过观察收敛后的矩阵,确定聚类。一般来说,转移矩阵的每一列的高值(接近1)集中在特定的行上,这些行就代表了同一个聚类。

算法优点

  • 自适应性:不需要预先指定聚类的数量。

  • 适应性强:可以很好地处理带有噪声的网络。

  • 捕捉复杂结构:能有效捕捉到网络中的复杂拓扑结构。

算法缺点

  • 参数选择:膨胀因子和扩展次数的选择对结果有较大影响。

  • 计算复杂度:对于大规模图,计算量较大,需要有效的矩阵运算方法。

算法实现

import numpy as np

def add_self_loops(matrix):
    """在对角线上添加自环(self-loops)"""
    np.fill_diagonal(matrix, 1)
    return matrix
def normalize(matrix):
    """归一化矩阵使其行和为1"""
    return matrix / np.sum(matrix, axis=1, keepdims=True)

def expand(matrix, power):
    """对矩阵进行幂次乘法"""
    return np.linalg.matrix_power(matrix, power)
def inflate(matrix, power):
    """对矩阵元素逐元素幂乘"""
    return normalize(np.power(matrix, power))

def converged(matrix1, matrix2, tol=1e-5):
    """检查矩阵是否收敛"""
    return np.all(np.abs(matrix1 - matrix2) < tol)

def mcl(graph, expand_factor=2, inflate_factor=2, max_iterations=100, tol=1e-5):
    """执行马尔可夫聚类算法"""
    # 创建初始转移矩阵
    matrix = add_self_loops(graph)
    matrix = normalize(matrix)

    for i in range(max_iterations):
        print(f"Iteration {i+1}")
        previous_matrix = matrix.copy()
        # 扩展
        matrix = expand(matrix, expand_factor)
        # 收缩(膨胀)
        matrix = inflate(matrix, inflate_factor)
        # 检查收敛
        if converged(previous_matrix, matrix, tol):
            break

    return matrix

def extract_clusters(result_matrix):
    """
    从 result_matrix 中提取聚类。
    :param result_matrix: 马尔可夫聚类算法得到的稳定转移矩阵
    :return: 每个节点的聚类标签
    """
    # 获取每一行的最大值索引,这些索引代表聚类标签
    cluster_assignments = np.argmax(result_matrix, axis=1)
    return cluster_assignments

def group_nodes_by_cluster(cluster_assignments):
    """
    将节点按聚类分组。
    :param cluster_assignments: 每个节点的聚类标签
    :return: 每个聚类包含的节点列表
    """
    clusters = defaultdict(list)
    for node, cluster in enumerate(cluster_assignments):
        clusters[cluster].append(node)
    return clusters
# 示例图(邻接矩阵)
graph = np.array([
    [0, 1, 1, 0, 0, 0],
    [1, 0, 1, 1, 0, 0],
    [1, 1, 0, 0, 0, 0],
    [0, 1, 0, 0, 1, 1],
    [0, 0, 0, 1, 0, 1],
    [0, 0, 0, 1, 1, 0]
])

# 执行MCL
result_matrix = mcl(graph)

# 提取聚类信息
cluster_assignments = extract_clusters(result_matrix)
clusters_grouped = group_nodes_by_cluster(cluster_assignments)

print("Cluster Assignments:", cluster_assignments)
print("Grouped Clusters:", clusters_grouped)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/735151.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python17 多进程multiprocessing

1.多进程与多线程的区别 在Python中&#xff0c;多线程&#xff08;multithreading&#xff09;和多进程&#xff08;multiprocessing&#xff09;是两种并行执行任务的方式&#xff0c;它们有一些关键的区别&#xff1a; 进程和线程的基本区别&#xff1a; 进程&#xff1a;进…

【ajax基础】回调函数地狱

一&#xff1a;什么是回调函数地狱 在一个回调函数中嵌套另一个回调函数&#xff08;甚至一直嵌套下去&#xff09;&#xff0c;形成回调函数地狱 回调函数地狱存在问题&#xff1a; 可读性差异常捕获严重耦合性严重 // 1. 获取默认第一个省份的名字axios({url: http://hmaj…

第一次接触Swing

学习java版的HslCommunication发现使用的是Swing&#xff0c;所以了解了一下~ 了解&#xff1a; Swing是Java的标准库&#xff08;Java Foundation Classes, JFC&#xff09;的一部分&#xff0c;用于构建桌面应用程序的图形用户界面&#xff08;GUI&#xff09;。它是Java AWT…

Java程序之百鸡百钱问题

题目&#xff1a; 百钱买百鸡的问题算是一套非常经典的不定方程的问题&#xff0c;题目很简单&#xff1a;公鸡5文钱一只&#xff0c;母鸡3文钱一只&#xff0c;小鸡3只一文钱&#xff0c;用100文钱买一百只鸡,其中公鸡&#xff0c;母鸡&#xff0c;小鸡都必须要有&#xff0c;…

JWT介绍及其基本使用

JWT介绍及其基本使用 官网&#xff1a;https://jwt.io/ 什么是JWT 全称&#xff1a;JSON Web Token&#xff08;JSON Web令牌&#xff09; 一个开放标准(RFC 7519) &#xff0c;它定义了一种紧凑和自包含的方式&#xff0c; 用于作为 JSON 对象在各方之间安全地传输信息。此信…

Day 30:100344. 使二进制数组全部等于1的最小操作次数Ⅰ

Leetcode 100344. 使二进制数组全部等于1的最小操作次数Ⅰ 给你一个二进制数组 nums 。 你可以对数组执行以下操作 任意 次&#xff08;也可以 0 次&#xff09;&#xff1a; 选择数组中 任意连续 3 个元素&#xff0c;并将它们 全部反转 。 反转 一个元素指的是将它的值从 0 变…

云资源管理系统-项目部署

云资源管理系统-项目部署 大家好&#xff0c;我是秋意零。 今天分享个人项目同时也是个人毕设项目&#xff0c;云平台资源管理系统。该系统具备对OpenStack最基本资源的生命周期管理&#xff0c;如&#xff1a;云主机、云盘、镜像、网络。 该篇主要介绍&#xff0c;项目在Li…

idea2022激活

下载激活脚本 解压后&#xff0c;打开文件夹如下&#xff1a;ja-netfilter.jar 为激活补丁&#xff1a; 复制补丁所在的整个文件夹到硬盘某个位置 将 ja-netfilter补丁所在的整个文件夹移动到电脑上某个位置&#xff0c;我是放到了 D 盘下&#xff1a; &#xff08;路径中不…

【职场人】职场故事:与邀功精的共舞

在我的职业生涯中&#xff0c;我遇到过一位特别引人注目的同事&#xff0c;我们都叫他李经理。他的工作能力并不差&#xff0c;但他有一个习惯&#xff0c;那就是喜欢邀功。他的这种习惯&#xff0c;不仅让我印象深刻&#xff0c;也让我在合作中学会了不少东西。 恶心的四件事 …

包含网关的概念及案例演示

包容网关 知识点讲解 包容网关可以看作排他网关和并行网关的结合体。与排他网一样&#xff0c;可以在外出顺序流上定义条件&#xff0c;但与排他网关不同的是&#xff0c; 进行决策判读时&#xff0c;包容网关所有条件为true的后继分支都会被依次执行。如果所有分支条件都为fa…

【mysql】建库

通过命令建库&#xff1a; CREATE DATABASE database_name; 如果是用Workbench&#xff1a;

QuantML-Qlib Model | Kansformer: KAN+Transformer时序模型用于股票收益率预测

QuantML-Qlib Model | Kansformer&#xff1a; KANTransformer时序模型用于股票收益率预测 原创 QuantML QuantML 2024-06-18 20:57 上海 Content 之前公众号介绍了几篇KAN的文章&#xff0c;也做过KAN相关的模型&#xff1a; What KAN I say&#xff1f;KAN代码全解析 Qu…

android——Spinner下拉列表案例详解

使用案例 效果图&#xff1a; ![](https://img-blog.csdnimg.cn/20190327125727253.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0​ L3FxXzQwMjA1MTE2,size_16,color_FFFFFF,t_70) 代码实现&#xff1a; 下拉列…

Python中常见图形绘制

1、背景介绍 在点云三维重建中&#xff0c;常涉及到常见几何图形绘制&#xff0c;如直线、多边形、圆形、正方形、长方形等。因此&#xff0c;本次博客结合matplotlib库&#xff0c;介绍常见几何图形的绘制。 2、几何图形绘制 2.1 线段绘制 线段是一种常见的几何图形&#xff…

Pip换源秘籍:让你的Python包飞行起来!

在Python的包管理中&#xff0c;Pip是最重要的工具之一。它允许开发者从Python Package Index (PyPI)安装包&#xff0c;但有时由于网络问题或服务器负载过高&#xff0c;直接从PyPI安装包可能会非常慢。这时&#xff0c;更换Pip源到一个更快的镜像站点是一个常见的解决方案。本…

人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展|顶刊速递·24-06-23

小罗碎碎念 本期推文主题&#xff1a;人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展 这一期的推文是我发自内心觉得为数不多&#xff0c;特别宝贵的一篇推文&#xff0c;原因很简单——可参考的文献相对较少&方向非常具有研究意义&现在不卷。 数字病理…

洛谷P8502题解

[problem] \color{blue}{\texttt{[problem]}} [problem] [Solution] \color{blue}{\texttt{[Solution]}} [Solution] 这题最恶心的地方是卡空间。 我们先考虑不卡空间时怎么做。 直接并不好做&#xff0c;我们考虑正难则反&#xff0c;即利用容斥原理。答案应为从 a a a 没…

PostgreSQL如何定义缓冲区管理器?

目录 一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器 一、PostgreSQL是什么 PostgreSQL是一种高级的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加…

职升网:注安工程师适合用什么样的答题方法?

一、熟悉题型与答题方法&#xff1a; 不同科目和题型有不同的答题技巧。例如&#xff0c;选择题可采用排除法、关键词推理法及对比分析法等方式答题&#xff1b;案例分析题则需要全面考虑&#xff0c;逐条举例。 二、合理规划时间&#xff1a; 在考试时&#xff0c;要合理规…

ICP、ISP及IAP烧录介绍

文章目录 不同的程序下载方式一、ICP:In-Circuit Programming二、ISP:In-System Programming三、IAP:In-Application ProgrammingIAP方案设计不同的程序下载方式 目前,单片机的程序烧录方式可以分为三种:ICP、ISP、IAP。 ICP:In Circuit Programing,在电路编程; ISP:…