矩阵乘法复杂度分析

矩阵乘法复杂度分析一背景在很多机器学习或者数据挖掘论文中 里面或多或少的涉及到算法复杂度分析 进一步思考 是如何得到的呢 很长时间里 我也感受到比较疑惑 阅读论文过程中 在涉及到这部分内容时 会直接跳过算法复杂度分析这快 其一是因为比较烧脑 虽然知道复杂度分析是对算法总体上的概况 用来进行算法间好坏的比较 由此可见 作要性 其二是算法分析基础比较薄弱 个人主观上也是不想的 算法复杂度在 数据结构 课程中也或多或少的涉猎 说完全不知道属于自己骗自己 简单的一些例子还是会分析的 但当涉及到复杂的目标方程

一 背景

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

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

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

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

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

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

二  矩阵乘法

对于矩阵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 
  

一个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 
  

同样的,一个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)表示计算矩阵乘法复杂度分析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228152.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:41
下一篇 2026年3月16日 下午7:42


相关推荐

  • 科技前哨|KIMI K2火遍外网:月之暗面逆袭了吗?

    科技前哨|KIMI K2火遍外网:月之暗面逆袭了吗?

    2026年3月12日
    3
  • 模糊数学 1、模糊集、隶属度函数、如何确定隶属度函数

    模糊数学 1、模糊集、隶属度函数、如何确定隶属度函数nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 集合的概念 一些具有相同特征的不同对象构成的全体 也称集或者经典集合 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 经典集合的特征函数 和模糊集的隶属度函数一样 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp amp nb

    2026年3月20日
    1
  • matlab 加权回归估计_matlab代码:地理加权回归(GWR)示例

    matlab 加权回归估计_matlab代码:地理加权回归(GWR)示例【实例简介】地理加权回归(GWR)matlab代码,亲测可用,该代码利用matlab实现了地理加权回归的代码,内附实际算例。【实例截图】【核心代码】functionresult=gwr(y,x,east,north,info);%PURPOSE:computegeographicallyweightedregression%—————————–…

    2022年10月6日
    4
  • pytorch tensor类型转换_pytorch转caffe

    pytorch tensor类型转换_pytorch转caffetorch.Tensor类型的数据loss和acc打印时,如果写成以下写法print(‘batch_loss:’+str(loss.data)+’batchacc:’+str(acc.data))则不仅会打印出loss和acc的值,还会打印出device信息和tensor字样,如下:如果仅想打印出数值,使得打印出的信息更加简洁,则要用以下写法print(‘batch_loss:{:.3f}ba…

    2022年10月10日
    4
  • 树莓派 Node Red

    树莓派 Node RedNode RED 目标 在树莓派上 零编程 快速搭建一个 MQTTclient 简介官网 https nodered org 简介 基于浏览器的流编辑 Node RED 提供了一个基于浏览器的流编辑器 可以使用调色板中广泛的节点轻松地将流连接到一起 然后 只需单击一次 就可以将流部署到运行时 可以使用文本编辑器在编辑器中创建 JavaScript 函数 内置库允许您保存有用的函数 模板或流以供重用 构建在 Node js 之上构建在 Node js 上的轻量级 运行 充分利用了它的事件驱动 非阻

    2026年3月16日
    2
  • idea2021全家桶激活破解方法

    idea2021全家桶激活破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    211

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号