1. 引言
复习上一篇文章《最小二乘问题详解1:线性最小二乘》中的知识,对于一个线性问题模型:
f(x;θ)=Aθ
那么线性最小二乘问题可以表达为求一组待定值θ,使得残差的平方和最小:
θmin∥Aθ−b∥2
本质上是求解超定线性方程组:
具体的线性最小二乘解是:
θ∗=(ATA)−1ATb(1)
2. 求解
2.1 问题
虽然线性最小二乘解已经给出,但是并不意味着在实际的数值计算中就能按照式(1)来进行求解。一个典型的问题就是求逆矩阵:在工程实践和数值计算中,直接求解逆矩阵通常是一个性能消耗大且可能不精确的操作,应该尽量避免。举例来说,我们按照大学本科《线性代数》课程中的方法写程序来求解一个逆矩阵,假设使用伴随矩阵法:
A−1=det(A)1⋅adj(A)
其中:
- det(A) 是矩阵 A 的行列式。
- adj(A) 是 A 的伴随矩阵。
为了求解伴随矩阵 adj(A):
-
求代数余子式 (Cofactor):对于矩阵 A 中的每一个元素 aij,计算其代数余子式 Cij。
- 代数余子式 Cij=(−1)i+j⋅Mij
- Mij 是删去 A 的第 i 行和第 j 列后得到的子矩阵的行列式(称为余子式)。
-
构造余子式矩阵:将所有代数余子式 Cij 按照原来的位置排列,形成一个新矩阵 C(称为余子式矩阵)。
-
转置:将余子式矩阵 C 进行转置,得到的矩阵就是伴随矩阵 adj(A)。
adj(A)=CT
-
代入公式:将 det(A) 和 adj(A) 代入公式 A−1=det(A)1⋅adj(A) 即可。
这里我们大概能估算,使用伴随矩阵法求逆矩阵的理论复杂度是O(n!),这是一个阶乘级的增长,算法效率非常低。《线性代数》中介绍的另外一种算法高斯消元法也只能达到O(n3),呈指数级增加。其实效率只是一方面的问题,使用计算机求解的另外一个问题是舍入误差累积:在计算机中,浮点数运算存在固有的舍入误差;求逆过程涉及大量的除法和减法运算,这些误差会在计算过程中不断累积和传播。总而言之,使用通解求解逆矩阵,可能存在不精确且性能消耗大的问题。
2.2 QR分解
那么不使用逆矩阵怎么办呢?我们需要注意的是,最小二乘问题的本质是求解,而不是求逆矩阵,因此关键是要求解正规方程:
ATAθ=ATb
对矩阵A作QR分解:
其中:
- Q1∈Rm×n 列正交,满足Q1TQ1=In;
- R∈Rn×n是上三角矩阵,如果A列满秩,则R的对角元均非零,可逆。
那么把A=Q1R代入正规方程,得到:
(Q1R)T(Q1R)x=(Q1R)Tb
左边整理,因为Q1TQ1=In:
RTQ1TQ1Rx=RTRx
右边为
因此正规方程等价于
RTRx=RT(Q1Tb)
若R可逆(即A满秩,rank(A)=n),则RT也可逆。左右两边左乘(RT)−1,得到:
Rx=Q1Tb.
令c=Q1⊤b(这是一个长度为n的向量),于是我们得到一个简单的上三角线性系统:
Rx=c,c=Q1Tb
这就是QR方法把正规方程化简得到的核心结果:只需解上三角方程Rx=Q1Tb。
以上只是对A列满秩的情况做了推导,如果A列满秩,那么QR分解可以表示为x=R−1Q1⊤b;如果A列不满秩(R奇异),需要使用列主元QR方法对RTRx=RT(Q1Tb)进行求解,或者干脆使用下面要介绍的SVD分解(奇异值分解)法。
2.3 SVD分解
另外一种求解的方法是SVD分解。对任意矩阵A,存在奇异值分解:
A=UΣVT
其中:
-
U∈Rm×m为正交(列为左奇异向量),
-
V∈Rn×n为正交(列为右奇异向量),
-
Σ∈Rm×n为“对角块”矩阵,通常写成
Σ=[Σr000]
其中Σr=diag(σ1,…,σr),(σ1≥σ2≥⋯≥σr>0),r=rank(A)。
将SVD代入正规方程,先计算A⊤A:
ATA=(UΣVT)T(UΣVT)=VΣTUTUΣVT=V(ΣTΣ)VT.
注意UTU=I。而ΣTΣ是n×n的对角块矩阵,其非零对角元就是σi2(i=1..r),其余为零。
同样的,计算ATb:
ATb=VΣTUTb.
于是正规方程变为:
V(ΣTΣ)VTx=VΣTUTb.
两边左乘VT,因为V正交,VTV=I,得到:
(ΣTΣ)(VTx)=ΣT(UTb)
把y=VTx与c=UTb代入,得到更简单的对角方程:
(ΣTΣ)y=ΣTc
接下来按奇异值分块展开对角方程,先写出Σ相关的形状:
Σ=[Σr000],Σ⊤Σ=[Σr2000]
对y和c也做相应分块:
y=[y1 y2],c=[c1 c2]
其中y1,c1∈Rr对应非零奇异值,y2,c2对应奇异值为0的部分(维度 n−r),代入得到分块方程:
[Σr2000][y1y2]=[Σr000][c1c2]
即等价于两组方程:
Σr2y1=Σrc1,0=0⋅c2 (无约束/自由分量)
由于Σr为对角且可逆,第一式等价于
Σry1=c1⟹y1=Σr−1c1.
而y2(对应零奇异值的分量)在正规方程中不受约束——这反映了在列秩不足时普通最小二乘解不是唯一的(可以在零空间方向任意加解)。为得到最小范数解(惯常的选择),取 y2=0。
最后回到x的求解,对于y有:
y=[Σr−1c10]
将c1与c=U⊤b关系代回:
y=[Σr−1000]UTb
由于y=VTx,于是:
x=Vy=V[Σr−1000]UTb
定义Σ+为将非零奇异值取倒数后转置得到的伪逆矩阵(对角块为Σr−1,其余为0),则
x+=VΣ+UTb
这就是 最小二乘的 Moore–Penrose 伪逆解:
- 若A列满秩,则为唯一最小二乘解,由于那么Σ+=Σ−1,SVD求解公式退化为常见的x=VΣ−1UTb
- 若秩亏,它给出 在所有最小二乘解中范数最小的那个(minimum-norm solution)。
2.4 比较
从以上论述可以看到,SVD分解稳定且能处理秩亏的情况,但比QR分解慢,复杂度高,通常O(mn2);QR分解在列满秩、条件数不是太差时更快;若需要判定秩或求最小范数解,SVD是首选。
3. 补充
在最后补充一些基础知识,也是笔者很感兴趣的一点,那就是为什么一个矩阵A可以进行QR分解或者SVD分解呢?
3.1 QR分解
QR分解其实非常好理解,它的本质其实就是大学本科《线性代数》课程中提到的施密特(Gram–Schmidt)正交化。我们先复习一下施密特正交化相关的知识。
设有一组线性无关向量
a1,a2,…,an∈Rm
我们想把它们变成一组正交(再归一化后变成标准正交)的向量q1,q2,…,qn。具体步骤如下:
-
取第一个向量,归一化:
q1=∣a1∣a1
-
对第 2 个向量,先减去在q1上的投影:
q~2=a2−(q1Ta2)q1
然后归一化:
q2=∣q~2∣q~2
-
对第 3 个向量,减去它在前两个正交向量上的投影:
q~3=a3−(q1Ta3)q1−(q2Ta3)q2
然后归一化:
q3=∣q~3∣q~3
-
一般地,对第j个向量:
q~j=aj−i=1∑j−1(qiTaj)qi,qj=∣q~j∣q~j
这样得到的qi就是标准正交基,且每个qj只用到了前j−1个。
现在把矩阵A看成由列向量组成:
A=[a1,a2,…,an]∈Rm×n.
把施密特正交化写成矩阵形式,我们得到一组正交向量:
Q1=[q1,q2,…,qn]∈Rm×n,Q1TQ1=In.
同时,原向量可以写成:
aj=i=1∑jrijqi
其中:
rij=qiTaj
把这些关系拼成矩阵形式:
其中:
- R=(rij)是n×n上三角矩阵,因为第j列只用到前j个qi。
- Q1的列正交,所以Q1TQ1=I。
3.2 SVD分解
SVD分解其实也非常有意思,同样也可以顺着《线性代数》中基础知识来进行推导。首先复习一下特征值和特征向量。对于一个方阵 A∈Rn×n,如果存在一个非零向量 v∈Rn 和一个实数 λ,使得:
Av=λv
那么:
- λ 称为 特征值(eigenvalue)
- v 称为对应于 λ 的 特征向量(eigenvector)
接下来复习一下什么叫做对角化。如果一个n×n矩阵A可以写成:
A=PDP−1
其中:
- D 是一个对角矩阵(只有对角线上有元素)
- P 是一个可逆矩阵
我们就说 A 是 可对角化的。
而且通常:
- D 的对角元素是 A 的特征值:D=diag(λ1,…,λn)
- P 的列是对应的特征向量
即:
P=[v1 v2 ⋯ vn],D=λ1⋱λn
对角化非常重要,因为对角矩阵计算非常简单,比如计算Dk只需把对角元各自取k次方即可。对角化的本质就是把复杂的线性变换,变成旋转 → 拉伸 → 逆旋转的过程。注意,不是所有矩阵都能对角化,只有当矩阵有n个线性无关的特征向量时,才能对角化。但是,所有对称矩阵(如 ATA)都可以对角化,而且可以使用正交矩阵对角化。
也就是说,存在正交矩阵V,使得:
ATA=VΛVT,Λ=diag(λ1,…,λn)
然后根据这个对角化公式,构造U和Σ,最终得到SVD:
A=UΣV⊤
这里具体构造U和Σ的过程还是有点繁琐的,这里就不进一步推导了,免得离题太远。