线性代数是什么?
在大学数学学科中,线性代数是最为抽象的一门课,从初等数学到线性代数的头脑 跨度比微积分和概率统计要大得多。许多人学过以后一直停留在知其然不知 其以是 然的阶段,若干年之后接触图形编程或机械学习等领域才发现线性代数的应用无处不在,但又苦于不能很好地明确 和掌握。简直,多数人很容易明确 初等数学 的种种看法,函数、方程、数列一切都那么的自然,可是 一进入线性代数的天下 就似乎来到了另一个生疏 的天下 ,在种种希奇 的符号和运算里迷失了。
我在初接触线性代数的时间 简直感受这是一门天外飞仙的学科,一个疑问在我脑子里浮现出来:
线性代数到底是一种客观的自然纪律照旧人为的设计?
若是 看到这个问题,你的反映是“这还用问,数学虽然是客观的自然纪律了”,我一点儿都不以为 希奇 ,我自己也曾这样以为 。从中学的初等数学和初等物理 一起 走来,很少人去嫌疑 一门数学学科是不是自然纪律,当我学习微积分、概率统计时也从来没有嫌疑 过,唯独线性代数让我发生了嫌疑 ,由于 它的种种符号和运算 规则太抽象太希奇 ,完全对应不到生涯 履历 。以是 ,我还真要谢谢线性代数,它引发了我去思索 一门数学学科的本质。着实 ,不止是学生,包罗许多数学先生 都不清 楚线性代数到底是什么、有什么用,不仅海内云云 ,在外洋也是这样,海内的孟岩写过《明确 矩阵》,外洋的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)这个运算:

点积看法的提出属于设计,有施展 缔造的余地;一旦设计定了,详细 公式就不能随意施展 了,必须切合逻辑,保证它映射到初等数学模子 的准确 性。这就像一门高级语言可以界说许多看法,什么高阶函数、闭包等等,可是 它必须保证映射到底层实现时在执行发生的效果切合其界说的规范。
线性代数幸亏那里 ?
上面说了,线性代数是一种高条理抽象模子 ,我们可以接纳学习一门法式语言的要领去学习它的语法和语义,可是 这一熟悉 不只针对线性代数,它是对每一门数学学科通用的,可能有人会有疑问
微积分、概率论也是高条理抽象,那么线性代数这种高条理抽象的特点在那里 呢?
这就问到了基础上,线性代数的焦点:向量模子 。我们在初等数学中学习的坐标系属于笛卡尔所提出的剖析 模子 ,这个 模子 很有用,但同时也有很大的弱点 。坐标系是人为加上的虚拟参考系,可是 我们要解决的问题,好比求面积,图形旋转、拉伸等应用都是和坐标系无关的,建设一 个虚拟的坐标系往往无助于解决问题,适才三角形面积的例子就是这样。
向量模子 很好地战胜 了剖析 模子 的弱点 ,若是 说剖析 模子 代表了某种“绝对性”的天下 观,那么向量模子 就代表了某种“相对性”的天下 观,我推荐把向量模子 息争析模子 看尴尬刁难 立的两种模子 。
向量模子 中界说了向量和标量的看法。向量具有巨细和偏向,知足 线性组合规则;标量是只有巨细没有偏向的量(注:标量的另一种更深刻的界说是在坐标变换中保持稳固 的量)。向量模子 的优点之一是其坐标系无关性, 也就是相对性,它在界说向量和运算规则的时间 从一最先 就抛开了坐标系的约束 ,不管你坐标轴怎么旋转,我都能顺应 ,向量的线性组合、内积、叉积、线性变换等 等运算所有 都是坐标系无关的。注重 ,所谓坐标系无关性不是说就没有坐标系了,照旧有的,适才三角形例子的极点就是用坐标体现的,只是在解决问题的时间 差异 的坐标系不会组成影响。用一个比喻,Java号称平台无关,不是说Java就是蜃楼海市 ,而是说你用Java编程时底层是Linux照旧Windows往 往对你没有影响。
向量模子 有什么利益呢?除了适才三角形面积问题是一个例子,下面我再举一个几何的例子:
给定三维坐标系中的一点(x0, y0, z0)和一个平面ax + by + c*z + d = 0,求点到平面的垂直距离?

这个问题若是 是要从剖析 几何的角度去解决险些重大 到没法下手,除非是平面恰恰 是过坐标轴的特殊情形 ,可是 若是 从向量模子 思量 就很简朴:凭证 平面方程,平面的法向量(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之间知足 这样的关系:

这正是相似矩阵的界说。没错,所谓相似矩阵,就是统一 个线性变换的差异的形貌 矩阵。矩阵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列数放在一起组成的数学工具。”