线性代数全部知识点总结(线性代数简介)

线性代数的意义

线性代数是什么?

在大学数学学科中,线性代数是最为抽象的一门课,从初等数学到线性代数的思维跨度比微积分和概率统计要大得多。很多人学过以后一直停留在知其然不知 其所以然的阶段,若干年之后接触图形编程或机器学习等领域才发现线性代数的应用无处不在,但又苦于不能很好地理解和掌握。的确,多数人很容易理解初等数学 的各种概念,函数、方程、数列一切都那么的自然,但是一进入线性代数的世界就好像来到了另一个陌生的世界,在各种奇怪的符号和运算里迷失了。

我在初接触线性代数的时候简直感觉这是一门天外飞仙的学科,一个疑问在我脑子里浮现出来:

线性代数到底是一种客观的自然规律还是人为的设计?

如果看到这个问题,你的反应是“这还用问,数学当然是客观的自然规律了”,我一点儿都不觉得奇怪,我自己也曾这样认为。从中学的初等数学和初等物理 一路走来,很少人去怀疑一门数学学科是不是自然规律,当我学习微积分、概率统计时也从来没有怀疑过,唯独线性代数让我产生了怀疑,因为它的各种符号和运算 规则太抽象太奇怪,完全对应不到生活经验。所以,我还真要感谢线性代数,它引发了我去思考一门数学学科的本质。其实,不止是学生,包括很多数学老师都不清 楚线性代数到底是什么、有什么用,不仅国内如此,在国外也是这样,国内的孟岩写过《理解矩阵》,国外的Sheldon Axler教授写过《线性代数应该这样学》,但都还没有从根本上讲清楚线性代数的来龙去脉。对于我自己来讲,读大学的时候没有学懂线性代数,反而是后来从编程的角度理解了它。很多人说数学好可以帮助编程,我恰好反过来了,对程序的理解帮助了我理解数学。

计算机里面有汇编、C /C 、Java、Python等通用语言,还有Makefile、CSS、SQL等DSL,这些语言是一种客观的自然规律还是人为的设计呢?

为什么要问这样一个看起来很蠢的问题呢?因为它的答案显而易见,大家对天天使用的程序语言的认识一定胜过抽象的线性代数,很显然程序语言虽然包含了 内在的逻辑,但它们本质上都是人为的设计。所有程序语言的共同性在于:建立了一套模型,定义了一套语法,并将每种语法映射到特定的语义。程序员和语言实现 者之间遵守语言契约:程序员保证代码符合语言的语法,编译器/解释器保证代码执行的结果符合语法相应的语义。比如,C 规定用new A()语法在堆上构造对象A,你这样写了C 就必须保证相应的执行效果,在堆上分配内存并调用A的构造函数,否则就是编译器违背语言契约。

从应用的角度,我们能不能把线性代数视为一门程序语言呢?答案是肯定的,我们可以用语言契约作为标准来试试。假设你有一个图像,你想把它旋转60 度,再沿x轴方向拉伸2倍;线性代数告诉你,“行!你按我的语法构造一个矩阵,再按矩阵乘法规则去乘你的图像,我保证结果就是你想要的”。

实际上,线性代数和SQL这样的DSL非常相似,下面来作一些类比:

模型和语义:SQL是在低级语言之上建立了关系模型,核心语义是关系和关系运算;线性代数在初等数学之上建立了向量模型,核心语义是向量和线性变换

语法:SQL为每种语义定义了相应的语法,如select, where, join等;线性代数也定义了向量、矩阵、矩阵乘法等语义概念相应的语法

编译/解释:SQL可以被编译/解释为C语言;线性代数相关概念和运算规则可以由初等数学知识来解释

实现:我们可以在MySQL、Oracle等关系数据库上进行SQL编程;我们也可以在MATLAB、Mathematica等数学软件上进行线性代数编程

