从程序员的角度来看矩阵乘法

翻译小组成员介绍: Alex

Alex,英语爱好者,现工作于洛阳

翻译小组成员介绍: 向海飞

武汉市人,2002年华中理工大学应用电子技术专业本科毕业。现在洛阳工作。

文章: betterexplained.com/articles/matrix-multiplication/
译者: Alex    校对: 向海飞     版面: 公理

程序员看矩阵乘法

A Programmer's Intuition for Matrix Multiplication

矩阵乘法意义何在?常人的直觉是:

1)矩阵乘法缩放/旋转/扭曲几何图形

初学向量时,会觉得矩阵乘法是一种强有力的工具:向量与矩阵相乘,产生新向量。遗憾的是,这可能会使得思维过分依赖形象化。

20个家庭参加烧烤派对,如何估算热狗数量?(嗯...20个家庭,每个家庭3个人,每个人2个热狗...20*3*2=120个热狗。)

你可能不会考虑建一个“受邀家庭-家庭人数-食量”的三维矩阵。如果仅为处理数据,相比多维向量,我更习惯使用多维矩阵。

2)矩阵乘法构成线性运算

技术上的准确定义是:矩阵相乘产生新矩阵;新矩阵可视为两个原函数的复合函数。然而,有时参与运算的矩阵不是线性算子,而是一组矢量或数据点集。为此我们需要另一种直觉来体会其中的意涵。

我待会就从程序员视角解读矩阵乘法。

3)矩阵乘法与信息流有关,它将数据转换成代码,或者反之。

我把线性代数看做是“数学表格”:

  • 我们将信息存储在各种电子表格中(“矩阵”);

  • 部分数据被视为函数,另外可以当做数据点集;

  • 我们的视角会从不同的上下文来变化;

有时我会把数据看作几何向量,有时我会把矩阵看作复合函数。但我更多的是考虑信息在分析系统中的流动。(有些纯粹主义者不愿意漂亮的代数结构堕落成乏味的电子表格,但对此我毫不介意。)

程序员直觉:代码即数据,数据即代码

Programmer's Intuition: Code Is Data Is Code

就线性代数而言, 以原始信息"3 4 5"为例。可依其书写形式,将它视为向量(vector, 下图右部)或视为函数(function, 下图左部所示):

标准解释

依惯例,纵列为向量(上图右),横列视为函数(上图左):

  • [3; 4; 5]是指 x = (3, 4, 5)。x 为向量(行间以分号;区分)

  • [3 4 5]是指f(a, b, c) = 3a + 4b + 5c,一个三输入参数单个输出结果的函数。

提示:代码即数据,数据即代码

代码与数据等价

水平形式的那个三元函数(三维行向量)等同于3个一维向量. 而垂直的1 个三维列向量等同于3个一元函数(每个函数可以传入一个参数)。

简而言之:依据目标输出,确定数据和代码的组合顺序。

矩阵转置

The Matrix Transpose

矩阵转置运算会交换行和列。例如:

若 x 是三维列向量([3; 4; 5]),则 x' 为:

  • 1个三元函数([3 4 5])

  • x' 虽仍为向量,但已成为三个独立的个体。矩阵的转置运算将向量“劈”开了。

同理,若f = [3 4 5]为行向量,则f' 为:

  • 1个列向量。

  • f' 被分成3个一元函数。

实际应用:

x' * x是指把向量 x 当做参数输入函数 x' 中,得到是点积后的结果。换言之,数据被应用于自身。

x * x' 是指一个单独数据 x' 输入到一组函数集 x 中,结果会输出一个网格。数据作用在函数之上,对应形成网格上的点。这里,数据被应用于自身所有排列之上。

应用直觉

Putting The Intuition To Use

唷!这对我们有什么帮助?下例中的式子来自机器学习中线性回顾章节(很快[遇见翻译小组]会介绍此部分):

程序员的初步印象:上式中,参数集 θ' 被视为函数,输入参数 x,得一单值结果。

再比如另外一个复杂推导结果如下所示:

上式难理解,是因为数据被以行向量(而非列向量)的形式存储于矩阵之中。但程序员总是有办法。利用矩阵转置,我们可以判断输出何时为单个数值,何时为“排列网格”。

几何缩放和线性组合各有所长,但是程序员还是喜欢站在“数据信息”的观点来看矩阵。“x 中的信息会视为函数,然后会被传入相应参数。”

简而言之,不要局限于单一直觉。乘法由重复的加法演变而来,可以看出在十进制数中能进行数值缩放,或是虚数可以理解为旋转, 再者积分为计算“面积”,等等。为何矩阵乘法就可以例外呢?

何以解忧,唯有数学!

附录:其他组合

Appendix: What About The Other Combinations?

读者也许会好奇,为什么不用其他组合,例如x x 或者 x' x'。原因很简单,相应的参数个数会对应不上:要么一个三元函数对应1个参数,要么一元函数对应3个参数。

应用直觉

Appendix: Javascript Interpretation

点积 x' x 可以描述为Java语句:

(function(a,b,c){ return 3*a + 4*b + 5*c; })(3,4,5)

定义1个三元函数,并赋予3个参数,返回结果为50。

