社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习 线性代数基础 | 3.1  投影,寻找距离最近的向量

狗熊会 • 4 年前 • 1619 次点击  


3.1

投影,寻找距离最近的向量


在上一章,我们学习了如何基于空间的概念去判断线性方程组解的存在性,以及具体如何求线性方程组的解。对于一个方程组而言,有解固然可喜,无解之时,路又在何方?其实,由于一些实际原因,无解的问题在实际工程中往往更为普遍。没有精确解,我们该如何处理?我们在本节的一开始就会抛出这个问题,让大家一起思考解决的方法。

其实从直觉出发,我们会想,既然没有精确解,那我们是不是应该去寻找距离目标最近的近似解,这个思考方向无疑是正确的。那么问题就来了,空间中如何定义距离?又该怎么衡量最近?在这一小节中,我们会从最简单的一维直线入手,探讨对于空间中的任意目标点,如何在直线上寻找与之距离最近的点,并最终将问题和解决方法拓展到任意的空间的子空间上。

3.1.1两个需要近似处理的问题

在开始整个全新一章内容之前,我们先抛出两个问题,作为近似与拟合专题的切入点,也请各位读者一起思考一下:

第一个问题依然是关于线性方程组解的问题。

在上一章的最后一节里,我们从空间映射的角度入手,详细分析了线性方程组的解问题,阐述了在何种情况下有解,并且如何来描述整个解的空间。那么接下来,我们再看看下面这个方程组:

我们动手去解一下这个方程组,会发现这个方程组没有解,无解的原因是因为向量不在矩阵的列空间中。但是,我们不能仅仅只停留在这里,满足于无解这个基本结论。

因为,在实际的工程领域中会经常出现这种情况,那么该如何去解决?换句话说,在没有精确解的情况下我们如何尽可能的找到一组近似解,使得方程组左侧得到的结果离右侧的目标尽可能距离最近?至于说这个距离该如何定义,又该如何去衡量远近?这是我们本章后续要讨论的重点内容。


第二个问题是关于直线拟合的问题。

我们知道,如果在平面上任取两个点,一定能够找到一条通过他们的直线。但是如果有三个点、四个点甚至更多呢,还能保证一定能够找到一条直线同时穿过他们吗?比如下面这种情况:

我们在平面上选取三个点,他们的坐标分别是:(0,1),(1,4) 和 (2,3) ,试问我们能找到一条直线同时通过这三个点么?答案是不行。那么该如何解决?类比上面的问题一,当没有完全精确的解决方案时,能否退而求其次找到一个最接近的方案?即,能否找到一条直线,距离这三个点的距离最近?

3.1.2从投影的角度谈“最近”

在上面所提到的两个例子中,我们的确都没有办法获取准确的解。于是我们退而求其次,希望能够找到距离结果最近的近似解来解决问题。那么,我们该如何定义和描述这个“距离最近”呢?

我们先来看下面这个问题:

在空间当中有一条穿过原点的直线,并且这条直线沿着向量a的方向。在空间中还有一个点b,不过他不在这条直线上,那么如何在这条直线上找到一个点,使得这个点距离点b最近?

这个问题大家可能会觉得很简单,解决方法当然是通过点b向已知直线做一条垂线,这样就能获得我们想要的最短距离,其中我们要寻找的点就是垂线与直线的交点,如图3.1所示。

图3.1  寻找距离直线最近的距离

在图3.1中,我们发现向量b和向量a的夹角是,因此,通过b点到直线的最近距离可以表示为。还需要注意到向量p,他是从原点出发到垂直交点的向量,是向量b在向量a上的投影。而对于向量,我们称之为误差向量,他的长度就是我们要寻找的最近距离。

当然我们也可以用向量点积的方式得到投影向量p的长度,然后再进一步通过代数运算的方法得到向量p的坐标表示。这当然是没有问题的。但是,不知道大家想过没有,这里谈的是直线的情况,一维空间的计算是非常简单的,如果我们进一步对问题进行拓展,去讨论向量在二维平面、三维空间甚至是更高维空间中的投影问题,依靠这种方法就不太合适。所以,我们在这里需要借助矩阵工具来描述这个投影的过程,需要一种通用的计算方法。

3.1.3用矩阵描述向一维直线的投影

我们接着说,首先需要分析如何利用矩阵描述向量b向一条直线上进行投影的过程。我们将向量a作为这条直线的基向量,那么向量p就可以用向量a来进行表示,我们记作:是一个标量),我们接下来的目标就是去求取标量系数,投影向量p和投影矩阵P

我们在这里仍然需要牢牢的把握住一个核心要点,那就是误差向量e和基向量a之间的垂直关系,因此就有等式成立,我们再进一步对其进行展开,得到了下面的等式关系:

此时,我们再做一点简单的运算:

我们知道:,因此最终就求出了标量系数的表达式:

投影向量也能够顺势得出:

最后,我们来求取将向量b变换到其投影向量p的投影变换矩阵P,这里有一个小技巧,由于是标量与向量的乘法,因此交换一下位置后的同样能够成立,于是就有了下面这个等式:

由此得到了投影矩阵

最终我们求得了这三个值:

我们举一个简单的一维直线投影例子来实际运用一下上面的公式。已知向量,我们利用公式来寻找一下向量在该向量上的投影向量p,以及任意向量往向量a上的投影矩阵P

我们先来求一下投影向量p,按照公式,整个计算过程非常容易:

 ,因此求取了向量p

接下来我们再来求往向量a上投影的矩阵P

直接代入公式可得:

最后,我们来对前后两次运算的结果进行一下检验:

经过验算我们发现,前后两次计算得到的向量p结果一致,我们的计算过程是准确无误的。

3.1.4向二维平面投影

接下来,我们将投影问题由直线拓展到二维平面。请读者们注意,这个二维平面不仅仅局限于平面,而是空间中任意一个穿过原点的二维平面,我们假设这个二维平面是的一个子空间。如果空间中同样有一个向量b,我们想在这个二维平面上寻找一个与之距离最近的向量,那么同理,我们的正常思路也是去寻找向量b在二维平面上的投影向量p。如图3.2所示:

   

图3.2 寻找二维平面上的投影向量

我们如何去寻找二维平面上的投影向量p以及投影矩阵P呢?同样,我们去做向量b到二维平面的垂线。

几何的常识告诉我们,一条直线如果与一条平面垂直,则他就与该平面上的所有向量都垂直,我们牢牢抓住这一点,转而去选取二维平面上线性无关的两个向量作为这个二维平面的一组基(因为我们假设这个二维平面是的子空间,因此,向量和向量是m维的列向量),由于平面上所有的向量都可以写成这组基向量的线性组合形式,那么,只要保证误差向量e与向量和向量分别垂直,就能够保证向量e与整个平面垂直,而向量p就是向量b在平面上的投影向量。

在处理的过程中,我们需要从直线投影所需的一个向量垂直表达式拓展到二维平面投影的两个向量垂直表达式,我们从下面的两个式子入手,即:,其中,

这里的投影向量p又该如何表示呢?由于投影向量p也在这个二维平面上,自然而然也是基向量的某种线性组合。我们记作: ,实质上如果用矩阵来进一步概括的话,我们可以把向量和向量作为矩阵A的列向量,即记作:,因此投影向量可以被概括为:,这种形式看上去简单清爽。

那么,我们结合这两个向量垂直的等式进一步代入:

,同理,对应的也有,我们把这两个等式结合到一个矩阵乘法里,就有了的形式。

此时,希望就在眼前了,我们之前曾经令矩阵,那么就有转置矩阵

   由此,我们就得到了这个关键的等式:,那么问题来了,进一步该如何进行处理呢?

假设这个二维平面是空间中的一个子空间,那么向量和向量都是m维的列向量(显然),因此矩阵A就是一个规模为且两列线性无关的矩阵。因此,由矩阵乘法所得到的结果就是一个二阶可逆方阵,二阶方阵肯定是毫无疑问的,至于说为什么这个矩阵满足可逆性,我们会在文末补充证明过程给大家看,在这里我们先使用这个结论继续往下走。

那么,因此最终就有了标量系数的表达式:,这里我们要着重强调一下,单独的矩阵A首先连方阵都不一定能保证,因此不能对他们单独讨论可逆性。一定要将可逆操作施加在的整体计算结果上。

后面是顺水推舟的过程,投影向量p的表示方法是:

从投影矩阵P的角度来看,有p=Pb,因此,,从维度来判断,他是一个m阶的方阵。

最后我们把求得的结果列在一起总结一下:

有了上面的这一组公式,我们也举一个简单的例子来实际应用一下:

我们假设在空间中有一个向量 ,而二维投影平面的基向量分别是向量和向量。我们试着来求一下投影向量p和投影矩阵P

我们这里直接运用上面的公式即可:

首先,我们按照解题的计算步骤,将二维平面的两个基向量作为矩阵A的两列,记作:

其中,


我们计算的逆矩阵:

通过计算结果,我们再求取投影矩阵P

得到了投影矩阵,那最终投影向量也是顺手拈来:


3.1.5一般化:向n维子空间投影

有了向二维平面投影的推导过程,我们再将他拓展到向空间中的n维子空间投影的一般化问题,就非常简单了。解决这个问题的核心突破口仍然是原始向量b与投影向量p的向量之差(即:误差向量)与这个n维子空间的垂直关系。

然后,问题就转化为了在这个n维子空间中寻找n个线性无关的向量作为这个子空间的一组基,然后使得误差向量e与这一组基向量分别垂直。这和二维平面讨论的情况可以说是一模一样,只不过是基向量的个数增加了:

首先满足:

然后投影向量p依旧被表示为这组基向量的线性组合形式:

我们还是将这一组空间的基向量构造成矩阵A的各列,矩阵A 表示为:,系数向量为:,投影向量p依旧表示为:同样有:

最终,我们把n个基向量与误差向量e垂直的表达式统一起来表示,就有:,之后的推导过程和前面也都是一模一样的:,此时,矩阵A是一个规模的矩阵,由于矩阵A的各列表示的是空间中n维子空间的一组基,因此必然有的不等关系成立,所以同样有结论:是一个n阶的可逆方阵。

最终,空间中n维子空间的投影计算结果和二维平面中的投影结果是一模一样的(其实二维平面就是n维子空间的一种特殊情况罢了),我们直接照抄二维空间情况下得到的结果即可。

3.1.6补充讨论一下的可逆性

最后,我们简单的证明一下计算结果的可逆性,由于在这一节讨论的问题中,矩阵A的各列满足线性无关,因此A是一个列满秩矩阵,其零空间N(A)就是一个零向量。如果我们能够证明的零空间和矩阵A的零空间一致,那么就能知道也是一个满秩方阵,即满足可逆性。

我们先看这个推导方向,如果Ax=0,那么等式必然成立,稍作变换,于是就有

再看看这个推导方向,如果等式成立,两边同时乘以,那么就有:,稍微处理一下可得,由此得出了Ax=0。

由此,我们完整的证明了这个结论:如果矩阵A是一个列满秩矩阵,那么是一个可逆方阵。其实我还要预告一下,这个结果形式非常重要,他的一些重要性质将在后面两章的内容里多次得到应用,并且我们还会在5.1节中专门对他展开深入分析。

3.1.7回顾一下开篇的两个问题

在这一小节里,我们针对开篇提到的两个无解的问题,定义了“最近”的概念,并且讨论了如何通过子空间的投影去寻找“最近”的向量。当然看到这里,还不能完全解决这两个问题,我们下一节接着再聊。


往期精彩回顾
前言
1.1 描述空间的工具:向量
1.2 基底构建一切,基底决定坐标
1.3 矩阵,让向量动起来
1.4 矩阵乘向量的新视角:变换基底
2.1 矩阵:描述空间中的映射
2.2 追因溯源:逆矩阵和逆映射


本书所涉及的源代码已上传到百度网盘,供读者下载。请读者关注封底“博雅读书社”微信公众号,找到“资源下载”栏目,根据提示获取。


如果您对本书感兴趣,请进入当当网选购!



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51865
 
1619 次点击