矩阵乘法复杂度分析

2023-11-08

一 背景

在很多机器学习或者数据挖掘论文中,里面或多或少的涉及到算法复杂度分析。进一步思考,是如何得到的呢?

很长时间里,我也感受到比较疑惑,阅读论文过程中,在涉及到这部分内容时,会直接跳过算法复杂度分析这快。

其一是因为比较烧脑。虽然知道复杂度分析是对算法总体上的概况,用来进行算法间好坏的比较(由此可见,重要性)。

其二是算法分析基础比较薄弱(个人主观上也是不想的)。

算法复杂度在《数据结构》课程中也或多或少的涉猎,说完全不知道属于自己骗自己,简单的一些例子还是会分析的,但当涉及到复杂的目标方程是,特别是含矩阵运算,就不知道如何分析了。也没有领路人,不知道如何下手。随着看的论文数量上升,慢慢摸索过程中突然就通了,知道如何去分析了。写这篇博客的目的希望读者能够明白如何对矩阵乘法进行复杂度分析,少走一些弯路。笔者先介绍2个矩阵相乘复杂度,然后介绍3个矩阵相乘复杂度,最后介绍几篇论文里面的loss方程,如何运用矩阵乘法复杂度去分析算法的好坏。

需要的基础,初步了解《数据结构》第一章知识,至少知道算法复杂度是什么以及如何表示。

什么是矩阵乘法?(熟悉同学可以跳过)

矩阵乘法:矩阵乘法(英语:matrix multiplication)是一种根据两个矩阵得到第三个矩阵的二元运算,第三个矩阵即前两者的乘积,称为矩阵积

二元运算:需要2个对象参与,这里指2个矩阵。

条件:它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义

二  矩阵乘法

对于矩阵A(n*m),B(m*n), 这里A(n*m)表示A是n行乘m列的矩阵。

如果A*B,那么复杂度为O(n*m*n),即O(n^2m) 。进一步思考,为什么呢,直接代码解释:

 for(i=0;i<n;i++){ //A矩阵中的n 行
        for(j=0;j<n;j++){  //B矩阵中的n  列
            for(k=0;k<m;k++){ //A矩阵中的m 或者B矩阵中的m ,一样的
                C[i][j]= C[i][j]+A[i][k]*B[k][j]; 
             } 
         } 
     }

一个for循环是O(n),这里是三个for循环,所以为O(n*m*n)。(ps:个人感觉还是看代码比较好理解,后面三个矩阵乘法时,就会更加体会到)

二  三个矩阵乘法

对于矩阵A(m*n),B(n*m)和C(m*n),            这里A(m*n)表示A是m行乘n列的矩阵。(PS:这里记号和前面不同,主要方便和知乎截图符号一致)

  • A*B,那么复杂度为O(m*n*m),即O(m^2n) 。
  • D(m*m)=A*B运算完后在和C运算。
  • D*C,那么复杂度为O(m*m*n),即O(m^2n) 。

与(A*B)*C等价。整个过程算法复杂度为O(m^2n) 。(一开始笔者以为是O(m^2n)*O(m^2n) = O(m^4n^2), 其实这样理解是错的,下面介绍)

这里与知乎这篇一致,截图如下:

为了方面理解,笔者直接上代码,这样清楚一点。

int A(m*n),
int B(n*m)
int C(m*n)

int D(m*m)
int E(m*n)

//先计算D=A*B
 for(i=0;i<m;i++){ //A矩阵中的 m-行
        for(j=0;j<m;j++){  //B矩阵中的 m-列
            for(k=0;k<n;k++){  //A矩阵中的n 或者B矩阵中的n ,一样的
                D[i][j]= D[i][j]+A[i][k]*B[k][j]; 
             } 
         } 
     }

//在计算E=D*C

 for(i=0;i<m;i++){ //D矩阵中的 m-行
        for(j=0;j<n;j++){  //C矩阵中的 n-列
            for(k=0;k<m;k++){  //D矩阵中的m 或者C矩阵中的m ,一样的
                E[i][j]= E[i][j]+A[i][k]*B[k][j]; 
             } 
         } 
     }

