上面说了,线性代数是一种高层次抽象模型,我们可以采用学习一门程序语言的方法去学习它的语法和语义,但是这一认识不只针对线性代数,它是对每一门数学学科通用的,可能有人会有疑问。
微积分、概率论也是高层次抽象,那么线性代数这种高层次抽象的特点在哪里呢?
这就问到了根本上,线性代数的核心:向量模型。
我们在初等数学中学习的坐标系属于笛卡尔所提出的解析模型,这个模型很有用,但同时也有很大的缺点。
坐标系是人为加上的虚拟参考系,但是我们要解决的问题,比如求面积,图形旋转、拉伸等应用都是和坐标系无关的,建立一个虚拟的坐标系往往无助于解决问题,刚才三角形面积的例子就是这样。
向量模型很好地克服了解析模型的缺点,如果说解析模型代表了某种“绝对性”的世界观,那么向量模型就代表了某种“相对性”的世界观,我推荐把向量模型和解析模型看作对立的两种模型。
向量模型中定义了向量和标量的概念。向量具有大小和方向,满足线性组合法则;标量是只有大小没有方向的量(注:标量的另一种更深刻的定义是在旋转变换下保持不变的量)。
向量模型的优点之一是其坐标系无关性,也就是相对性,它在定义向量和运算规则的时候从一开始就抛开了坐标系的束缚,不管坐标轴怎么旋转,我都能适应,向量的线性组合、内积、叉积、线性变换等等运算全部都是坐标系无关的。
注意,所谓坐标系无关性不是说就没有坐标系了,还是有的,刚才三角形例子的顶点就是用坐标表示的,只是在解决问题的时候不同的坐标系不会构成影响。
用一个比喻,Java号称平台无关,不是说Java就是空中楼阁,而是说小伙伴用Java编程时底层是Linux还是Windows往往对自身没有影响。
向量模型有什么好处呢?
除了刚才三角形面积问题是一个例子,下面再举一个几何的例子:
给定三维坐标系中的一点(x0, y0, z0)和一个平面a*x + b*y + 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)到平面a*x + b*y + c*z + d = 0的垂直距离。
这里用到了向量模型的基本概念:法向量,投影向量,点积,整个问题解决过程简洁明快。
下面再给小伙伴们留一道相似的练习题(熟悉机器学习的朋友可能会发现这是线性代数在线性分类中的应用):
给定n维空间中的两点(a1, a2, ... an),(b1, b2, ... bn)和一个超平面c1*x1 + c2*x2 ... + cn*xn + d = 0,请判断两点在超平面的同侧或异侧?
离开向量,下面我们要请出线性代数的另一个主角:矩阵(Matrix)。
线性代数定义了矩阵和向量、矩阵和矩阵的乘法,运算规则很复杂,用来做什么也不清楚,很多初学者都不能很好地理解,可以说矩阵是学好线性代数的拦路虎。
遇到复杂的东西,往往需要先避免一头陷入细节,先从整体上把握它。
其实,从程序的角度看,无论形式多么奇怪,它无非是一种语法,语法必然对应了语义,所以理解矩阵的重点在于理解其语义。
矩阵的语义不止一种,在不同的环境中有不同的语义,在同一环境中也可以有不同的解读,最常见的包括:
1)表示一个线性变换;
2)表示列向量或行向量的集合;
3)表示子矩阵的集合。
矩阵作为一个整体对应的是线性变换语义:用矩阵A乘以一个向量v得到w,矩阵A就代表了v到w的线性变换。
比如,如果想要把向量v0按逆时针方向旋转60度得到v',只需要用旋转变换矩阵(Rotation Matrix)去乘v0就可以了。
除了旋转变换,拉伸变换也是一种常见的变换,比如,我们可以通过一个拉伸矩阵把向量沿x轴拉伸2倍(请试着自己给出拉伸矩阵的形式)。
更重要的是,矩阵乘法有一个很好的性质:满足结合率,这就意味着可以对线性变换进行叠加。
举个例子,我们可以把“沿逆时针旋转60度”的矩阵M和“沿x轴拉伸2倍”的矩阵N相乘,得到一个新矩阵T来代表“沿逆时针旋转60度并沿x轴拉伸2倍”。
这是不是很像我们Shell中把多个命令通过管道进行叠加呢?
上面重点介绍了向量模型的坐标系无关性,除此之外,向量模型的另一优点是它能描述线性关系,下面我们来看一个熟悉的Fibonacci数列的例子:
Fibonacci数列定义为:f(n) = f(n-1) + f(n-2), f(0) = 0, f(1) = 1;问题:输入n,请给出求f(n)的时间复杂度不超过O(logn)的算法。
首先,我们构造两个向量v1=(f(n+1), f(n))和v2=(f(n+2), f(n+1)),根据Fibonacci
数列性质,我们可以得到从v1到v2的递推变换矩阵:
并进一步得到:
这样就把线性递推问题转化为了矩阵的n次幂经典问题,在O(log n)时间复杂度内解决。除了线性递推数列,初等数学中著名的n元一次方程组问题也可以转化为矩阵和向量乘法形式更容易地解决。
这个例子是想说明,凡是满足线性关系的系统都是向量模型的用武之地,我们往往可以把它转化为线性代数得到简洁高效的解决方案。
本文提出了一种观点:从应用的角度,我们可以把线性代数视为一门特定领域的程序语言。线性代数在初等数学基础上建立了向量模型,定义了一套语法和语义,符合程序语言的语言契约。
向量模型具有坐标系无关性和线性性,它是整个线性代数的核心,是解决线性空间问题的最佳模型。向量的概念、性质、关系、变换是掌握和运用线性代数的重点。
对于编程来说,学好数学是必不可少的。对于线性代数而言,用编程的方式来思考可以帮助理解。
注:本文转自网络
Leave your comment