利用简洁的数学符号,通过Octave/Matlab语言描述如下:

octave:2> [3 4 5] * [3 4 5]'

ans =  50

上式中,[3 4 5]为函数,[3; 4; 5]或者[3 4 5]' 为数据向量。

附录:ADEPT方法

Appendix: ADEPT Method

本文来自于学习TODO的课堂笔记:

TODO:直觉理解 X'X 的含义...直率地讲,该怎么做?

DONE:学习将代码看作数据,数据看作代码。列向量...数据,或者3个函数组成的序列。学习在它们之间自由切换;行向量...三元函数,或者3个数据元素。

所有组合的点积。第一行点乘第一行,第一行点乘第二行,第二行点乘第一行,第二行点乘第二行。

X'X=>自身点积,产生1个1*1矩阵

XX'=>所有组合的点积,产生1个n*n矩阵

作为程序员,我曾想用简洁的语言解释,为什么使用 x' x,而不用 xx' 。现在,我知道答案了。其实原因很简单:使用 x' x,我们可以将信息看作一个函数,并输入该信息作为函数的参数。(完)

「予人玫瑰, 手留余香」感谢支持遇见!

(0)

相关推荐

  • 从零开始,用Python徒手写线性回归

    关键时间,第一时间送达! 转自:机器之心 先放下 Scikit-learn,我们来看一看真正的技术. 对于大多数数据科学家而言,线性回归方法是他们进行统计学建模和预测分析任务的起点.这种方法已经存在了 ...

  • 《R语言实战》- 牛国庆

    [toc] 第一章 1.3.2 R中帮助函数 R中用于管理R工作空间的函数 函数setwd()不会自动创建一个不存在的目录.如果必要的话,可以使用函数dir.create()来创建新目录,然后使用se ...

  • 超详细的 Bert 文本分类源码解读 | 附源码

    本文详细的GitHub地址: https://github.com/sherlcok314159/ML 接上一篇: 你所不知道的 Transformer! 参考论文 https://arxiv.org ...

  • 性能度量RMSE

    回归问题的典型性能度量是均方根误差(RMSE:Root Mean Square Error).如下公式. m为是你计算RMSE的数据集中instance的数量. x(i)是第i个实例的特征值向量 ,y ...

  • 从程序员的角度来看DNA(2)

    人类DNA的代码长度 人类基因组代码长度大约3个GB,压缩后只有750mb.也就是一张标准CDROM的数据量,比现在动辄几个GB的软件尺寸小得多.而且DNA代码和我们安装的软件代码都是"编译 ...

  • 从程序员的角度来看DNA(1)

    源代码 在这里,这不是在开玩笑.这些源代码可以通过一个叫做'Ensembl'的专门的perl脚本浏览器来查看. DNA并不像C的源代码,更像是已经编译好的可以在"虚拟机"上运行的& ...

  • 程序员必备的思维能力:结构化思维

    在日常工作中,我们时常会碰到这样的情况,有的人讲一件事情的时候逻辑非常混乱,说了很多事情的罗列,却说不到重点.有的人写代码,本身的业务逻辑并没有多复杂,但呈现出的代码却像一堆线团,混乱不堪,无法理解. ...

  • 对于一个程序员来说,最浪费人生的事情大概...

    对于一个程序员来说,最浪费人生的事情大概就是: 1)追捧一些过时的技术.比如 Perl,窗口期已过,就算出个 Perl 7 也无济于事,自己玩还差不多. 2)过于痴迷一些平时不太用得到的技术.比如 H ...

  • 下岗程序员500万卖房炒股!割肉上机再入金龙鱼,股神还是韭菜?

    最近在投资平台上有个下岗程序员很火,据其自称610万深圳卖房拿出500万炒股,在割肉上海机场后,五一节后第一天再次出手.这次他吸取了教训,不再单吊一只股,而是同时买了三只股,分别是金龙鱼.中国平安.潍 ...

  • 一篇文章搞懂高级程序员、架构师、技术总监、CTO从薪资到技能的区别

    "我希望用一篇文章完全让大家正确的理解从程序员到架构师.技术经理.技术总监.CTO的完整区别以及进阶要领. 只有客观去认识,才会更加合理的找到自己的擅长点,从而更好的发展自己. 上图是典型的 ...

  • 程序员为你揭秘,什么是“千年虫”事件,“2038年问题”又是什么

    在即将进入2000年的时候,计算机出现了一个问题,它就是著名的"千年虫"事件. "千年虫"并不是现实生活中我们所见到的虫子,而是计算机系统由于时间紊乱产生的bu ...

  • 【赠书】程序员必备!如何深入理解计算机系统

    周末到了,本次给大家赠送3本新书,这次赠送的书籍是<深入理解计算机系统:第3版>. 这是一本什么样的书 这是一本讲解计算机软硬件系统的书,从程序员视角全面剖析其实现细节,使读者深刻理解程序 ...

  • 阿里程序员自述:入职才两个月,我决定离职

    先说一下我的基本情况吧.家住杭州的前端程序员,毕业4年多,之前在杭州中小公司.独角兽公司都待过.其实去之前对阿里价值观.氛围都还是比较了解的 (在杭那么多年,而且同为互联网行业,不了解就有鬼了--). ...