同样的,一个for循环是O(n),这里的第一次三个for循环,矩阵乘法复杂度为O(m*n*m)=O(m^2n)。

第二次为O(m^2n)

但因为是顺序执行,所以总的复杂度是相加而不是相乘。

故为O(m^2n)+O(m^2n)

= O(2*m^2n)

= O(m^2n),在算法分析过程中,系数可以忽略

上面写的是伪代码,随手敲的,思想理解到就行。

四 loss方程复杂度分析

论文1: Fast Attributed Multiplex Heterogeneous Network Embedding, CIKM,2020.  需要的可以自己下载。

目标方程截图如下:

算法复杂度为O(n^3*K  + n^2*m  + n*m*d),  计算方向从左到右。其中A(n*n), X(n*m)  ,R(m*d), K为累加次数(相当于在外面加了一个for循环,遍历K次)

O(n^3*K)表示计算,这里读者可能会比较懵,阅读原文会发现,这里的\alpha _i也是一个n*n的方阵,所以有n^3,在外面套一个for循环累加,就是K*n^3。

O(n^3*K  + n^2*m)表示计算

O(n^3*K  + n^2*m  + n*m*d)则表示全部过程。

作者后面做了计算优化,把算法负责度由O(n^3*K  + n^2*m  + n*m*d) 降到了O(K*e*n  + n*m*d)

O( n*m*d) 表示计算

O(K*e*n)表示计算

五 更多

复数矩阵相乘 可以参考这篇博客,矩阵里面的元属变成复数就好了。

对于一个复数矩阵求逆的复杂度,可以参考笔者的普通矩阵求逆的复杂度

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

矩阵乘法复杂度分析 的相关文章

  • 代理模式 【设计模式之禅作者】

    代理模式 12 1 我是游戏至尊 2007年 感觉很无聊 于是就玩了一段时间的网络游戏 游戏名就不说了 要不就有做广告的嫌疑 反正就是打怪 升级 砍人 被人砍 然后继续打怪 升级 打怪 升级 我花了两个月的时间升级到80级 已经很有成就感了
  • Leetcode每日一题:57. 插入区间

    原题 给你一个 无重叠的 按照区间起始端点排序的区间列表 在列表中插入一个新的区间 你需要确保列表中的区间仍然有序且不重叠 如果有必要的话 可以合并区间 示例 1 输入 intervals 1 3 6 9 newInterval 2 5 输
  • 00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问(kafka)

    产生此问题的原因 在window下使用kafka导致 在linux下使用kafka没有此问题 window下kafka报错 linux下kafka正常
  • 文本挖掘学习笔记(二):文档信息向量化与主题关键词提取

    注 学习笔记基于文彤老师文本挖掘的系列课程 全文基于 射雕英雄传 语料库 下面是读入数据的一个基于Pandas的通用操作框架 读入为数据框 import pandas as pd from matplotlib import pyplot
  • element表格复选框,弹框关闭取消选择

    弹框表格复选框清空 this nextTick gt this refs tabledata clearSelection
  • 面向工业物联网的拍赫兹通信

    摘要 相比于传统无线射频通信 拍赫兹通信 PetaCom petahertz communication 具有高速率 低时延和高确定性等显著优势 在工业物联网 IIoT industrial internet of things 中可以发挥
  • [1178]数据库like和rlike区别

    like 通配符 使用时需指定具体值 如 用like筛选某张表姓张的人全部信息 或名字叫张三的信息 张或张三就必须写为具体值 sql语法的 模糊匹配 通配符 代表零个或任意字符 代表1个字符 rlike 正则 模糊查询 区间范围判断 如 用
  • 链表问题处理

    今天主要是对一些链表相关问题的理解和处理 下面所有问题处理的都是这种链表 struct ListNode int val struct ListNode next 话不多说 我直接进入正题 1 删除链表中等于给定值 val 的所有节点 给你
  • 【音效处理】Reverb 混响算法简介

    系列文章目录 Delay Line 简介及其 C C 实现 LFO 低频振荡器简介及其 C C 实现 音效处理 Delay Echo 简介 音效处理 Vibrato 简介 文章目录 系列文章目录 一 混响 二 人工混响 三 数字混响算法 3
  • 最大化TensorFlow* CPU性能

    用户可以在v2 5之后的官方x86 64 TensorFlow 设置环境变量TF ENABLE ONEDNN OPTS 1来启用这些CPU优化 export TF ENABLE ONEDNN OPTS 1 大多数建议都适用于官方x86 64
  • 在有NVIDIA显卡的机器上安装Ubuntu 18.04 LTS的一些建议

    在装有NVIDIA显卡的机器上安装Ubuntu 18 04 LTS的一些建议 如果安装途中出现问题 导致不能正常进入系统 请看以下步骤 一 编辑Grub Ubuntu的引导程序 二 root下更改 三 重启进入系统 下载驱动 如果安装途中出
  • Raven2渗透

    1 实训目的 通过此次实验来学习对Raven2的渗透 Raven 2是中级boot2root VM 有四个要捕获的标志 在多次破坏之后 Raven Security采取了额外的措施来加固其Web服务器 以防止黑客 找到四个flag 学习一些
  • /etc/login.defs配置文件详解

    etc login defs 文件是用来定义创建用户时需要的一些用户配置信息 如创建用户时 是否需要家目录 UID和GID的范围 用户及密码的有效期限 家目录的权限 密码加密方式等等
  • SpringBoot开发使用篇(2)—数据层解决方案

    目录 一 数据层解决方案 1 1 SQL 1 1 1 数据源配置 Hikari 1 1 2 持久化技术 JdbcTemplate 1 1 3 H2数据库 1 2 NoSQL 1 2 1 Redis 1 2 2 Mongodb 1 2 3 E
  • 链式法则

    2个事件同时发生的概率 P a b P a b P b 其中 P a b 表示 a和b事件同时发生的概率 P a b 是一个条件概率 表示在b事件发生的条件下 a发生的概率 3个事件的概率链式调用 P a b c P a b c P b c

随机推荐

  • 三、Linux网络编程:Socket编程-网络模型

    3 Socket编程 网络模型 3 1 OSI七层模型 图解 每层的功能 模型 功能 物理层 比特流传输 数据链路层 网络控制 链路纠错 网络层 寻址 路由 传输层 建立主机端到端的连接 会话层 建立 维护和管理会话 表示层 格式转化 加密
  • 解决sqlplus /as sysdba登陆oracle无效

    安装完oracle 然后执行完下面的自动配置脚本后 没有任何地方设置过密码 etc init d oracledb ORCLCDB 19c configure 在这个命令执行完成后 会提醒查看完整日志的地方 Look at the log
  • C语言100例 第一天习题练习

    C语言中基本的输入与输出 例题1 输入两个正整数a和b 输出a b的值 其中a b 10000 include
  • Centos7 开机卡死在桌面

    问题 Centos7 开机死卡成了这样 一动不动 如下图 原因 一般来说是一些开机自启的东西使得Centos卡死 有可能是在 etc rc d rc local文件里加入的脚本 也有可能 etc fstab文件里面自动挂载的硬盘 解决方法
  • 【自然语言处理】情感分析(三):基于 Word2Vec 的 LSTM 实现

    情感分析 三 基于 Word2Vec 的 LSTM 实现 本文是 情感分析 系列的第 3 3 3 篇 前两篇分别是 自然语言处理 情感分析 一 基于 NLTK 的 Naive Bayes 实现 自然语言处理 情感分析 二 基于 scikit
  • jmeter调试错误大全

    一 前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题 但是无从下手 不知道从哪里开始找起 对于初学者而言这是一个非常头痛的事情 这里结合笔者的经验 总结出以下方法 二 通过查看运行日志调试问题 写好脚本后 可以先试着运
  • 【保姆级】Python最新版3.11.1开发环境搭建,看这一篇就够了(适用于Python3.11.2安装)

    工欲善其事必先利其器 在使用Python开发程序之前 在计算机上搭建Python开发环境是必不可少的环节 目前Python最新稳定版本是3 11 1 且支持到2027年 如下图所示 本文手把手带你从0 到1搭建Python最新版3 11 1
  • 如何在Mac上远程控制另一台Mac

    1 先请在苹果 Mac 电脑上的 系统偏好设置 窗口中打开 共享 功能 2 接着在共享窗口中的左侧点击启用 屏幕共享 选项 3 当屏幕共享功能打开以后 请点击 电脑设置 按钮 4 随后请勾选二个选项 VNC 显示程序可以使用密码控制屏幕 并
  • 异步赠书:9月重磅新书升级,本本经典

    本期活动已结束 新活动地址 http blog csdn net epubit17 article details 78210459 获奖读者名单 如下 领取赠书步骤 1 加入异步社区活动QQ群439467328 2 在下方地址中填写收件信
  • java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决

    jetty 9 嵌入式开发时 启动正常 但是页面一浏览就报错如下 java lang NoSuchMethodError javax servlet http HttpServletRequest isAsyncStarted Z 原因 j
  • 用i18n 实现vue2+element UI的国际化多语言切换详细步骤及代码

    一 i18n的安装 这个地方要注意自己的vue版本和i1n8的匹配程度 如果是vue2点几 记得安装i18n的 8版本 不然会自动安装的最新版本 后面会报错哦 查询了下资料 好像最新版本是适配的vue3 npm install vue i1
  • angular请求的防抖(debounce)

    在开发项目过程中 我们会遇到这样的场景 当用户在搜索框中输入名字时 当用户输入完毕后 自动发送搜索请求 实时响应 而不是多按一个按钮或者回车键 如果按照常规思路 我们会绑定input的keyup事件 每次击键后 执行相对应的请求函数 但是
  • MyBatis 3 提示 Column ‘******‘ specified twice

    造成错误的原因是 Mapper xml 配置文件 insert 语句写入重复字段 错误配置文件展示
  • 如何进行本地分支管理

    文章目录 如何进行本地分支管理 Git进行分支管理 显示分支一览表 创建分支 转到新创建的分支 创建分支并转到新创建的分支 分支合并 删除分支 冲突合并 Tortoise进行分支管理 显示分支 创建分支 切换分支 分支合并 冲突合并 VS2
  • 绕过__chkesp堆栈检查

    前面很多注入相关的文章中都提到为了保证注入后原始程序能恢复正常的执行流 需要在编译器中关闭堆栈检查 为了解决问题 这是个好手段 但是不得不说这是回避问题 不是根本上解决问题 本文旨在解决这个问题 vs用 chkesp来实现堆栈检查 chke
  • 工业制造业亟需数字化转型,区块链可以发挥哪些价值?

    智能信息化技术驱动的第四次工业革命正推动制造业积极拥抱物联网 云计算等新技术进行数字化 智能化转型升级 制造业是一个纷繁复杂的庞大网络 不仅涉及机器 零件 产品等实体还有机器制造商 物流公司 销售等诸多利益相关方 在当今数字化时代中 如何帮
  • 如何防止小人对你的网站进行反向代理

    引言 如果是小站或者刚建立的站 则不用担心 但如果有名气了 便可能出现小人反代你的网站 做成所谓的 镜像站点 盗版站点 这篇文章就是介绍如何防止一些简单的反代小人 实施方法 一 使用 htaccess禁止反向代理 在站点根目录下新建 hta
  • android根据物理按键上下选中listview的item,回车进入点击相应事件

    最近做扫码枪程序 因应用于冷库 用户需求在列表选择上可以用上下键代替滑动 所以做了一个小demo 记录一下 话不多说 直接上代码 1 布局文件很简单 主界面 一个输入框一个列表 因为是手持采集枪 输入框经常用到 所以在做demo的时候也加上
  • Mac终端(Terminal)自定义颜色,字体,背景 & Mac系统如何显示隐藏文件?& mac下载gcc并测试

    Mac终端 Terminal 自定义颜色 字体 背景 1 打开终端 输入 git clone git github com altercation solarized git下载Solarized 2 clone完成后 打开 然后打开 3
  • 矩阵乘法复杂度分析

    一 背景 在很多机器学习或者数据挖掘论文中 里面或多或少的涉及到算法复杂度分析 进一步思考 是如何得到的呢 很长时间里 我也感受到比较疑惑 阅读论文过程中 在涉及到这部分内容时 会直接跳过算法复杂度分析这快 其一是因为比较烧脑 虽然知道复杂