【高中生讲机器学习】16. 线代小白也能看懂的矩阵奇异值分解!

创建时间:2024-08-03
首发时间:2024-08-11
最后编辑时间:2024-08-11
作者:Geeker_LStar

你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~
我是 Geeker_LStar,一名准高一学生,热爱计算机和数学,我们一起加油~!
⭐(●’◡’●) ⭐
那就让我们开始吧!

这是目前为止专栏中的最长的一篇文章!有一万五千字!

okay,天知道这专栏我鸽了多久了()()今天看到有同学说鸽王最终都会受到制裁(虽然不是说我)()咳咳咳所以还是好好更新!!(要不这专栏就该改名叫鸽王讲机器学习了()(doge)

好了好了不废话了,只要开始抽象就停不下来的我emm
well,这篇我们来讲矩阵的奇异值分解!其实我本来想叫它 “主成分分析前传:blablabla” 来着,但是标题写太长了并不好所以就没写()。
怎么说呢,奇异值分解这个玩意我觉得,,,其实挺难且挺不好理解的(emm我菜🤯),而且前面需要铺垫的东西很多。
ok,那就,出发!


以下是正文。


引入

先来看一个形象的例子,这个例子会让你理解奇异值分解要干什么
比如说你现在要买房子,你的预算和时间都有限,所以你需要快速地通过一个房子的信息去判断这个房子(的价格)是否值得你考虑。不过,决定一个房子价格的因素可太多了——面积、朝向、户型、年限、是不是二手的、旁边有没有好学校…在估计一个房子价格的时候,我们不可能把所有这些因素都考虑进去,那这时候怎么办呢——没错,先看最能决定房子价格的因素,然后再做下一步决定。而对于一个房子来说,直接决定价格范围的、最重要的因素一般而言是它的面积。这样我们就把一个需要考虑很多(大多数时候没有那么有用)的因素的问题转化成了只需要考虑几个比较重要的信息的问题。

嗯,奇异值分解(singular value decomposition,SVD)本质上就是在干这事——通过把一个矩阵转化为三个矩阵的乘积,去找到原始矩阵中重要的,或者说是变化大的方向(特征)(也可以说是矩阵对原始空间影响最大的方向),再利用找到的(几个)重要的(变化大的)方向(特征),把原始的高秩矩阵表示成多个秩一矩阵的和的形式,从而(可以)实现对原始高秩的矩阵的近似和压缩。
emmm 有点不像人话(而且怎么加了一堆括号去解释emmm),不过后面会解释的,这里先用一句话简单概括一下:
找到矩阵中最重要的特征,用这些特征去近似表示原始矩阵,这样能够大大减少所需的存储空间,同时损失的特征也很少。相当于用很少的损失换来了很多的存储空间。
打个不恰当的比方,比如你数学想从 140 提到 145+,其实只有五分,但是你为了这五分可能需要花出不少时间 (而且还不一定能稳 145+,咳咳咳) ,但是如果你不打算提的话,相当于你损失了并不多的分,但是换来了很多的时间。

okok,接着我需要来慢慢解释那个不像人话的东西了。

前置知识

emmm…一下子就上强度并不好()so 讲奇异值分解之前,我们先补充几个概念(针对和我一样的线代小白,大佬可跳过())——对称矩阵(symmetric matrix)、正交矩阵(orthogonal matrix)、矩阵的秩(rank)和矩阵的特征值(eigenvalue)

对称矩阵

okok,作为前置知识的第一部分,对称矩阵这个概念本身还是挺好理解的,不过它有一些有趣的性质,和下面我们会说到的特征值分解和奇异值分解相关。

首先捏,对称矩阵,既然要对称肯定得是个方阵(这样才有斜着的 “对称轴” 诶)。定义也很简单——关于主对角线,也就是从左上角到右下角的对角线对称的矩阵,就是对称矩阵。
换个比较数学的说法,假设我们有一个方阵 A A A A p q A_{pq} Apq 代表它第 p p p 行第 q q q 列的元素,那么对于一个对称矩阵,有:
A i j = A j i A{ij}=A{ji} Aij=Aji

well well,这很 make sense.
不过重点不在这里,定义很好理解,重点在于(实)对称矩阵有一些有趣的性质。。。
首先,一个矩阵和它的转置相乘,最终得到的结果是一个对称矩阵
啊这,这其实很好理解诶,我们不妨设 M = A T A M=A^TA M=ATA,那么 M i j = A i , : T ∗ A : , j M_{ij}=A^T_{i,:}*A_{:,j} Mij=Ai,:TA:,j,即 M 的第 i 行第 j 列的元素等于 A 的转置的第 i 行乘以 A 的第 j 列,再把对应元素乘积的结果加起来。
同样的,我们有 M j i = A j , : T ∗ A : , i M_{ji}=A^T_{j,:}*A_{:,i} Mji=Aj,:TA:,i

ok 现在问题已经很好搞了,转置嘛,相当于把行和列换了一下,也就是说 A i , : T = ( A : , i ) T A^T_{i,:}=(A_{:,i})^{T} Ai,:T=(A:,i)T。然后就很显然了, M i j = M j i M_{ij}=M_{ji} Mij=Mji,即 M M M 是一个对称矩阵。
okok,这个搞定了。这个性质很简单但是后面也会再用到,而且蛮重要的。
另外,对于一个 A T A A^TA ATA 类型的对称矩阵(就是可以被表示成一个矩阵和它转置的乘积形式的矩阵),它还有一个重要的性质——它的所有特征值都是非负的。
关于这一条性质还有下面那条性质,我可能会在我的线性代数专栏里面再写证明,这里的话,会占用掉比较大的篇幅,而且也并不那么 make sense.

next,一个(实)对称矩阵一定拥有 n n n(阶数)个不相同的特征向量,且这些特征向量都可以看作是在新空间内的标准正交基,也就是说,它们彼此正交,且每个特征向量的模长均为 1.
这是个挺重要的性质,后面也会再提到。

怎么说,对称矩阵的这三条性质让它在特征值分解和奇异值分解中都发挥了重要的作用,不过现在先不着急,后面会讲到。

正交矩阵和正交变换

众所周知,一个形状为 n ∗ n n*n nn 的矩阵(不一定是正交矩阵)可以代表 R n \R^{n} Rn 中的线性变换。这个矩阵的第 i i i 列代表原空间中的第 i i i 个标准正交基经过变换后的位置。
举个例子,下面这个图就代表了矩阵 A = [ 1 1 0 1 ] A=\begin{bmatrix} 1 & 1\\ 0 & 1\end{bmatrix} A=[1011] 对原始空间的变换,其实也很好理解,它相当于把原始空间中的标准正交基 “移动” 到了新空间中的位置,也就是把 ( 0 , 1 ) (0,1) (0,1) 移动到了 ( 1 , 1 ) (1,1) (1,1) 的位置。(另一个标准正交基位置不变)

矩阵变换的例子

em,不过,如果画个图,我们能够很明显地看到,在上面这个例子中,原来的基底(标准正交基)经过变换后已经不再是标准正交基了,它们既不标准(即模长为 1),也不正交(即相互垂直)。
however,如果我们想让经过矩阵变换之后的基底依然是标准正交基,说的简单点就是,只想把原空间中的所有向量旋转一个特定的角度,但是不改变它们的大小和它们中任意两个的夹角,这怎么办?

okay,这时候正交矩阵就要上场了。
正交矩阵是干什么的捏?其实也很简单,就是把整个空间旋转一下(或者做镜面反射,但我们在这里不考虑这种情况),但是不改变空间的任何其它特征。
嗯,那么正交矩阵有什么特点呢?
前面提到过,我们要让一个空间经过正交矩阵的变换之后,原空间中的标准正交基在新空间中依然是标准正交基。这样的话,正交矩阵的特点(在这一个方面的特点)也就比较明确了:它的每一列之间彼此内积为 0,且每一列(可以看作一个列向量)的模长为 1。
比如说,下面这个矩阵就是一个正交矩阵,它代表了在 R 2 \R^2 R2 中旋转 45° 的变换。
A = [ 1 2 − 1 2 1 2 1 2 ] A = \begin{bmatrix} \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{bmatrix} A=[2 12 12 12 1]

具体的旋转效果如下图所示。

正交变换例子

了解了正交矩阵,其实正交变换就很好理解了,正交矩阵所代表的变换就被称为正交变换,正交变换不改变原始空间中向量的模长和相对位置,就这么简单~

矩阵的秩

秩,rank,每个线代人肯定都对这玩意蛮熟的()咳咳咳不过这玩意当时硬控我半小时()所以还是值得唠一唠的(((
首先啊,秩,嗯,既然矩阵有行和列,那秩肯定也有行秩和列秩,并且呢,矩阵的行秩和列秩是相等的(同济线代给了证明我就不在这里放了)。
因为行秩和列秩是相等的,所以这里就不分开讨论了,我们就拿行秩举例。

对于一个矩阵 A A A,行秩的定义是: A A A 中线性无关的横行的极大数目。
解释一下,极大在这就是最大的意思。
so,这个定义怎么理解捏…?
先说代数意义,后面会看几何意义。

定义里提到了一个词:线性无关。
向量的线性无关可以理解为,我有一堆向量,如果其中的任何一个向量都不能被表示为其它的一个或多个向量的线性组合的形式,就说这些向量是线性无关的。
相反,如果有一个向量能够被表示为另外一个或几个向量的线性组合的形式,那么就说这些向量线性相关。

那这下就好办了,我们暂时别把矩阵当矩阵看()我们把矩阵的每一行都看成一个向量。这不就回到向量的问题了嘛!
举个例子,比如我这个矩阵有 n n n 行,就相当于 n n n 个向量,然后其中一个向量 a a a 可以用 λ b + σ c \lambda b+\sigma c λb+σc 来表示,其中 λ , σ \lambda, \sigma λ,σ 是常数, b , c b,c b,c 是另外两个向量。除此之外没有任何一个向量可以被表示为其它一个或多个向量的线性组合的形式。
这种情况下,我这个矩阵的行秩的就是 n − 1 n-1 n1。因为把那个能用 b , c b,c b,c 表示的 a a a 去掉,其它的 n − 1 n-1 n1 个向量,也就是矩阵的 n − 1 n-1 n1 行,都线性无关,所以这个矩阵的行秩就是 n − 1 n-1 n1,它的秩就是 n − 1 n-1 n1

现在是不是感觉,啊,好像绕回来了()。

再简单点,我现在有 n n n 个向量(矩阵的 n n n 行),我要在它们当中选出一些构成集合 S S S,使得 S S S 中的这些向量之间都线性无关。并且还有一个条件,即,如果再从剩下的没有被选出的向量中任选一个,加入到 S S S 中,那么 S S S 中就有线性相关的向量了。
在这种情况下, S S S 中元素数量的最大值就是矩阵的行秩,也是矩阵的秩。
(emm 我怎么感觉这个反而有点绕)

我感觉其实代数意义已经蛮清楚了,下面看看几何意义()()只能说还是这个比较直观()。
还是一样的,把矩阵的每一行看作一个向量。其实,这些向量张成的空间的维度就是矩阵的行秩。(列秩也是同理)
就像下面这个图,就是行秩为 2 的意思。我们如果把向量 a , b a, b a,b 看成是矩阵的行向量,那么这两个向量张成的空间的维度就是 2。

行秩为 2

诶,这个就比较有趣了。
为什么有趣呢?
emmm 因为这么看,上面那些绕来绕去的什么最大线性无关,就很好理解了啊!

矩阵 n n n 行,相当于 n n n 个向量,行秩的定义是什么,是这些向量中线性无关向量的最大数目,对吧。
从几何上看,这 n n n 个向量会张成一个空间,这个空间的维度最高是 n n n 维,对应所有向量线性无关的情况。On the contrary,如果有一些向量能够被表示成其它向量的线性组合的形式(也就是线性相关),那这个向量的存在就不会增加这一堆向量张成的空间的维度,也就是说它对矩阵的行秩没有贡献,所以线性无关向量的其实就是加进来可以增加张成的空间的维度的向量,最大线性无关向量的数量就是这堆向量张成的空间的维度!也就是行秩呀。

有趣有趣。
感觉这块说明白了()可以进入到下一块了()

矩阵的行空间和列空间

well,这个其实可以算对上一个 part(秩)的延伸…? 也不全是吧,但是可以从上一个 part 的几何部分出发。
刚才几何部分说了什么,嗯,矩阵的行秩等于它所有的行向量张成的空间的维度,对吧,列秩也是一样。

没错,这个 “行向量张成的空间” 其实就是行空间!(列空间同理,不再单独说了
对于行空间,你在下文中可能还会接触到一个概念——行空间的方向。
其实这个概念也好理解,既然行向量张成的空间就是行空间,那行空间的 “方向” 其实也就是这些行向量的方向

well,不过其实矩阵的四大子空间(除去行空间和列空间之外还有零空间和左零空间)有挺多好讲的东西的,不过我现在也没研究太明白 ,不过我觉得放到线性代数专栏里讲更合适((((逃

矩阵的特征值和特征向量

嗯…这个东西啊。。。对于理解奇异值是很重要的。
其实这玩意不难,尤其是配合几何直观来看。
不过还是先说代数意义好吧()

我有一个 n n n 阶方阵 A A A(注意条件限定,方阵)。如果我能找到一个非零 n n n 维列向量 x x x 和实数 λ \lambda λ,使得这些东西满足下面这个关系式:
A x = λ x Ax=\lambda x Ax=λx

那么就说向量 x x x 是矩阵 A A A 的特征向量, λ \lambda λ 是矩阵 A 的特征值。
ennnn…首先对一下维度,两边乘出来的结果都是一个 n n n 维的列向量,没问题。
然后,我们来玩解方程吧!(((内心 os:线性代数里的方程哦~~(~~

emm 好吧好吧,要是要在这里解这个的话那又要铺开好多东西了,行列式的计算,特征方程,所以具体的计算过程就不在这里写啦(可以参考同济那本紫色的线代)。
嗯,总之,这玩意能算出来。。(虽然计算过程有点emmm一言难尽。

一个 n n n 阶方阵有 n n n 个特征值,不过可能会包括相同的值和复数值(这也是为什么不是所有方阵都可以进行特征值分解,后面会提到,因为它的特征多项式是一个 n n n 次方程。另外,一个实对称矩阵的特征值一定是 n n n 个实数,这里不证明了,但是后面奇异值分解的地方会用到。

emmm,延伸一下,那要是不是方阵咋办?那就没有特征值了嘛?
啊不是,其实有的,只是没有实数特征值了。。不过,不过,不过,呃,这里先不讨论复数域内的问题好吧(((逃跑
好吧,不过重点不在这!!!

重点是,特征值、特征向量,到底反映了什么特征捏。。
这就又得回到几何了。
先放结论:特征值和特征向量刻画了矩阵对空间的变换(旋转和伸缩)以及变换程度,我们可以通过特征值和特征向量去描述变换后的新空间中的任何一个向量。

之前说过,我们可以把任意一个 n ∗ n n*n nn 的矩阵看作是对 R n \R^n Rn 空间的一种线性变换。我们可以通过找原始空间中的标准正交基在新空间中的位置来刻画矩阵对空间的变换,并利用这些新的基底定位新空间中所有其它向量。

这是一种方式,不过,特征值和特征向量给我们提供了一种新的方式。

简单点说,你可以把特征向量所在的直线看成空间的“旋转轴”,经过矩阵变换后,在这条直线上的所有向量的方向不变;而特征值则描述了矩阵在特征向量的方向的伸缩程度。
(另外(当然这只是我自己的想法),其实也可以把特征向量按照特征值进行伸缩后的向量看成新空间的基底诶,反正只要不共线就可以看作一组基底嘛。)

下图解释了上面标黄的部分, A A A 就是矩阵,它表示把标准正交基 ( 1 , 0 ) (1,0) (1,0) 变换到 ( 2 , 0 ) (2,0) (2,0) 的位置(蓝色),而把标准正交基 ( 0 , 1 ) (0,1) (0,1) 变换到 ( 1 , 3 ) (1,3) (1,3) 的位置(白色)。
okay,现在新空间已经被两个标准正交基变换后的向量给确定下来了,我们不妨来发现一些有趣的东西。。。。

特征值和特征向量

首先看绿色那条线。
在原来的空间中, ( 1 , 1 ) (1,1) (1,1) 在这条线上,进行矩阵变换后, ( 1 , 1 ) (1,1) (1,1) 变换后的向量 ( 3 , 3 ) (3,3) (3,3) 还在这条线上。相当于原始向量的方向没有变,只是在这个方向上伸长了三倍。

再来看蓝色那条线,也就是 x-axis.
在原来的空间中, ( 1 , 0 ) (1,0) (1,0) 在这条线上,进行矩阵变换后, ( 1 , 0 ) (1,0) (1,0) 变换后的向量 ( 2 , 0 ) (2,0) (2,0) 也还在这条线上。相当于原始向量的方向没有变,只是在这个方向上伸长了两倍。

嗯!这样一来,对于矩阵 A A A,它的两个特征值就是 2 和 3,分别对应特征向量 ( 1 , 1 ) (1, 1) (1,1) ( 1 , 0 ) (1, 0) (1,0)

这样就直观多了!
简言之,矩阵的特征值和特征向量反映了矩阵在特定方向上的拉伸(拉长/伸缩)程度。

emmm…不过这玩意在奇异值分解中到底有什么用嘛…
那就看下一节吧!

行了已经唠了五千多字线性代数基础了(真的基础吗???doge)()现在总该进入正题了吧!!

特征值分解

emmm,什么?你以为下一节就直接来到奇异值分解了嘛?不不不!
奇异值分解,其实是矩阵特征值分解的“扩展版”,或者说更为普适的版本。所以,先理解特征值分解,理解它每一步在做什么,为什么要这么做,做了以后能得到什么,会很有助于我们理解奇异值分解!
(读者内心:我到底是来看什么的(()(doge

计算方法

首先,我们需要先明确特征值分解的适用范围,换言之,并不是所有的矩阵都可以进行特征值分解。一般地,只有方阵可以进行特征值分解,并且这个方阵还需要可以对角化
呃呃呃等等,什么玩意,怎么又冒出了新概念。。
啊没事,一个 n n n 阶方阵可对角化,其实就等于,一个 n n n 阶方阵有 n n n 个线性无关的特征向量。至于线性无关、线性相关和特征向量我都在前面解释过啦。

嗯,其实条件还算好理解的,也没有很复杂,那我们就赶紧开始计算了好吧()()
其实特征值分解的计算并不难的,对于一个满足特征值分解条件的 n n n 阶方阵 A A A,它的特征值分解可以被表示为如下形式:
A = Q Λ Q − 1 A = Q\Lambda Q^{-1} A=QΛQ1

其中 Λ \Lambda Λ 就是大写的 λ \lambda λ(lambda),你问我为什么选 Q lamda Q 不选别的,emmm,因为这仨在一起组成的很像那种颜文字表情()()
对于一些更特殊的矩阵——实对称矩阵(前提是可以特征值分解),它的特征值分解也可以写成 A = Q Λ Q T A = Q\Lambda Q^T A=QΛQT,因为实对称矩阵的特征向量构成正交矩阵,而正交矩阵的逆和它的转置相等。
omg 好复杂的逻辑()不过这里我们不展开讨论它。

说回特征值分解的式子,这三个矩阵的形状和 A A A 一致,都是 n ∗ n n*n nn
其中矩阵 Q Q Q A A A 的特征向量构成的矩阵,具体来说, Q Q Q 的每一列都是 A A A 的一个特征向量(前面说过,一个 n n n 阶方阵一定有 n n n 个特征值和特征向量,只不过可能有重复的,也可能有复数特征值。而且,既然可以进行特征值分解,那么这 n n n 个特征向量之间一定是线性无关的,也就是这些特征向量肯定都是不重复的)。
矩阵 Q − 1 Q^{-1} Q1 就是矩阵 Q Q Q 的逆矩阵,就不过多解释了。

现在我们来实际算一下矩阵乘法,感受一下特征值分解到底是怎么反映出矩阵的特征的!

嗯,根据前面说的,这里反映的特征就是矩阵对空间的影响。具体来说就是矩阵对原始空间在哪些方向上进行了拉伸,以及拉伸的程度。

first,我们有一个由 A A A 的特征向量构成的矩阵 Q Q Q,矩阵 Q Q Q 的每一列都是一个特征向量。
为了简单,我们就假设 A A A 是一个 2 ∗ 2 2*2 22 的矩阵,这样它分解成的矩阵每一个都是一个 2 ∗ 2 2*2 22 的矩阵。
注意,这些信息都可以通过前面提到的 A x = λ x Ax=\lambda x Ax=λx 求得。

用上面图片中的那个例子(就是有不同颜色的线的那个图片)。
A = [ 2 1 0 3 ] A=\begin{bmatrix} 2 & 1\\ 0 & 3 \end{bmatrix} A=[2013]

A A A 有两个不相等的特征值和特征向量,特征向量 ( 1 , 0 ) (1,0) (1,0),对应特征值 2;特征向量 ( 1 , 1 ) (1,1) (1,1),对应特征值 3.
ok,很好, A A A 满足 “拥有 n n n 个线性无关的特征向量”,所以可以特征值分解。
emmm 我们先把特征值按照【从左上角到右下角,从大到小】的顺序排起来,然后再看特征向量矩阵的排列(后面会讲原因)。

特征值一个 2 一个 3,所以特征值矩阵 Λ \Lambda Λ 如下:
Λ = [ 3 0 0 2 ] \Lambda=\begin{bmatrix} 3 & 0\\ 0 & 2 \end{bmatrix} Λ=[3002]

ok,接下来我们搞特征向量矩阵 Q Q Q
注意噢,这里有一个细节,关于矩阵中特征值和特征向量的排列顺序的对应。
前面讲过,特征矩阵 Q Q Q 的每一列都是一个特征向量,这些特征向量在 Q Q Q 中并不是随便排序的(也就是说第 i i i 列对应的特征向量是固定的,而不是随便排的)。

实际上,特征向量矩阵中每个特征向量的排列顺序是由它们对应的特征值的大小决定的。
特征值越大(即特征值在特征值矩阵中越靠近左上角),其对应的特征向量在特征向量矩阵中排的列也就越靠前。即,第 i i i 大的特征值对应的特征向量在特征向量矩阵 Q Q Q 中排在第 i i i 列。

ok,有了这个,我们现在就可以写出特征向量构成的矩阵 Q Q Q 了。
Q = [ 1 1 1 0 ] Q=\begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix} Q=[1110]

至于 Q − 1 Q^{-1} Q1,很简单,我们都已经算出 Q Q Q 了,算一下它的逆就可以了。
emm 不过这毕竟不是讲线性代数的专栏,所以逆矩阵到底怎么算就不在这里展开了好吧()(啊啊如果我有时间我一定开个线性代数专栏!(给我自己讲明白了我估计就足够适合小白了(
ok,最终的计算结果是
Q − 1 = [ 0 1 1 − 1 ] Q^{-1}=\begin{bmatrix} 0 & 1 \\ 1 & -1 \end{bmatrix} Q1=[0111]

嗯,这样三个矩阵我们就都有了。其实只要计算出了特征值和特征向量,后面的事情就很好办了。

ok,那回到最开始说的,我们来看看这三个分解后的矩阵是怎么描述矩阵对空间的变换的。
en…描述空间的话,最好的方式(之一)应该是看原始空间中的标准正交基经过变换以后到了哪里。so,我们选取原始空间中的标准正交基 ( 1 , 0 ) , ( 0 , 1 ) (1,0), (0,1) (1,0),(0,1),写成一个矩阵 I I I
I = [ 1 0 0 1 ] I=\begin{bmatrix} 1 & 0\\ 0 & 1 \end{bmatrix} I=[1001]

然后我们按照分解后的三个矩阵的顺序对矩阵 I I I(标准正交基)进行变换。
首先,计算 I Q IQ IQ,因为 I I I 其实是一个单位矩阵,所以结果也很简单的,依然等于 Q Q Q
这一步是什么意思呢,可以联系我们之前那张图来理解——这一步相当于把原来的标准正交基变换到了新位置—— ( 1 , 1 ) 和 ( 1 , 0 ) (1,1)和(1,0) (1,1)(1,0)
嗯。。。说旋转好像不太贴切,因为几何里的旋转要求角度不变,但可以看作是空间的线性变换(或者说就是旋转+角度压缩(啊只是直观描述一下,并不严谨))。

然后捏,我们现在得到矩阵 Q = [ 1 1 1 0 ] Q=\begin{bmatrix} 1 & 1\\ 1 & 0\end{bmatrix} Q=[1110],接下来我们把它和特征值矩阵 Λ \Lambda Λ 相乘,也就是 [ 1 1 1 0 ] × [ 3 0 0 2 ] \begin{bmatrix} 1 & 1\\ 1 & 0\end{bmatrix} × \begin{bmatrix} 3 & 0\\ 0 & 2\end{bmatrix} [1110]×[3002],最终结果是 [ 3 2 3 0 ] \begin{bmatrix}3 & 2\\ 3 & 0\end{bmatrix} [3320].

这个结果是什么意思捏,其实也好理解,我们对着看嘛,特征向量矩阵 [ 1 1 1 0 ] \begin{bmatrix} 1 & 1\\ 1 & 0\end{bmatrix} [1110] 和特征向量矩阵和特征值矩阵相乘以后的结果 [ 3 2 3 0 ] \begin{bmatrix}3 & 2\\ 3 & 0\end{bmatrix} [3320],其实就是把每个特征向量拉伸了特征值那么多倍呀。
嗯, ( 1 , 1 ) (1,1) (1,1) 和对应的特征值 3 相乘以后得到 ( 3 , 3 ) (3, 3) (3,3) ( 1 , 0 ) (1, 0) (1,0) 和对应的特征值 2 相乘以后得到 ( 2 , 0 ) (2, 0) (2,0),这很好呀!

okok,阶段性总结一下,特征向量矩阵相当于对空间做了一个类似于旋转的动作(但不是几何学上的旋转),然后特征值相当于对变换后的空间在特征向量的方向上进行了伸缩
至于最后那个和特征向量矩阵的逆矩阵相乘的操作,我们首先需要明确,既然一个矩阵代表对空间的线性变换,那么这个矩阵的逆矩阵就代表对空间的相反的线性变换(形象点就是,撤销原始矩阵的变换)。
这么说来,其实和特征向量矩阵的逆矩阵相乘,就是在“撤销”特征向量矩阵对空间的变换。

ok!!! 现在我们差不多已经理解了特征值分解的步骤,以及每一步的具体意义了!!

接下来,我们进入特征值分解的最后一个 part——特征值分解的局限性。

局限性

oh well…我们这篇的核心其实是奇异值分解,对吧。如果特征值分解把什么事情都做了,那还要奇异值分解干嘛(()所以,这就意味着,特征值分解一定具有一些局限性。

ok,我们先总结一下一个矩阵能进行特征值分解的前提条件:

  • 这个矩阵得是一个方阵(假设是 n ∗ n n*n nn 的)
  • 这个矩阵得有 n n n 个线性无关的特征向量

好好好,别看只有两条,其实这两条已经筛选掉很多矩阵了emmm()首先矩阵,就是那种行数和列数不相等的矩阵,肯定比方阵多,这就让特征值分解的可用空间大大缩小了,而且在剩下的很少的这些方阵中,还得有 n n n 个线性无关的特征向量,这样剩下的矩阵(方阵)就更少了,so 特征值分解并不能完美地覆盖到所有情况,甚至它只能覆盖很局限的一些情况。

而且,因为只适用于方阵,所以特征值分解只能描述同一个空间中的变换情况,或者说它两次旋转变换使用的都是同一组基底,这也是特征值分解的局限之一。

ok 啊,正是因为特征值分解有诸多的局限性,一种新的矩阵分解——奇异值分解,来了!

奇异值分解

好嘞好嘞!!我们终于来到了最后一个 part,奇异值分解!
有了前边的一堆铺垫,或许奇异值分解也会变得比较好理解一些。

首先,我们还是先明确,奇异值分解要干嘛?
其实这个在文章最开始就讲过了,不过我们不妨在这里再重复一遍,用更简洁的语言。

奇异值分解,本质上就是通过因子分解的方式,找到原始矩阵对空间影响最大的方向/变化最大的方向,并量化这种影响的程度。奇异值分解提供了一种对矩阵进行低秩近似的方法。

好,记下这句话,这部分的终极目标就是让你理解这句话到底在讲什么!!!

计算方法

我打算先讲奇异值分解具体是怎么算的,然后再探讨为什么这么算有用。
奇异值分解其实是一种对矩阵进行因子分解的方法,和对多项式进行因式分解差不多。具体来说,对于任意一个非零的 m ∗ n m*n mn 实矩阵 A ∈ R m ∗ n A\in \R^{m*n} ARmn,它都可以被表示三个实矩阵乘积形式的运算,即:
A = U Σ V T A=U\Sigma V^T A=UΣVT

嗯…这三个矩阵是怎么来的?我们一个一个来看。
首先我们先明确这三个矩阵的形状。
A A A 的形状已经说过了,是 m ∗ n m*n mn U U U 的形状是 m ∗ m m*m mm Σ \Sigma Σ 的形状是 m ∗ n m*n mn V V V 的形状是 n ∗ n n*n nn。这三个矩阵相乘得到的的确是 A A A 的形状。
嗯…看到 A A A U , V U,V U,V 的形状关系,你可能已经猜到了 (强行过渡啊不是) ,这俩既然是两个方阵,而且维度和 A A A 的维度又这么相关…那,显然只有 A A A A T A^T AT 搞点事情才能搞出这俩来。(《论我的用词》(doge

先不解释为什么这么算有用,先把具体的计算过程过一遍。
依然是,先总结:矩阵 A A A 的奇异值分解可以通过求对称矩阵 A T A A^TA ATA 和对称矩阵 A A T AA^T AAT 的特征向量和特征值得到。(不像人话的东西又冒出来了err(

我们一个一个来看。
A T A A^TA ATA 的特征向量构成正交矩阵 V V V 的列;
A T A A^TA ATA 的特征值的平方根为奇异值,对其由大到小排列作为对角线元素,构成对角矩阵 Σ \Sigma Σ
A A T AA^T AAT 的特征向量构成正交矩阵 U U U 的列。
这三个矩阵相乘就得到了原始矩阵 A A A

嗯,如果你想要验证上面这些是不是正确的,有一个比较简单的方法——量纲分析法 ,啊不,我是说,形状分析法()()比如 A T A A^TA ATA 的形状是 n ∗ n n*n nn,就有 n n n 个不相同的特征向量,构成 V V V 的列,而 V V V 的形状也正好是 n ∗ n n*n nn,这就对上了。这大概可以算是一个初步的判断方法。

well well,说回三个矩阵。
这里面疑点很多。(认真脸(不是

  • 为什么 A T A A^TA ATA A A T AA^T AAT 就一定有 n   o r   m n \ or \ m n or m 个不相同的特征向量?
  • (在上一条的前提下)为什么这些特征向量恰好能构成正交矩阵?
  • A T A A^TA ATA 的特征值的平方根是奇异值,那也就暗示了特征值一定是非负的,why?

嗯,其实三个问题都已经在前置知识的第一部分说过啦!
根据那里说到的对称矩阵的第一条性质, A T A A^TA ATA A A T AA^T AAT,都是一个矩阵和它的转置相乘,这得到的会是一个对称矩阵;再根据对称矩阵的第二条性质,一个对称矩阵有和它阶数相同的特征向量数,并且,这些特征向量彼此正交且模长为 1;然后再根据正交矩阵的定义,这些彼此正交的模长为 1 的特征向量构成的就是一个正交矩阵。由此,第 1、2 个问题就得到了解释~

ok,现在我想你对于奇异值分解的计算方式已经明确了,记住这个计算方式,后面会不定时需要你调取这个记忆(((

最后,放个例子来结束这一小节~:

奇异值分解计算举例

存在性和非唯一性

emm,前面提到了特征值分解的局限性,和奇异值分解的普适性,however,我们不能只说说,对吧()还是要证明的()
emmm 不过,证明我就不在这里详细地写了(如果有时间就丢到线性代数专栏里写吧(((《如果有时间》(doge),so 我把《统计学习方法》上的证明放在这里:统计学习方法——第十五章

不过我感觉这部分其实可以先暂时跳过诶 (我是线代小白(敲脑袋)) ,我觉得后面的内容更重要一些!

几何解释

okay,我们实在是看了不少数学了()休息一下,其实奇异值分解(我感觉)从几何角度去理解会比从纯代数角度去理解要简单一些,我们不妨上一张经典的图:

奇异值分解的几何解释

这图是我从《统计学习方法》里面搞来的()确实经典()

先来总结:从几何角度看,矩阵的奇异值分解可以被看作是三个几何变换:先旋转——再伸缩——再旋转。 或者说,(从纯几何角度来看),奇异值分解可以被看作是把一个矩阵对空间的作用,拆成了三个离散的连续过程(什么表述,,,

我们考虑如下变换:
T : x → A x T:x \to Ax T:xAx

其中 A A A 是一个 m ∗ n m*n mn 的矩阵,向量 x ∈ R n x \in \R^{n} xRn,变换后的向量 A x ∈ R m Ax \in \R^m AxRm。所以矩阵 A 代表了一个从 n n n 维空间到 m m m 维空间的变换。奇异值分解把这个变换拆解成了三个 “子变换”,具体来讲,是一个旋转,一个伸缩,再一个旋转。

okay,看图看图。我们首先来看左上角的那个圆,也就是最初的那个圆,它里面红色和黄色的线代表了原始空间中的标准正交基。
首先是第一个旋转,可以看到,呃,其实没什么好说的,就是一个非常正常的旋转,这一步并不改变空间的维度。
接着,是一个伸缩。注意,在大多数问题中,空间的维度将在这一步被改变(不过这张图并不是,它一直是在二维空间中)。这张图中的两个深蓝色的 σ 1 , σ 2 \sigma_1, \sigma_2 σ1,σ2 表示旋转后的标准正交基(即左下角图中的红色和黄色的向量)在原始坐标系(左上角图)的正交基方向上的拉伸程度。好吧说的简单点,就是它现在不是已经经过了一个旋转嘛,第二步就是在原始的,没有旋转的正交方向上,去拉伸这两个已经被旋转后的向量,相当于在不同的方向上做不同的缩放。
再接着,又是一个旋转,和第一个旋转一样,并不改变空间维度。
根据上一节说的 “存在性”,对于任何一个矩阵,这样的几何分解一定存在。

总结一下,头尾两个旋转并不改变空间的维度,中间那个伸缩变换(我个人感觉)起了最重要的作用,它主要有两个用处:

  • 改变空间的维度,将原始的 n n n 维向量映射到新的 m m m 维空间中
  • 在原始空间的正交方向上对旋转后的标准正交基进行伸缩(记住这句话!!!)

okkkkk,我觉得现在关于奇异值分解的算法应该已经比较 make sense 了。接下来,我觉得我们有必要看看,到底为什么这么算就有用啊!!!

为什么这么算有用?

okay!!! 终于!来到这个激动人心的话题!
反正我是一直超级好奇这个问题,无论代数解释也好几何解释也好,分解出来三个矩阵/三张图片,怎么就能反映矩阵对空间的变换最大的方向了??这到底是怎么来的???

okok,经过我和线性代数艰苦卓绝(?)的斗争,我觉得我算是搞明白了,不过能不能讲清楚就是另一回事了(doge。

首先我们需要先知道,我们搞出来的那三个矩阵分别代表了什么,然后才能解释为什么这么算是有用的。
well,再重复一遍,奇异值分解其实就是要找到矩阵对空间影响最大的方向,或者说矩阵中变化最大的方向,至于什么低秩近似那些,咱们先不管。

并且,因为 U U U V V V 的 “构成方式” 其实很相似,都是 A 和 A 的转置搞出来的,只不过顺序不一样,所以维度不一样。不过它们的本质是一样的,所以我们在这里只用分析一个。在这里我分析 V V V
回顾一下上面的计算方法, A T A A^TA ATA 的特征向量构成 V V V 的列,特征值的算术平方根(奇异值)构成 Σ \Sigma Σ 的对角线元素。

好嘞,这样的话,追根溯源嘛,我们得先看看 A T A A^TA ATA 是个什么东西,再看它的特征向量和特征值反映了什么。(这下子你知道我为什么要先讲特征值和特征值分解了吧,嘿嘿嘿(QAQ(插句话:先记住这个 QAQ,文末有彩蛋((插句话结束

首先呢, A T A A^TA ATA 是一个 n ∗ n n*n nn 的对称矩阵(它其实反映了原始矩阵的列空间),它有 n n n 个彼此正交的模长为 1 的特征向量。

然后我们先对它进行特征值分解,得到: A T A = Q Λ Q − 1 A^TA = Q\Lambda Q^{-1} ATA=QΛQ1.

ok,根据我们前面说的,这里 Q Q Q 就是 V V V,然后 Λ \Lambda Λ 开算术平方根就得到 Σ \Sigma Σ
也就是说: A T A = V Σ Σ T V − 1 A^TA = V\Sigma \Sigma^T V^{-1} ATA=VΣΣTV1

前面说过 V V V(奇异向量矩阵)代表旋转,也就是把原来的标准正交基给旋转一下,但是不改变空间的任何别的性质。
然后呢, Σ \Sigma Σ 代表什么,它是 A T A A^TA ATA 的特征值的平方根,它表示一种伸缩,是什么在什么方向上伸缩呢,yes,是奇异向量在原始的标准正交基(矩阵变换前的标准正交基)方向上的伸缩程度!
o 这句话可能不太好理解,我们进一步解释一下。
其实 Σ \Sigma Σ 反映的是原始的标准正交基在原始方向上的伸缩程度,但是因为第一个旋转没有改变空间维度,所以奇异向量的伸缩程度也可以通过原始标准正交基在原始方向上的伸缩程度来刻画。

这意味着什么?这不就说明,奇异值越大,它对应的奇异向量(也就是 V V V 中的向量)在原始标准正交基方向的伸缩程度就越大,也就是说,对原始空间的变换程度就越大呀!

哦吼!这下好像就清晰了,简单概括一下,奇异向量反映了矩阵对原始标准正交基的旋转,而奇异向量对应的奇异值则反映了奇异向量在原始标准正交基方向上的伸缩程度。

所以,奇异值越大,奇异向量在原始标准正交基方向上的伸缩程度也就越大,这就等于反映了矩阵对于原始空间在不同方向的变换程度呀!

我觉得这块值得好好看几遍()我写完这里以后我觉得我是真的懂了。emmm 但是我不清楚我写的是否足够清楚。

矩阵的低秩近似

嗯,说完前面那么多纯数学的东西,下面来看看奇异值分解到底有什么用()
其实之前也讲过很多遍了欸,做完奇异值分解之后,可以用低秩矩阵去近似一个高秩矩阵,我们把它成为矩阵的低秩近似。

其实如果你理解了 “为什么这么算有用” 的部分,这一个部分理解起来会很简单。
因为我们已经知道了为什么最大的奇异值对应矩阵对空间影响最大的方向,所以现在我们就可以选取那些最大的奇异值还有它们对应的方向(对空间影响最大的方向)(由特征向量表示),(丢掉那些对空间影响很小的方向),去近似这个矩阵。

这很 make sense.

所以这大概就是,比如我们要用一个秩一矩阵去近似原始的高秩矩阵,那么我们就选取奇异值分解后的三个矩阵中的:
U U U 的第一列( m ∗ 1 m*1 m1 矩阵) + Σ \Sigma Σ 的最左上角的那个元素( 1 ∗ 1 1*1 11 矩阵)+ V V V 的第一行( 1 ∗ n 1*n 1n 矩阵)。

同样的,如果我们想用一个秩 k 矩阵(相当于 k 个秩一矩阵,k 小于原矩阵的秩 r)去近似原始的矩阵,那我们就选取奇异值分解后的三个矩阵中的:
U U U 的前 k k k 列 + Σ \Sigma Σ 中前 k k k 行前 k k k 列的块 + V V V 的前 k k k 行。

下面这张图形象地描述了低秩近似。

在这里插入图片描述

emmm 不过可能只说怎么选,不看一个例子,还是不够直观,so 我选取了一个例子(这个视频做的真好!):

左上角白色的是原始矩阵,最上面一排是它奇异值分解以后的结果。
中间的一排其实就是在把它表示成多个秩一矩阵之和,因为它原本是一个秩为 4 的矩阵,所以最多可以表示为 4 个秩一矩阵的和。

然后,最下面一排,从第一到第四个,分别是用一到四个秩一矩阵的和去近似的结果,也就是从只选取最大的奇异值到选取所有的四个奇异值去近似的结果。这个图还是蛮形象的!
矩阵的低秩近似例子

ok!!! 到目前为止!你已经基本理解了矩阵的奇异值分解!(我感觉我写的还算全面)下一篇主成分分析中会加一些内容,不过最核心的就是这些啦!

总结/彩蛋

怎么说,说了这么多,我们分别来总结一下特征值分解和奇异值分解吧!

emm 其实挺简单的()

特征值分解奇异值分解
适用范围具有 n n n 个线性无关特征向量的 n n n 阶方阵任何矩阵!
计算方法 A = Q Σ Q − 1 A=Q\Sigma Q^{-1} A=QΣQ1 A = U Σ V T A=U\Sigma V^T A=UΣVT
变换拆解旋转—伸缩—旋转,不改变空间维度旋转—伸缩—旋转,但改变空间维度
反映特征矩阵对空间进行变换时,方向不变的向量(特征向量)以及在相应方向上的伸缩程度(特征值)矩阵对空间进行变换时,拉伸程度最大的方向以及在相应方向上的拉伸程度

哦对了,最后放一张好玩的图(彩蛋),目前已经成为我的表情包::
好玩!

我想,现在你应该知道这个图是什么意思了()()

okokokkk,啊,线性代数,这篇,终于,结束了!!!(cheeeeer!!!
下一篇再见!下一篇讲主成分分析((((其实如果你理解了奇异值分解,主成分分析就并不难啦!

这篇文章介绍了矩阵的特征值分解和奇异值分解,希望对你有所帮助!⭐
欢迎三连!!一起加油!🎇
——Geeker_LStar

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值