在2016年的第一个月里我看了一些专业书和杂书、学习了一套MIT关于线性代数的教学视频,闲暇之余还看了一些节目,萌发了些许感受,特在此记录一下。其实还有一些其他原因,见此文最后的备注部分。首先解释下这个标题,这个标题的灵感源自一本讲述C++11新特性的书,作者提到了一句“站在C98的峰顶沐浴C++11的阳光”。写书的作者当然已经站在C98之巅了,而我取此标题不免有“标题党”之嫌,但这只是我自己对我未来的一个期许,真的希望自己可以站在我所从事的相关领域涉及到了数学知识之巅,进而能以一种享受的心态沐浴计算机的阳光,如果有人觉得被这个标题忽悠了,在此道个歉哈。
在大二上,我有幸聆听了一个带着新思想,即数学是文科的老师的课(老师是谁就不说了,该懂的应该都知道是谁了)。他的目标是让我们更好地去应付考试,我觉得完全达到了他为我们设定的目标,从这个层面上来说他是个标准的好老师。可是考完试之后呢?基本上应该全还给老师了。然后在看图像处理、计算机视觉方面相关的书籍或者文献时,根本就无法理解作者的思想和方法,即和自己预先设定的期待落差比较大,往往都是卡在一些看似和数学无关,其实和数学紧密关联的问题上,这些问题大多数都是和现代工程两大数学支柱之一的线性代数有着莫大的联系。
线性代数中涉及到各种不同的矩阵,如正交矩阵、对称矩阵、反对称矩阵、正定矩阵、半正定矩阵、可逆矩阵、不可逆矩阵、奇异矩阵、非奇异矩阵、上三角矩阵、下三角矩阵等等;基于不同特性的矩阵、不同量级的矩阵又衍生出众多相关的算法;与其他学科相联系,又产生众多的问题。
线性代数里面的主角是矩阵和向量,然后研究由他们自身和他们之间产生的各种特性以及与其相关联的实际问题(个人的片面看法,标准解释请参照维基百科)。以前的只顾着想矩阵的点乘、叉乘等等运算什么的,然后列一个式子,剩下的工作就交给MATLAB(用的盗版软件,深感歉意)处理了。根本就没有想过什么是“线性”?在《计算机视觉与多视图几何》中的预备知识部分,提到在相似变换中角度、长度等几何性质可以保持不变;仿射变换中平行线的平行关系会保持不变;而在射影变换中,角度、长度、平行关系等几何性质都会发生变化,举个简单的例子:原来平行的直线,现在会相交于一点(ideal point,即理想点、无穷远点)。那么什么性质在射影变换中会保持不变呢?答案就是直线在变换之后还是直线,对,这就是我一直思考的问题的答案。理所当然的答案,以前却一直没有想明白,当然了这只是个人的拙见,认识可能还会不断的升华。
死抠linear的含义被没有什么意义,我们应该从线性代数里面学到什么核心思想呢?个人觉得最重要的思想就是——基的思想!在一个二维的笛卡尔坐标系中,我们随便选其中一个点,都会有相应的横、纵坐标,怎么得出来的呢?是因为我们默认选择了一组标准正交基作为参考,以至于我们都没有意识到这组基向量的存在,这是“标准”的好处,但是这样的思维的省略,往往造成意识的缺失和对基本问题的理解不当。再来看微积分中神乎其神的泰勒公式,如果我们将其看作基为幂函数,系数作为一个向量,是不是会很奇妙(哈哈,不知道有木有人这样想过)。这种基的思想其实在生活中无处不在,比如去电影院看电影,找位置的时候你会怎么找?人民币设置1角、五角、1元、五元、10元、20元、50元、100元其实都在一个一维坐标上,从线性代数角度考虑,取其中一种币值就可以表示所有的钱数了,但是这样就不方便现阶段日常的生活了,这也是一个老生常谈的问题,我们要多角度考虑问题。但是可以想象啊,在一个银行系统(电脑上运行的)中会区分各种币值吗?如果让我来做这个系统,我肯定不会设置这么多币值,完全可以选择一个币值作为基就欧克了,至于选择什么基最合理,就得根据实际情况进行考虑了。
任何一本讲述图像处理基本知识的书籍,我想应该多会或多或少的提及傅里叶变换——一个我从看第一本图像处理书籍都没有完全理解的问题。傅里叶变换的伟大就不多说了,下面只想说说我现在是如何理解傅里叶变换的。在图像处理中以前都是将图像数据当做一个矩阵来看待,但是计算机里面存储的时候都是按照一行接一行或者一列接一列的方式存储的,我们何不直接用一个向量来表示图像数据呢,我想这样应该处理速度应该会更快吧,还能省去不少计算数据地址的时间,当然了这是个人的猜测,情况到底怎么样,还是应该做做实验再来发表意见。
书上讲傅里叶变换都是首先列出几个公式,告诉你这叫傅里叶变换、那叫傅里叶逆变换,变换中这个符号代表什么含义,如何对应相关的图像数据,然后你只能装作已经看懂了继续往下看,希望后面有个什么生动的故事来解答我们心头的疑问,但是往往我们只能很遗憾合上书本,期待下次的好运和突然的灵感。何苦这样为难我们呢?不就是将原图像数据向量通过一个特定的矩阵(真名叫做傅里叶基)变换到频域空间,再通过傅里叶基的逆变换将处理过的数据向量变换回时域空间,得到最后的结果,说白了,这就是数值计算(这也是MATLAB的处理方式)的过程,当然了可以用快速傅里叶变换来优化算法。如果想了解计算过程中的具体细节,自己举个8X8的矩阵试试,就明白你的计算机是如何完成这个过程的了。
有了这个傅里叶变换的基础,就可以按图索骥解开傅里叶变换的竞争对手——小波(wavelets)变换的神秘面纱了。在中国快速发展的这几十年中,也是小波飞速发展的黄金时间,大有取代傅里叶变换之势。在图像处理的书籍中,这一部分公式可能更不利于我们的理解,但其实啊,本质上就是寻找一个更好的线性变换矩阵代替傅里叶基,那个矩阵怎么来呢,就是从书上哪些神一般的公式里来的。这样来理解,就可以利用基变换的思想将傅里叶矩阵和小波矩阵合二为一,转换为一个数学上的最优解问题——找到最合理的线性变换矩阵,实现相应的变换;条件是算法的时间要可以接受且满足足够少的参数能表示尽保留尽可能多的数据,不然算法再漂亮,没有实用价值,只能充当数学家喜爱的花瓶和象牙。
最小二乘法曾经被我深深的鄙视,只是因为它太难算了(都怪可恨的考试),但是现在却有了不同的看法。最小二乘法本质上是一个最优解的问题,它的涉及面横跨微积分、线性代数、统计学以及相关的实际问题,特别是涉及超定方程组时,它简直就是神一般的存在。但是如何在几何上理解这个神算法呢?还是得感谢线性代数为我们提供了最为完美的解释:让样本向量最大化的投影到该方程组形成的列空间中。这里最好从二维空间或者三维空间去作图理解,4维及以上会涉及超平面问题,从二、三维直接过渡应该是最完美的方案了。
牛顿迭代法,曾经天真地以为它只能算算方程组的根,但在它宽广的应用面前只能凸显自己的无知与轻狂。再一次,线性代数让它焕发生机,成为处理高维空间最优解问题的利器,当然,在其之上,衍生出了更加优秀的算法(LM迭代)。
无论是最小二乘法还是牛顿迭代法,对人类来说绝对是噩梦,但是对计算机来说就到了显示它们能力的时候,通过合理的算法和程序设计,这些理论上的算法切实地服务于大家的日常生活之中。曾经的高斯、若尔当、雅克比、施密特等都为线性代数的建立和发展做出来极大的贡献。俱往矣,但他们不止活在课本中,也真切地活在我们的电脑、手机等各种智能设备中;还活在电流中、天气里,于我们共同见证人类的发展,见证我们探索的足迹。
有用的矩阵是被约束的矩阵,和人一样,有用的人是被约束着的。其实推广一下,各种矩阵可以对应着现实世界中形形色色的人,大家各有特点、各有用途、各有各的世界,大家是我中有你,你中有我,彼此独立,却又相互联系、相互合作,共同形成了色彩缤纷的世界,这也从侧面证明了世界是联系的,印证了马克思主义哲学的正确性(哈哈)。
哲学中有否定之否定理论,即人的认知过程不是直线形的,而是螺旋上升,也意味着对相关知识的理解不断地加深。这个过程也是一个实践与理论的问题,在工程相关的应用学习中,发现自己原来对相关知识的理解不够,知识面也不够,这个时候就该是从实践回到理论,深化理论学习的时候了,在这个过程中,应该由易而难,由浅及深,量化细分任务与目标。理论学习完毕之后,则可以更好去帮助我们去完善实践,取得更好的成果。