所以,从应用的角度看,线性代数是一种人为设计的领域特定语言(DSL),它建立了一套模型并通过符号系统完成语法和语义的映射。实际上,向量、矩阵、运算规则的语法和语义都是人为的设计,这和一门语言中的各种概念性质相同,它是一种创造,但是前提是必须满足语言契约。

为什么要有线性代数?

可能有人对把线性代数当成一门DSL不放心,我给你一个矩阵,你就把我的图形旋转了60度沿x轴拉伸了2倍,我总感觉不踏实啊,我都不知道你“底 层”是怎么做!其实,这就像有的程序员用高级语言不踏实,觉得底层才是程序的本质,老是想知道这句话编译成汇编是什么样?那个操作又分配了多少内存?别人 在Shell里直接敲一个wget命令就能取下一个网页,他非要用C语言花几十分钟来写一堆代码才踏实。其实,所谓底层和上层只是一种习惯性的说法,并不 是谁比谁更本质。程序的编译和解释本质上是不同模型间的语义映射,通常情况下是高级语言映射为低级语言,但是完全也可以把方向反过来。Fabrice Bellard用JavaScript写了一个虚拟机,把Linux跑在JavaScript虚拟机上,这就是把机器模型往JavaScript模型上映射。

建立新模型肯定依赖于现有的模型,但这是建模的手段而不是目的,任何一种新模型的目的都为了更简单地分析和解决某一类问题。线性代数在建立的时候,它的各种概念和运算规则依赖于初等数学的知识,但是一旦建立起来这层抽象模型之后,我们就应该习惯于直接利用高层次的抽象模型去分析和解决问题。

说到线性代数是为了比初等数学更容易地分析和解决问题,下面我们通过一个例子来实际感受一下它的好处:

给定三角形的顶点(x1, y1), (x2, y2), (x3, y3),求三角形的面积。

初等数学中三角形面积最著名的计算公式是area = 1/2 * base * height,当三角形有一条边恰好在坐标轴上时我们就很容易算出它的面积。但是,假如同样一个三角形我们把坐标轴旋转一下,让它的边不在坐标轴上,怎么办?我们还能得到它的底和高吗?答案肯定是可以的,但是就明显复杂了,而且还要分很多种情况去分别讨论。

相反,如果我们用线性代数知识来解决这个问题就非常轻松。在线性代数中两个向量a,b的叉积(Cross Product)是一个向量,其方向与a,b垂直,其大小等于a,b构成的平行四边形的面积:

我们可以把三角形的边视为向量,所以三角形的面积等于两个边向量的叉积除以二的绝对值:

area = abs(1/2 * cross_product((x2 - x1, y2 - y1), (x3 - x1, y3 - y1)))

注:abs表示取绝对值,cross_product表示两个向量的叉积。

这样一个在初等数学里面有点儿小难的问题在线性代数中瞬间搞定!可能有人会说,你直接基于叉积来做,当然简单了,但是叉积本身不是也挺复杂的吗?你把它展开试试看呢?是的,模型的作用就是把一部分复杂性隐藏到模型中,使得模型的使用者可以更加简单地解决问题。曾经有人质疑C 太复杂,C 之父Bjarne Stroustrup这样回答:

Complexity will go somewhere: if not the language then the application code.

在特定环境下,问题的复杂性是由其本质决定的,C 把一部分的复杂性纳入了语言和标准库,目的是使得应用程序更为简单。当然,并非所有场合C 都使得问题更加简单,但是从原理上讲,C 的复杂性是有道理的。除了C ,Java、SQL、CSS等各种语言和框架莫不如是,想象一下,如果不使用 数据库,动不动就自己去做数据存储和管理是多么复杂啊!这样我们就不难理解为什么线性代数要定义叉积这样奇怪的运算了,它和C 把很多常用的算法和容器 纳入STL是同一道理。同样的,甚至你还可以在线性代数中定义自己想要的运算拿来复用。所以,数学一点儿不死板,它和程序一样是活活泼泼的,你理解了它的 来龙去脉就能驾驭自如。说到这里,我们就顺便回答一个很常见的疑惑:

