著名的Strassen矩阵乘法算法对我们来说是一种真正的享受,因为它将时间复杂度从传统的O(n 3)降低到O(n 2.8)。
但是在我所经历的所有资源中,甚至是Cormen和Steven Skienna的书中,他们显然都没有提到Strassen是如何考虑的。
Strassen矩阵乘法算法的基本原理是什么?这是一次幸运的事故还是其中更深层次的事情?
著名的Strassen矩阵乘法算法对我们来说是一种真正的享受,因为它将时间复杂度从传统的O(n 3)降低到O(n 2.8)。
但是在我所经历的所有资源中,甚至是Cormen和Steven Skienna的书中,他们显然都没有提到Strassen是如何考虑的。
Strassen矩阵乘法算法的基本原理是什么?这是一次幸运的事故还是其中更深层次的事情?
Answers:
除了Strassen,没有人能告诉您Strassen是如何得到他的想法的。我可以告诉你Howeber¹,前提是您对代数几何和表示理论感兴趣,那么您将如何自己找到该公式。这也为您提供了显示Strassen公式的工具,或更准确地说,没有公式可以计算使用少于7个乘法的两个2×2矩阵的乘积。
由于您对矩阵感兴趣,因此我假设您知道基本的线性代数,并且对于更高级的细节将有点模糊。
首先让E为从平面到平面的所有线性映射的集合。这基本上是所有2×2矩阵的集合,但是我们忘记了一个特定的坐标系-因为,如果有比“默认坐标系”更好的坐标系,我们可能会对将其用于矩阵乘法感兴趣。我们还表示由ˆ的对偶空间È和由X = P(E⊗E†⊗E†)相关联的张量积的射影空间E⊗E†⊗E†。
特殊形式[c⊗α⊗β]的X = P(E⊗E†⊗E†)的元素可解释为对矩阵的基本运算,在某些适当的坐标系中,该运算读取矩阵的系数A和矩阵B的系数,并将这些系数的乘积写在某个矩阵C中。的一般元件X是这些基本操作的组合,所以产品π两个矩阵的,理解为从一个地图P(E)×P(E)至P(E),是在一个点X。
通常的矩阵式产品和Strassen的公式可以表示为这些线性操作的组合,所以让我通过表示W 1设定这些基本操作的[c⊗α⊗β] ,让我几何描述它们的组合。
让W 2是各种割线的W 1在X.它是通过采取全力以赴线联盟(的关闭),通过两个(通用)点获得的W1。我们可以将它视为两个元素运算的所有组合的集合。
让W 3是不同的割面的的W1在X.它由率先通过三(通用)点去所有平面的工会(的关闭)获得的W 1。我们可以将它视为三个元素运算的所有组合的集合。
同样,我们为更高的索引定义了割线变种。注意,这些变体越来越大,即W₁⊂W2⊂W₃⊂⋯,因此经典矩阵乘积公式表明矩阵的乘积是W₈的一个点。其实
PROPOSITION(Strassen)-矩阵π的乘积位于W₇中。
据我所知,斯特拉森并没有那样说,但这是从几何角度看这个问题。这种观点非常有用,因为它还使您证明Strassen的公式是最佳的,即π不位于W₆中。这里开发的几何方法也可以用于更广泛的问题。
希望我能引起您的好奇。您可以阅读Landsberg和Manivel的这篇文章,以进一步了解:
http://arxiv.org/abs/math/0601097
¹由于我感冒了,所以我不会解决这种错字。
我刚刚被分配做家庭作业的任务,我以为我有一个简洁的顿悟:Strassen的算法牺牲了其求和组件的“宽度”,以便使用较少的操作来换取“更深的”求和组件仍然可以用来提取最终答案。(这不是最好的说法,但是我很难解释)。
我将使用将两个复数相乘的示例来说明“ 操作与组件 ” 的平衡:
请注意,我们使用了4个乘法,结果得到4个乘积成分:
请注意,我们想要的2个最终组成部分:复数的实部和虚部实际上是线性方程式:它们是标度乘积的总和。因此,我们在这里处理两个操作:加法和乘法。
事实是,如果我们简单地添加或减去我们的组件,我们的4个产品组件就可以代表我们的2个最终组件:
但是,我们的最后2个组成部分可以表示为乘积之和。这是我想出的:
如您所见,实际上我们只需要3个不同的产品组件即可完成最后两个组件:
可是等等!每个大写字母本身就是产品!但是要注意的是,我们知道我们可以从(a + b)(c + d)生成(A + B + C + D),这仅是1乘法。
因此,最后,我们的算法进行了优化,以使用更少但更“简单”的组件,在其中我们将乘法量换成更多的求和运算。
造成这种情况的部分原因是分配属性,该属性使A(B + C)等效于(AB + AC)。请注意,如何使用1个加法和1个乘法运算来计算第一个,而第二个则需要2个乘法和1个和。
Strassen的算法是我们应用于复数产品的优化的扩展,除了存在更多目标产品术语以及可能用于获得这些术语的更多产品组件之外。对于2x2矩阵,Strassen算法将需要8次乘法的算法变形为需要7次乘法的算法,并利用分布特性将两个乘法“合并”到一个运算中,而取而代之的是从新的“ fatter”节点中提取一个产品条款或其他,等等。
一个很好的例子:获得(-1)和(2)和(5),您可以将其视为(-1),(2),(5),或者将其视为(2-3)。 ),(2),(2 + 3)。不过,第二个操作使用的区别数较少。问题在于,不同数字的数量等于您需要为矩阵乘法计算的乘积分量的数量。我们为此简单地进行优化,以找到基础操作的某个视图,该基础操作通过分布属性使用不同的变体来利用同构输出。
也许这可以某种方式链接到拓扑?这只是我外行的理解方式。
编辑:这是我在进行复数解释的过程中绘制的笔记的图片: