\quad 特征值解法 代数意义上的线性最小二乘是指给定矩阵 A ∈ R m × n \boldsymbol{A} \in \mathbb{R}^{m \times n} A∈Rm×n,计算 x ∗ ∈ R n \boldsymbol{x}^{*} \in \mathbb{R}^{n} x∗∈Rn,使得:
x ∗ = arg min x ∥ A x ∥ 2 2 = arg min x x ⊤ A ⊤ A x , s.t., ∥ x ∥ = 1. \boldsymbol{x}^{*}=\arg \min _{\boldsymbol{x}}\|\boldsymbol{A} \boldsymbol{x}\|_{2}^{2}=\arg \min _{\boldsymbol{x}} \boldsymbol{x}^{\top} \boldsymbol{A}^{\top} \boldsymbol{A} \boldsymbol{x}, \quad \text { s.t., }\|\boldsymbol{x}\|=1 . x∗=argxmin∥Ax∥22=argxminx⊤A⊤Ax, s.t., ∥x∥=1.
\quad 可以看到 A ⊤ A \boldsymbol{A}^{\top} \boldsymbol{A} A⊤A 为一个实对称矩阵, 而根据线性代数的矩阵, 实对称矩阵总是可以利用特征 值分解进行对角化的:
A ⊤ A = V Λ V − 1 \boldsymbol{A}^{\top} \boldsymbol{A}=\boldsymbol{V} \boldsymbol{\Lambda} \boldsymbol{V}^{-1} A⊤A=VΛV−1
\quad 其中 Λ \boldsymbol{\Lambda} Λ 为对角特征值矩阵, 不妨认为它们按照从大到小的顺序排列, 记作 λ 1 , … , λ n \lambda_{1}, \ldots, \lambda_{n} λ1,…,λn 。 V \boldsymbol{V} V 为正交 矩阵, 其列向量为每一维特征值对应的特征向量, 记作 v 1 , … v n \boldsymbol{v}_{1}, \ldots \boldsymbol{v}_{n} v1,…vn , 它们构成了一组单位正交基。而 任意 x x x 总是可以被这组单位正交基线性表出的:
x = α 1 v 1 + … + α n v n \boldsymbol{x}=\alpha_{1} \boldsymbol{v}_{1}+\ldots+\alpha_{n} \boldsymbol{v}_{n} x=α1v1+…+αnvn
那么不难看出:
V − 1 x = V ⊤ x = [ α 1 , … , α n ] ⊤ \boldsymbol{V}^{-1} \boldsymbol{x}=\boldsymbol{V}^{\top} \boldsymbol{x}=\left[\alpha_{1}, \ldots, \alpha_{n}\right]^{\top} V−1x=V⊤x=[α1,…,αn]⊤
这里做一个简单的解释:其中 V − 1 \boldsymbol{V}^{-1} V−1可以表示为
V − 1 = [ v 1 v 2 ⋅ ⋅ v n ] \boldsymbol{V}^{-1}= \begin{bmatrix} v_1 \\ v_2 \\ \cdot \\ \cdot \\ v_n \end{bmatrix} V−1= v1v2⋅⋅vn
则 V − 1 x \boldsymbol{V}^{-1}x V−1x 为
V − 1 x = [ v 1 x v 2 x ⋅ ⋅ v n x ] = [ v 1 ( α 1 v 1 + … + α n v n ) v 2 ( α 1 v 1 + … + α n v n ) ⋅ ⋅ v n x ] = [ a 1 a 2 ⋅ ⋅ a n ] \boldsymbol{V}^{-1}x= \begin{bmatrix} v_1 x \\ v_2x \\ \cdot \\ \cdot \\ v_nx \end{bmatrix}= \begin{bmatrix} v_1 (\alpha_{1} \boldsymbol{v}_{1}+\ldots+\alpha_{n} \boldsymbol{v}_{n}) \\ v_2(\alpha_{1} \boldsymbol{v}_{1}+\ldots+\alpha_{n} \boldsymbol{v}_{n}) \\ \cdot \\ \cdot \\ v_nx \end{bmatrix} = \begin{bmatrix} a_1 \\ a_2 \\ \cdot \\ \cdot \\ a_n \end{bmatrix} V−1x= v1xv2x⋅⋅vnx = v1(α1v1+…+αnvn)v2(α1v1+…+αnvn)⋅⋅vnx = a1a2⋅⋅an
于是目标函数变为:
∥ A x ∥ 2 2 = ∑ k = 1 n λ k α k 2 \|\boldsymbol{A x}\|_{2}^{2}=\sum_{k=1}^{n} \lambda_{k} \alpha_{k}^{2} ∥Ax∥22=k=1∑nλkαk2
而 ∥ x ∥ = 1 \|\boldsymbol{x}\|=1 ∥x∥=1 意味着 α 1 2 + … + α k 2 = 1 \alpha_{1}^{2}+\ldots+\alpha_{k}^{2}=1 α12+…+αk2=1 , 而特征值部分的 λ k \lambda_{k} λk 又是降序排列的, 所以就取 α 1 = 0 , … , α n − 1 = 0 , α n = 1 \alpha_{1}= 0, \ldots, \alpha_{n-1}=0, \alpha_{n}=1 α1=0,…,αn−1=0,αn=1 , 即:
x ∗ = v n \boldsymbol{x}^{*}=\boldsymbol{v}_{n} x∗=vn
这里我们推断出了 a a a 的具体形式,也就是得到了 V ⊤ x V^{\top}x V⊤x 的具体形式为前面所有维度均为0,只有最后一个维度是 1 1 1,在已有的限制条件下如何能够得到当前的结果。我们有:
V ⊤ x = [ v 1 v 2 ⋅ ⋅ v n ] x = [ 0 0 ⋅ ⋅ 1 ] \boldsymbol{V}^{\top}x= \begin{bmatrix} v_1 \\ v_2 \\ \cdot \\ \cdot \\ v_n \end{bmatrix}x= \begin{bmatrix} 0 \\ 0 \\ \cdot \\ \cdot \\1 \end{bmatrix} V⊤x= v1v2⋅⋅vn x= 00⋅⋅1
则 x x x 可取 x = v n x=v_n x=vn:
V ⊤ x = [ v 1 v 2 ⋅ ⋅ v n ] v n = [ v 1 v n v 2 v n ⋅ ⋅ v n v n ] = [ 0 0 ⋅ ⋅ 1 ] \boldsymbol{V}^{\top}x= \begin{bmatrix} v_1 \\ v_2 \\ \cdot \\ \cdot \\ v_n \end{bmatrix}v_n= \begin{bmatrix} v_1v_n \\ v_2v_n \\ \cdot \\ \cdot \\ v_nv_n \end{bmatrix}= \begin{bmatrix} 0 \\ 0 \\ \cdot \\ \cdot \\1 \end{bmatrix} V⊤x= v1v2⋅⋅vn vn= v1vnv2vn⋅⋅vnvn = 00⋅⋅1
\quad 至此我们看到, 线性最小二乘的最优解即为最小特征值向量。而由于该问题想要解的是 A x = 0 A x= 0 Ax=0 问题, 所以也可以称为零空间解。注意这里的特征值分解是对 A ⊤ A \boldsymbol{A}^{\top} \boldsymbol{A} A⊤A 做的, 而不是直接对 A \boldsymbol{A} A 来 做 ( A \boldsymbol{A} A 也不能保证一定能对角化, 而 A ⊤ A \boldsymbol{A}^{\top} \boldsymbol{A} A⊤A 是实对称矩阵, 可以对角化)。
\quad 奇异值解法 上述问题也可以换一种角度来看, 使用奇异值分解 (Singular Value Decomposition, SVD) 来处理。由于任意矩阵都可以进行奇异值分解, 于是我们对 A \boldsymbol{A} A 进行 SVD, 可得:
A = U Σ V ⊤ \boldsymbol{A}=\boldsymbol{U} \boldsymbol{\Sigma} \boldsymbol{V}^{\top} A=UΣV⊤
\quad 其中 U , V \boldsymbol{U}, \boldsymbol{V} U,V 为正交矩阵, Σ \boldsymbol{\Sigma} Σ 为对角阵, 称为奇异值矩阵, 其对角线元系为 A \boldsymbol{A} A 的奇异值, 不妨它们 是由大到小排列的。我们可以把 SVD 的结果代回到线性最小二乘中, 由于 U \boldsymbol{U} U 为正交矩阵, 在计算 二范数时会被消掉。我们会发现它们和特征值法实际上是一致的:
x ⊤ A ⊤ A x = x ⊤ V Σ 2 V ⊤ x . \boldsymbol{x}^{\top} \boldsymbol{A}^{\top} \boldsymbol{A x}=\boldsymbol{x}^{\top} \boldsymbol{V} \boldsymbol{\Sigma}^{2} \boldsymbol{V}^{\top} \boldsymbol{x} . x⊤A⊤Ax=x⊤VΣ2V⊤x.
\quad 于是, 类似于特征值的解法, 我们取 x \boldsymbol{x} x 为 V \boldsymbol{V} V 的最后一列即可。总而言之, 如果我们对一组点进行平面拟合, 只需要把所有点的坐标排成 矩阵 A \boldsymbol{A} A , 然后求 A \boldsymbol{A} A 的最小奇异值对应的右奇异值向量, 或者求 A ⊤ A \boldsymbol{A}^{\top} \boldsymbol{A} A⊤A 的最小特征值对应的特征向量即可。
\quad 我们先看平面的拟合问题。给定一组由 n n n 个点组成的点云 X = { x 1 , … , x n } \boldsymbol{X}=\left\{\boldsymbol{x}_{1}, \ldots, \boldsymbol{x}_{n}\right\} X={x1,…,xn} , 其中每个点的 坐标取三维欧氏坐标 x k ∈ R 3 \boldsymbol{x}_{k} \in \mathbb{R}^{3} xk∈R3 。然后我们寻找一组平面参数 n , d \boldsymbol{n}, d n,d , 使得:
∀ k ∈ [ 1 , n ] , n ⊤ x k + d = 0 \forall k \in[1, n], \boldsymbol{n}^{\top} \boldsymbol{x}_{k}+d=0 ∀k∈[1,n],n⊤xk+d=0
\quad 其中 n ∈ R 3 \boldsymbol{n} \in \mathbb{R}^{3} n∈R3 为法向量, d ∈ R d \in \mathbb{R} d∈R 为截距。显然,上述问题有四维末知量, 而每个点提供了三个方程。当我们有多个点时,由于噪声影 响,上述方程大概率是无解的 (超定的)。因此, 我们往往会求最小二乘解 (Linear Least Square )。
使其误差最小化:
min n , d ∑ k = 1 n ∥ n ⊤ x k + d ∥ 2 2 . \min _{\boldsymbol{n}, d} \sum_{k=1}^{n}\left\|\boldsymbol{n}^{\top} \boldsymbol{x}_{k}+d\right\|_{2}^{2} . n,dmink=1∑n n⊤xk+d 22.
\quad 如果取齐次坐标, 还可以再化简一下该问题。一个三维空间点的齐次坐标是四维的, 但实际处理 当中只需在末尾加上 1 即可, 我们记作:
x ~ = [ x ⊤ , 1 ] ⊤ ∈ R 4 . \tilde{\boldsymbol{x}}=\left[\boldsymbol{x}^{\top}, 1\right]^{\top} \in \mathbb{R}^{4} . x~=[x⊤,1]⊤∈R4.
\quad 于是 n ~ = [ n ⊤ , d ] ⊤ ∈ R 4 \tilde{\boldsymbol{n}}=\left[\boldsymbol{n}^{\top}, d\right]^{\top} \in \mathbb{R}^{4} n~=[n⊤,d]⊤∈R4 也是一个齐次向量, 上述方程可以写为 :
min n ~ ∑ k = 1 n ∥ x ~ k ⊤ n ~ ∥ 2 2 . \min _{\tilde{n}} \sum_{k=1}^{n}\left\|\tilde{\boldsymbol{x}}_{k}^{\top} \tilde{\boldsymbol{n}}\right\|_{2}^{2} . n~mink=1∑n x~k⊤n~ 22.
\quad 下标 2 表示取二范数, 即欧氏空间的常规范数, 上标二表示取欧氏范数的平方和。上述问题是求 和形式的线性最小二乘, 我们还可以把它写成矩阵形式。将点云的所有点写在一个矩阵中, 记作:
X ~ = [ x ~ 1 , … , x ~ n ] \tilde{\boldsymbol{X}}=\left[\tilde{\boldsymbol{x}}_{1}, \ldots, \tilde{\boldsymbol{x}}_{n}\right] X~=[x~1,…,x~n]
\quad 那么该问题中的求和号也可以省略掉:
min n ~ ∥ X ~ ⊤ n ~ ∥ 2 2 \min _{\tilde{\boldsymbol{n}}}\left\|\tilde{\boldsymbol{X}}^{\top} \tilde{\boldsymbol{n}}\right\|_{2}^{2} n~min X~⊤n~ 22
\quad 这个问题即线性代数中的解方程问题: 给定任意一个矩阵 A \boldsymbol{A} A (注意不是方阵), 我们希望找一 个非零向量 x \boldsymbol{x} x , 使得 A x \boldsymbol{A x} Ax 能够最小化。当然, 如果 x \boldsymbol{x} x 取为零, 该乘积自然是零, 但是我们不想找这 种平凡的解, 所以要给 x \boldsymbol{x} x 加上约束 x ≠ 0 \boldsymbol{x} \neq 0 x=0 。同时, 如果 x \boldsymbol{x} x 乘上非零常数 k k k, 那么 A x \boldsymbol{A} \boldsymbol{x} Ax 也会被放大 k k k 倍, 平方之后就是 k 2 k^{2} k2 倍。所以我们不想讨论 x \boldsymbol{x} x 的长度, 只想知道它的方向, 于是又设定 ∥ x ∥ = 1 \|\boldsymbol{x}\|=1 ∥x∥=1 。
\quad 对于 A \boldsymbol{A} A, 我们就不施加什么约束了。在点云平面提取问题中, 上面的 A \boldsymbol{A} A 为一个 R n × 4 \mathbb{R}^{n \times 4} Rn×4 的矩阵, 而 x \boldsymbol{x} x 则为 R 4 \mathbb{R}^{4} R4 中的单位向量。我们可以问, 取什么样的 x \boldsymbol{x} x 时, A x \boldsymbol{A x} Ax 能达到最大值或者最小值。
\quad 这里的 A \boldsymbol{A} A 其实就是前面方程中的 X ~ \tilde{\boldsymbol{X}} X~,这里的 x \boldsymbol{x} x 其实就是前面的 n ~ \tilde{\boldsymbol{n}} n~。
\quad 直线拟合。我们仍然设点集为 X X X 由 n n n 个三维点组成。不过,我们可以用若干种不同的方式来描述一根直线,例如把直线视为两个平面的交线,或者使用直线上一点再加上直线方向矢量来描述直线。后者更直观一些。
\quad 设直线上的点 x x x 满足方程:
x = d t + p x=dt+p x=dt+p
\quad 其中 d , p ∈ R 3 , t ∈ R \boldsymbol{d}, \boldsymbol{p} \in \mathbb{R}^{3}, t \in \mathbb{R} d,p∈R3,t∈R。 d \boldsymbol{d} d 为直线的方向, 满足 ∥ d ∥ = 1 \|\boldsymbol{d}\|=1 ∥d∥=1 , p \boldsymbol{p} p 为直线 l l l 上某个点, t t t 为直线参数。
我们想求的是 d \boldsymbol{d} d 和 p p p , 共 6 个末知数。显然, 当给定的点集较大时, 这依然是一个超定方程, 需要 构造最小二乘问题进行求解。
对于任意一个不在 l l l 上的点 x k x_{k} xk , 我们可以利用勾股定理, 计算它离直线垂直距离的平方:
f k 2 = ∥ x k − p ∥ 2 − ∥ ( x k − p ) ⊤ d ∥ 2 , f_{k}^{2}=\left\|\boldsymbol{x}_{k}-\boldsymbol{p}\right\|^{2}-\left\|\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right)^{\top} \boldsymbol{d}\right\|^{2}, fk2=∥xk−p∥2− (xk−p)⊤d 2,
这里做个解释,这里假设直线外有一点 x k x_k xk,做该点到直线的垂线,同时假设直线上有一点 p p p,且该点不是刚刚直线外那一点的垂点 O O O,那么此时由直线上的点,垂点,直线外的点 x k x_k xk 三个点构成了一个直角三角形,求 ∣ ∣ x k O ∣ ∣ 2 ||x_kO||_2 ∣∣xkO∣∣2,那么根据勾股定理知道斜边 ∥ x k − p ∥ 2 \left\|\boldsymbol{x}_{k}-\boldsymbol{p}\right\|^{2} ∥xk−p∥2,也可算出斜边在直线上的投影 ∥ ( x k − p ) ⊤ d ∥ 2 \left\|\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right)^{\top} \boldsymbol{d}\right\|^{2} (xk−p)⊤d 2,即可得到点到直线的距离。
然后构造最小二乘问题, 求解 d \boldsymbol{d} d 和 p p p :
( d , p ) ∗ = arg min d , p ∑ k = 1 n f k 2 , s.t. ∥ d ∥ = 1. (\boldsymbol{d}, \boldsymbol{p})^{*}=\arg \min _{\boldsymbol{d}, \boldsymbol{p}} \sum_{k=1}^{n} f_{k}^{2}, \quad \text { s.t. }\|\boldsymbol{d}\|=1 . (d,p)∗=argd,pmink=1∑nfk2, s.t. ∥d∥=1.
由于每个点的误差项已经取了平方形式, 在此只需求和即可。
接下来我们分离 d \boldsymbol{d} d 部分和 p \boldsymbol{p} p 部分。先考虑 ∂ f k 2 ∂ p \frac{\partial f_{k}^{2}}{\partial \boldsymbol{p}} ∂p∂fk2 , 得到:
∂ f k 2 ∂ p = − 2 ( x k − p ) + 2 ( x k − p ) ⊤ d ⏟ 标量, = d ⊤ ( x k − p ) d , = ( − 2 ) ( I − d d ⊤ ) ( x k − p ) . \begin{array}{l} \frac{\partial f_{k}^{2}}{\partial \boldsymbol{p}}=-2\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right)+2 \underbrace{\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right)^{\top} \boldsymbol{d}}_{\text {标量, }=\boldsymbol{d}^{\top}\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right)} \boldsymbol{d}, \\ =(-2)\left(\boldsymbol{I}-\boldsymbol{d} \boldsymbol{d}^{\top}\right)\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right) \text {. } \\ \end{array} ∂p∂fk2=−2(xk−p)+2标量, =d⊤(xk−p) (xk−p)⊤dd,=(−2)(I−dd⊤)(xk−p).
于是整体的目标函数关于 p p p 导数为:
∂ ∑ k = 1 n f k 2 ∂ p = ∑ k = 1 n ( − 2 ) ( I − d ⊤ ) ( x k − p ) , = ( − 2 ) ( I − d d ⊤ ) ∑ k = 1 n ( x k − p ) . \begin{aligned} \frac{\partial \sum_{k=1}^{n} f_{k}^{2}}{\partial \boldsymbol{p}} & =\sum_{k=1}^{n}(-2)\left(\boldsymbol{I}-\boldsymbol{d}^{\top}\right)\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right), \\ & =(-2)\left(\boldsymbol{I}-\boldsymbol{d} \boldsymbol{d}^{\top}\right) \sum_{k=1}^{n}\left(\boldsymbol{x}_{k}-\boldsymbol{p}\right) . \end{aligned} ∂p∂∑k=1nfk2=k=1∑n(−2)(I−d⊤)(xk−p),=(−2)(I−dd⊤)k=1∑n(xk−p).
为了求最小二乘的极值, 令它等于零, 则得到:
p = 1 n ∑ k = 1 n x k , \boldsymbol{p}=\frac{1}{n} \sum_{k=1}^{n} \boldsymbol{x}_{k}, p=n1k=1∑nxk,
说明 p p p 应该取点云的中心。于是, 我们可以先确定 p p p , 然后再考虑 d ∘ d_{\circ} d∘ 此时 p p p 已经被求解出来, 不 妨记 y k = x k − p \boldsymbol{y}_{k}=\boldsymbol{x}_{k}-\boldsymbol{p} yk=xk−p , 视 y k \boldsymbol{y}_{k} yk 为已知量, 对误差项进行简化:
f k 2 = y k ⊤ y k − d ⊤ y k y k ⊤ d f_{k}^{2}=\boldsymbol{y}_{k}^{\top} \boldsymbol{y}_{k}-\boldsymbol{d}^{\top} \boldsymbol{y}_{k} \boldsymbol{y}_{k}^{\top} \boldsymbol{d} fk2=yk⊤yk−d⊤ykyk⊤d
不难看出第一个误差项并不含 d \boldsymbol{d} d , 如何取 d \boldsymbol{d} d 并不影响它, 可以舍去。而第二项求最小化相当 于去掉负号后, 求最大化:
d ∗ = arg max d ∑ k = 1 n d ⊤ y k y k ⊤ d = ∑ k = 1 n ∥ y k ⊤ d ∥ 2 2 \boldsymbol{d}^{*}=\arg \max _{\boldsymbol{d}} \sum_{k=1}^{n} \boldsymbol{d}^{\top} \boldsymbol{y}_{k} \boldsymbol{y}_{k}^{\top} \boldsymbol{d}=\sum_{k=1}^{n}\left\|\boldsymbol{y}_{k}^{\top} \boldsymbol{d}\right\|_{2}^{2} d∗=argdmaxk=1∑nd⊤ykyk⊤d=k=1∑n yk⊤d 22
如果记:
A = [ y 1 ⊤ ⋯ y n ⊤ ] , \boldsymbol{A}=\left[\begin{array}{c} \boldsymbol{y}_{1}^{\top} \\ \cdots \\ \boldsymbol{y}_{n}^{\top} \end{array}\right], A= y1⊤⋯yn⊤ ,
\quad 那么该问题变为:
d ∗ = arg max d ∥ A d ∥ 2 2 . \boldsymbol{d}^{*}=\arg \max _{\boldsymbol{d}}\|\boldsymbol{A} \boldsymbol{d}\|_{2}^{2} . d∗=argdmax∥Ad∥22.
\quad 这个问题与平面拟合很相似, 无非是把最小化变成了最大化。对于平面拟合, 我们求这个问题 的最小化; 对于直线拟合, 则求其最大值。按照前文的讨论, 取 d \boldsymbol{d} d 为最小特征值或者奇异值向量, 就得到该问题的最小化解;反之, 求取最大特征值向量时,就得到最大化解。于是该问题的解应该 取 d \boldsymbol{d} d 为 A \boldsymbol{A} A 的最大右奇异向量, 或者 A ⊤ A \boldsymbol{A}^{\top} \boldsymbol{A} A⊤A 的最大特征值对应的特征向量。