线性代数的点积、叉积还有矩阵运算都很奇怪,为什么要定义这些运算呢?它们的定义又为什么是这个样子呢?

其实,和程序复用一样,线性代数定义点积、叉积和矩阵运算是因为它们的应用非常广,有很大的复用价值,可以作为我们分析和解决问题的基础。比如,很多问题都涉及到一个向量到另一个向量的投影或是求两个向量的夹角,那么就会考虑专门定义点积(Dot Product)这个运算:

线性代数全部知识点总结(线性代数简介)(1)

点积概念的提出属于设计,有发挥创造的余地;一旦设计定了,具体公式就不能随意发挥了,必须符合逻辑,保证它映射到初等数学模型的正确性。这就像一门高级语言可以定义很多概念,什么高阶函数、闭包等等,但是它必须保证映射到底层实现时在执行产生的效果符合其定义的规范。

线性代数好在哪里?

上面说了,线性代数是一种高层次抽象模型,我们可以采用学习一门程序语言的方法去学习它的语法和语义,但是这一认识不只针对线性代数,它是对每一门数学学科通用的,可能有人会有疑问

微积分、概率论也是高层次抽象,那么线性代数这种高层次抽象的特点在哪里呢?

这就问到了根本上,线性代数的核心:向量模型。我们在初等数学中学习的坐标系属于笛卡尔所提出的解析模型,这个 模型很有用,但同时也有很大的缺点。坐标系是人为加上的虚拟参考系,但是我们要解决的问题,比如求面积,图形旋转、拉伸等应用都是和坐标系无关的,建立一 个虚拟的坐标系往往无助于解决问题,刚才三角形面积的例子就是这样。

向量模型很好地克服了解析模型的缺点,如果说解析模型代表了某种“绝对性”的世界观,那么向量模型就代表了某种“相对性”的世界观,我推荐把向量模型和解析模型看作对立的两种模型。

向量模型中定义了向量和标量的概念。向量具有大小和方向,满足线性组合法则;标量是只有大小没有方向的量(注:标量的另一种更深刻的定义是在坐标变换中保持不变的量)。向量模型的优点之一是其坐标系无关性, 也就是相对性,它在定义向量和运算规则的时候从一开始就抛开了坐标系的束缚,不管你坐标轴怎么旋转,我都能适应,向量的线性组合、内积、叉积、线性变换等 等运算全部都是坐标系无关的。注意,所谓坐标系无关性不是说就没有坐标系了,还是有的,刚才三角形例子的顶点就是用坐标表示的,只是在解决问题的时候不同 的坐标系不会构成影响。用一个比喻,Java号称平台无关,不是说Java就是空中楼阁,而是说你用Java编程时底层是Linux还是Windows往 往对你没有影响。

向量模型有什么好处呢?除了刚才三角形面积问题是一个例子,下面我再举一个几何的例子:

给定三维坐标系中的一点(x0, y0, z0)和一个平面ax by c*z d = 0,求点到平面的垂直距离?

线性代数全部知识点总结(线性代数简介)(2)

这个问题如果是要从解析几何的角度去解决几乎复杂到没法下手,除非是平面恰好是过坐标轴的特殊情况,但是如果从向量模型考虑就很简单:根据平面方程,平面的法向量(Normal Vector)是v=(a, b, c),设从平面上任意一点(x, y, z)到(x0, y0, z0)的向量为w,那么通过内积dot_product(w, v)算出w到v的投影向量p,其大小就是(x0, y0, z0)到平面ax by c*z d = 0的垂直距离。这里用到了向量模型的基本概念:法向量,投影向量,内积,整个问题解决过程简洁明快。

下面再给大家留一道相似的练习题(熟悉机器学习的朋友可能会发现这是线性代数在线性分类中的应用):

给定n维空间中的两点(a1, a2, ... an),(b1, b2, ... bn)和一个超平面c1x1 c2x2 ... cn*xn d = 0,请判断两点在超平面的同侧或异侧?

由此,可以很容易理解:线性代数被称为第二代数学模型,是指建立在集合论基础上对第一代数学模型中的线性计算进行抽象概括和公理化得到的模型。

向量空间/线性空间线性空间中的对象:向量

线性空间中的任何一个对象,通过选取基和坐标的办法,都可以表达为向量的形式。

对象的运动:线性变换

将所有的向量起点设置于原点,然后用向量的终点来表示向量。这样,每一个向量就可以用坐标系内的一个点来表示。线性空间中的从一个向量(点)运动到另一个向量(点),被称为线性变换,也就是说,你从线性空间中的一个点运动到任意的另外一个点,都可以通过一个线性变换来完成。线性变换可以看成一个动态的过程,比如旋转、伸缩或者投影之类的升降维的操作。

对于线性空间V中的一个变换A,要验证它是否为一个线性变换,只要看对于V中任意的元素αβ和数域P中任意k,是否都满足以下线性运算

  • A(α β)=A(α) A(β
  • A (kα)=kA(α)
矩阵

很有意思,线性空间中的任何线性变换都可以用矩阵来描述。使某个对象发生对应运动的方法,就是用代表那个运动的矩阵,乘以代表那个对象的向量。矩阵的本质是运动的描述。

根据矩阵在向量的线性变换中所起的作用,矩阵可被称为算子,(算子是一个函数到另一个函数的映射,它是从向量空间到向量空间的映射)。线性代数的理论已被泛化为算子理论。

简而言之,在线性空间中选定基之后,向量刻画对象,矩阵刻画对象的运动,用矩阵与向量的乘法施加运动。

另外,有趣的是,向量本身也可以看成是n x 1矩阵,一个空间中的对象和运动竟然可以用相类同的方式表示!线性代数中大多数奇妙的性质,均与这个巧合有直接的关系。

从线性变换角度来看,矩阵的定义就变成:“矩阵是线性空间里特定基下的线性变换的一个描述。”

理解这个定义的关键,在于把“线性变换”与“线性变换的一个描述”区别开。对于一个线性变换,只要你选定一组基,那么就可以找到一个矩阵来描述这个线性变换。换一组基,就得到一个不同的矩阵。所有这些矩阵都是这同一个线性变换的描述,但又都不是线性变换本身。

那么,你给我两个矩阵,我怎么知道这两个矩阵是描述的同一个线性变换呢?

我们可以找到同一个线性变换的矩阵兄弟们的一个性质,那就是:

若矩阵A与B是同一个线性变换的两个不同的描述(之所以会不同,是因为选定了不同的基,也就是选定了不同的坐标系),则一定能找到一个非奇异矩阵P,使得A、B之间满足这样的关系:

线性代数全部知识点总结(线性代数简介)(3)

这正是相似矩阵的定义。没错,所谓相似矩阵,就是同一个线性变换的不同的描述矩阵。矩阵P其实就是A矩阵所基于的基与B矩阵所基于的基这两组基之间的一个变换关系。

这个发现太重要了。原来一族相似矩阵都是同一个线性变换的描述!工科研究生课程中有矩阵论、矩阵分析等课程,其中讲了各种各样的相似变换,比如什么相似标准型,对角化之类的内容,都要求变换以后得到的那个矩阵与先前的那个矩阵式相似的,为什么这么要求?因为只有这样要求,才能保证变换前后的两个矩阵是描述同一个线性变换的。在实际运算中,经常要做矩阵变换,这是因为同一个线性变换的不同矩阵描述,从实际运算性质来看是有好有坏的,有些描述矩阵就比其他的矩阵性质好得多。

根据基的定义,如果一组单位长度向量是彼此线性无关的话,那么它们就可以成为度量这个线性空间的一组基,从而事实上成为一个坐标系体系,其中每一个向量都躺在一根坐标轴上,并且成为那根坐标轴上的基本度量单位。现在到了关键的一步。看上去矩阵就是由一组向量组成的,而且如果矩阵非奇异的话,那么组成这个矩阵的那一组向量也就是线性无关的了,也就可以成为度量线性空间的一个坐标系。结论:矩阵描述了一个坐标系

不是说过,矩阵就是运动吗?怎么这会矩阵又是坐标系了?那是因为:**向量的变换等价于坐标系的变换,**或者:固定坐标系下一个向量的变换等价于固定向量所处的坐标系变换。例如,Ma = b的意思是:“一个向量,它在坐标系M的度量下得到的度量结果向量为a,那么它在单位矩阵构成的坐标系的度量下,这个向量的度量结果是b。”在M为坐标系的意义下,如果把M放在一个向量a的前面,形成Ma的样式,我们可以认为这是对向量a的一个环境声明。从这个意义上来看,这哪里是什么乘法计算,根本就是身份识别嘛。

因此矩阵不仅可以作为线性变换的描述,还可以作为一组基的描述。

回过头来说变换的问题。“固定坐标系下一个向量的变换等价于固定向量所处的坐标系变换”。这就是说作为变换的矩阵,不但可以把线性空间中的一个点给变换到另一个点去,而且也能够把线性空间中的一个坐标系(基)变换到另一个坐标系(基)去。请看:

Ma = Ib 我现在要变M为I,怎么变?对了,再前面乘以个M-1,也就是M的逆矩阵。换句话说,你不是有一个坐标系M吗,现在我让它乘以个M-1,变成I,这样一来的话,原来M坐标系中的a在I中一量,就得到b了。 我建议你此时此刻拿起纸笔,画画图,求得对这件事情的理解。比如,你画一个坐标系,x轴上的衡量单位是2,y轴上的衡量单位是3,在这样一个坐标系里,坐标为(1,1)的那一点,实际上就是笛卡尔坐标系里的点(2, 3)。而让它原形毕露的办法,就是把原来那个坐标系: 2 0 0 3 的x方向度量缩小为原来的1/2,而y方向度量缩小为原来的1/3,这样一来坐标系就变成单位坐标系I了。保持点不变,那个向量现在就变成了(2, 3)了。 怎么能够让“x方向度量缩小为原来的1/2,而y方向度量缩小为原来的1/3”呢?就是让原坐标系: 2 0 0 3 被矩阵: 1/2 0 0 1/3 左乘。而这个矩阵就是原矩阵的**逆矩阵**。

下面我们得出一个重要的结论:

“对坐标系施加变换的方法,就是让表示那个坐标系的矩阵与表示那个变化的矩阵相乘。” 再一次的,**矩阵的乘法变成了运动的施加,只不过,被施加运动的不再是向量,而是另一个坐标系**。

在这里,实际上已经回答了一般人在学习线性代数是最困惑的一个问题,那就是为什么矩阵的乘法要规定成这样。简单地说,是因为:

1. 从变换的观点看,对坐标系N施加M变换,就是把组成坐标系N的每一个向量施加M变换。 2. 从坐标系的观点看,在M坐标系中表现为N的另一个坐标系,这也归结为,对N坐标系基的每一个向量,把它在I坐标系中的坐标找出来,然后汇成一个新的矩阵。 3. 至于矩阵乘以向量为什么要那样规定,那是因为一个在M中度量为a的向量,如果想要恢复在I中的真像,就必须分别与M中的每一个向量进行內积运算。

综合以上1/2/3,矩阵的乘法就得那么规定。

矩阵又是坐标系,又是变换。到底是坐标系,还是变换,已经说不清楚了,运动与实体在这里统一了,物质与意识的界限已经消失了,一切归于无法言说,无法定义了。道可道,非常道,名可名,非常名。矩阵实在是不可道之道,不可名之名的东西。到了这个时候,我们不得不承认,我们伟大的线性代数课本上说的矩阵定义,是无比正确的:

“矩阵就是由m行n列数放在一起组成的数学对象。”

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页