1. 特征值近似的背景
在科学计算和工程应用中,精确地计算出所有特征值往往既有难度 且没有必要 。例如,对于 n × n ~n\times n~ n × n 的矩阵 A ~\mathbf{A}~ A ,当 n > 5 ~n \gt 5~ n > 5 时,特征方程 det ( A − λ I ) = 0 ~\det(\mathbf{A} - \lambda\mathbf{I}) = 0~ det ( A − λ I ) = 0 没有通用的解析解 。再例如前面介绍过的动力系统,我们通常只需要确定最大的特征值(即主特征值)即可,而无需求解所有特征值。基于这些原因,获取主特征值的近似值往往已经足够满足需求。为了高效地估算最大特征值,下面介绍一种经典的迭代方法:幂法 (Power Method \textbf{Power Method} Power Method )。
2. 幂法:主特征值估算
如果一个矩阵 A ~\mathbf{A}~ A 反复对任意一个初始向量 x 0 ~\mathbf{x}_0~ x 0 做乘法,那么经过足够多的次数后,最终得到的向量 y k = A k x 0 ( k = 1 , 2 , 3 ⋯ ) \mathbf{y}_k = \mathbf{A}^k\mathbf{x}_0\,(\,k=1,2,3\cdots) y k = A k x 0 ( k = 1 , 2 , 3 ⋯ ) 的方向会无限趋近于主特征向量的方向。我们设计这样一个实验,取矩阵 A ~\mathbf{A}~ A 和初始向量 x 0 ~\mathbf{x}_0~ x 0 如下:
A = [ 1.8 0.8 0.2 1.2 ] , x 0 = [ − 0.5 1 ] \mathbf{A} = \begin{bmatrix}1.8 & 0.8 \\ 0.2 & 1.2\end{bmatrix},\quad \mathbf{x}_0 = \begin{bmatrix}-0.5 \\ 1\end{bmatrix} A = [ 1.8 0.2 0.8 1.2 ] , x 0 = [ − 0.5 1 ]
矩阵 A ~\mathbf{A}~ A 的特征值 λ 1 = 2 ~\lambda_1=2~ λ 1 = 2 (主特征值)、 λ 2 = 1 ~\lambda_2=1~~ λ 2 = 1 ,对应的特征向量为 v 1 = [ 4 1 ] T , v 2 = [ − 1 1 ] T \mathbf{v}_1 = \begin{bmatrix}4 & 1\end{bmatrix}^T,\,\mathbf{v}_2=\begin{bmatrix}-1 & 1\end{bmatrix}^T v 1 = [ 4 1 ] T , v 2 = [ − 1 1 ] T 。下面绘制出每次迭代后向量的方向,请观察这个过程:
随着迭代次数的增加,新的向量 y k \mathbf{y}_k y k 与主特征向量 v 1 ~\mathbf{v}_1~ v 1 之间的夹角 θ ~\theta~ θ 开始趋近于 0 ~0~ 0 。我们在迭代到第 10 ~10~ 10 次后停止,此时向量 y 10 = [ 408.7 103.3 ] T ~\mathbf{y}_{10} = \begin{bmatrix}408.7 & 103.3\end{bmatrix}^T~ y 10 = [ 408.7 103.3 ] T ,可近似为特征向量。特征值可以通过向量 y 10 ~\mathbf{y}_{10}~ y 10 和 y 9 ~\mathbf{y}_9~ y 9 中最大分量 的比值来近似:
λ k = ( y 10 ) 1 ( y 9 ) 1 = 408.7 203.9 ≈ λ 1 = 2 \lambda_k = \frac{(\mathbf{y}_{10})_{1}}{(\mathbf{y}_{9})_{1}} = \frac{408.7}{203.9} \approx \lambda_1 = 2 λ k = ( y 9 ) 1 ( y 10 ) 1 = 203.9 408.7 ≈ λ 1 = 2
幂法正是基于这一现象,用于估算矩阵 A ~\mathbf{A}~ A 的主特征值 λ 1 ~\lambda_1~ λ 1 及其对应的特征向量 v 1 ~\mathbf{v}_1~ v 1 。其基本思想是:从一个初始向量 x 0 ~\mathbf{x}_0~ x 0 出发,不断地对其进行矩阵幂乘操作 A k x 0 ~\mathbf{A}^k\mathbf{x}_0~ A k x 0 ,利用主特征值的绝对值显著大于其他特征值的特性,使向量逐步沿着主导特征向量的方向收敛。
3. 幂法的数学基础
假设 A ~\mathbf{A}~ A 是一个 n × n ~n\times n~ n × n 矩阵,其特征分解为:
A = V Λ V − 1 \mathbf{A} = \mathbf{V} \Lambda \mathbf{V}^{-1} A = V Λ V − 1
其中 V \mathbf{V} V 是特征向量矩阵, Λ \Lambda Λ 是包含特征值 λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \dots, \lambda_n λ 1 , λ 2 , … , λ n 的对角矩阵,并满足 ∣ λ 1 ∣ > ∣ λ 2 ∣ ≥ ⋯ ≥ ∣ λ n ∣ |\lambda_1| > |\lambda_2| \geq \cdots \geq |\lambda_n| ∣ λ 1 ∣ > ∣ λ 2 ∣ ≥ ⋯ ≥ ∣ λ n ∣ 。对于一个初始向量 x 0 ~\mathbf{x}_0~ x 0 ,可以表示为特征向量的线性组合:
x 0 = c 1 v 1 + c 2 v 2 + ⋯ + c n v n \mathbf{x}_0 = c_1 \mathbf{v}_1 + c_2 \mathbf{v}_2 + \cdots + c_n \mathbf{v}_n x 0 = c 1 v 1 + c 2 v 2 + ⋯ + c n v n
对 x 0 ~\mathbf{x}_0~ x 0 反复施加矩阵 A ~\mathbf{A}~ A 后:
A k x 0 = c 1 λ 1 k v 1 + c 2 λ 2 k v 2 + ⋯ + c n λ n k v n \mathbf{A}^k \mathbf{x}_0 = c_1 \lambda_1^k \mathbf{v}_1 + c_2 \lambda_2^k \mathbf{v}_2 + \cdots + c_n \lambda_n^k \mathbf{v}_n A k x 0 = c 1 λ 1 k v 1 + c 2 λ 2 k v 2 + ⋯ + c n λ n k v n
由于 ∣ λ 1 ∣ ≫ ∣ λ 2 ∣ , ∣ λ 3 ∣ , … |\lambda_1| \gg |\lambda_2|, |\lambda_3|, \dots ∣ λ 1 ∣ ≫ ∣ λ 2 ∣ , ∣ λ 3 ∣ , … ,当 k → ∞ ~k \to \infty~ k → ∞ 时:
A k x 0 ≈ c 1 λ 1 k v 1 \mathbf{A}^k \mathbf{x}_0 \approx c_1 \lambda_1^k \mathbf{v}_1 A k x 0 ≈ c 1 λ 1 k v 1
即, A k x 0 ~\mathbf{A}^k \mathbf{x}_0~ A k x 0 的方向趋于主导特征向量 v 1 ~\mathbf{v}_1~ v 1 ,而其模长以 ∣ λ 1 ∣ k |\lambda_1|^k ∣ λ 1 ∣ k 的速率增长。
4. 算法步骤
在前面的示例中,第 10 ~10~ 10 次迭代停止后,向量的最大分量 ( y 10 ) 1 = 408.7 ~(\mathbf{y}_{10})_1 = 408.7~ ( y 10 ) 1 = 408.7 和 ( y 9 ) 1 = 203.9 ~(\mathbf{y}_9)_1=203.9~ ( y 9 ) 1 = 203.9 已经很大了,如果我们再继续迭代下去,向量的分量值就会迅速膨胀、甚至溢出 。下表展示了未归一化时向量分量随迭代次数的变化:
其实,我们只需要关心相邻两个向量之间的比值就可以近似得到主特征值 λ ~\lambda~ λ 以及主特征向量 v ~\mathbf{v}~ v 。所以,幂法在每次迭代得到新的向量 y k ~\mathbf{y}_k~ y k 后,会通过对新向量 y k ~\mathbf{y}_k~ y k 进行归一化处理来防止数值溢出。具体步骤如下:
我们这次用幂法的步骤重新迭代计算 A ~\mathbf{A}~ A 的主特征值,初始条件以及终止条件 如下:
A = [ 1.8 0.8 0.2 1.2 ] , x 0 = [ − 0.5 1 ] , ϵ = 10 − 3 \mathbf{A}=\begin{bmatrix}1.8 & 0.8 \\ 0.2 & 1.2\end{bmatrix},\quad\mathbf{x}_0=\begin{bmatrix}-0.5\\ 1\end{bmatrix},\quad \epsilon=10^{-3} A = [ 1.8 0.2 0.8 1.2 ] , x 0 = [ − 0.5 1 ] , ϵ = 1 0 − 3
借助 python ~\text{python}~ python 代码,可得幂法迭代的结果如下:
主特征值收敛于 2 ~2~ 2 ,主特征向量收敛于 [ 1 0.25 ] T \begin{bmatrix}1 & 0.25\end{bmatrix}^T [ 1 0.25 ] T ,其渐进轨迹如下:
5. 幂法的收敛性
幂法的收敛速度决定了算法的运算效率,而收敛速度主要和下面三个因素有关:
6. 反幂法:任意特征值估算
反幂法 ( Inverse Power Method ) ~(\textbf{Inverse Power Method})~ ( Inverse Power Method ) 最典型的应用场景是当我们需要计算矩阵的某个特定特征值,并且已经有一个接近该特征值的初始估计 α ~\alpha~ α 。反幂法是基于幂法的思想,通过构造特定的矩阵 B ~\mathbf{B}~ B 来实现对任意特征值的逼近。下面做一个简单推导,假设矩阵 A ~\mathbf{A}~ A 的特征值为 λ 1 , λ 2 , ⋯ , λ n ~\lambda_1,\lambda_2,\cdots,\lambda_n~ λ 1 , λ 2 , ⋯ , λ n ,那么就有如下结论:
A ∼ [ λ 1 0 ⋯ 0 0 λ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ λ n ] , A − α I ∼ [ λ 1 − α 0 ⋯ 0 0 λ 2 − α ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ λ n − α ] \mathbf{A} \sim \begin{bmatrix}
\lambda_1 & 0 & \cdots & 0 \\
0 & \lambda_2 & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \lambda_n
\end{bmatrix},\quad \mathbf{A} - \alpha \mathbf{I} \sim \begin{bmatrix}
\lambda_1 - \alpha & 0 & \cdots & 0 \\
0 & \lambda_2 - \alpha & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \lambda_n - \alpha
\end{bmatrix} A ∼ λ 1 0 ⋮ 0 0 λ 2 ⋮ 0 ⋯ ⋯ ⋱ ⋯ 0 0 ⋮ λ n , A − α I ∼ λ 1 − α 0 ⋮ 0 0 λ 2 − α ⋮ 0 ⋯ ⋯ ⋱ ⋯ 0 0 ⋮ λ n − α
我们构造矩阵 B = A − α I ~\mathbf{B}=\mathbf{A} - \alpha\mathbf{I}~ B = A − α I ,那么 B ~\mathbf{B}~ B 的特征值就是 λ 1 − α , λ 2 − α , ⋯ , λ n − α ~\lambda_1-\alpha,~\lambda_2-\alpha,~\cdots,~\lambda_n-\alpha~ λ 1 − α , λ 2 − α , ⋯ , λ n − α 。因此, B − 1 = ( A − λ I ) − 1 ~\mathbf{B}^{-1}=(\mathbf{A} - \lambda\mathbf{I})^{-1}~ B − 1 = ( A − λ I ) − 1 的特征值如下:
λ 1 ′ = 1 λ 1 − α , λ 2 ′ = 1 λ 2 − α , ⋯ , λ n ′ = 1 λ n − α \lambda_1' = \frac{1}{\lambda_1-\alpha},\quad \lambda_2' = \frac{1}{\lambda_2-\alpha},\quad \cdots, \quad \lambda_n' = \frac{1}{\lambda_n-\alpha} λ 1 ′ = λ 1 − α 1 , λ 2 ′ = λ 2 − α 1 , ⋯ , λ n ′ = λ n − α 1
如果 α ~\alpha~ α 接近某个特征值 λ i ~\lambda_i~ λ i ,则 ( λ i − α ) − 1 ~(\lambda_i-\alpha)^{-1}~ ( λ i − α ) − 1 会成为矩阵 B − 1 ~\mathbf{B}^{-1}~ B − 1 的主特征值。这样,问题就被转化为了用幂法来近似计算 B − 1 ~\mathbf{B}^{-1}~ B − 1 的主特征值。接下来就是选择一个初始向量 x 0 ~\mathbf{x}_0~ x 0 ,然后开始迭代计算过程:
y k = ( A − α I ) − 1 x k , ( k = 0 , 1 , 2 , ⋯ ) \mathbf{y}_k = (\mathbf{A} - \alpha\mathbf{I})^{-1}\mathbf{x}_k\,,\quad (k = 0, 1, 2,\cdots) y k = ( A − α I ) − 1 x k , ( k = 0 , 1 , 2 , ⋯ )
要注意的是,在实际计算中并不会直接计算出逆矩阵 ( A − α I ) − 1 ~(\mathbf{A} - \alpha \mathbf{I})^{-1}~ ( A − α I ) − 1 后再和 x k ~\mathbf{x}_k~ x k 相乘计算 y k ~\mathbf{y}_k~ y k ,而是通过解线性方程组的方式来计算 y k ~\mathbf{y}_k~ y k :
( A − α I ) y k = x k (\mathbf{A} - \alpha \mathbf{I})\,\mathbf{y}_k = \mathbf{x}_k ( A − α I ) y k = x k
后面迭代的步骤和幂法步骤完全一样,不过每次得到估计 λ k ′ ~\lambda_k'~ λ k ′ 后,需要转化为原特征值的估计:
λ k = α + 1 λ k ′ \lambda_k = \alpha + \frac{1}{\lambda_k'} λ k = α + λ k ′ 1
下面我们通过一个具体示例来演示反幂法的具体步骤。
7. 反幂法实例分析
给定矩阵 A ~\mathbf{A}~ A ,初始估计 α ~\alpha~ α ,初始向量 x 0 ~\mathbf{x}_0~ x 0 如下:
A = [ 10 − 8 − 4 − 8 13 4 − 4 5 4 ] , α = 1.9 , x 0 = [ 1 1 1 ] \mathbf{A}=\begin{bmatrix}
10 & -8 & -4 \\
-8 & 13 & 4 \\
-4 & 5 & 4
\end{bmatrix},\quad \alpha = 1.9\, ,\quad \mathbf{x}_0 = \begin{bmatrix}1 \\ 1 \\ 1\end{bmatrix} A = 10 − 8 − 4 − 8 13 5 − 4 4 4 , α = 1.9 , x 0 = 1 1 1
迭代结束条件设置为相邻两个特征估计值的相对变化量 ϵ < 10 − 6 ~\epsilon < 10^{-6}~ ϵ < 1 0 − 6 。下面是 1 ~1~ 1 次迭代过程:
重复上面的过程,直到满足结束条件,由于初始预估值 α ~\alpha~ α 和实际特征值很接近,所以算法收敛速度很快。下面是迭代的结果: