Julia 矩阵QR分解和特征值
前言
在上一篇的PCA中使用了LinearAlgebra中封装的函数求取的特征值和特征向量。在此学习一下特征值的数值求解算法,主要参考[1]。矩阵特征值的数值求解方法中,一般有求部分特征值和特征向量的幂法和反幂法,以及求取全部特征值的QR分解方法。在此关注QR分解方法。注意内容较长,总体思路和方法来自参考文献[1]。
-
QR分解,是把矩阵分解为正交矩阵和三角矩阵的乘积,其中关键点在于正交矩阵的求法。
-
正交矩阵的求解可以使用施密特正交化进行实现,需要理解施密特正交化的原理和思路。
最后回溯:由施密特正交化->>QR分解->>矩阵特征值->>特征向量矩阵 。
1. 施密特正交
施密特方法是对一组向量进行正交化。给定一组输入的m维向量,目的找出正交坐标系统,获取由这些向量张成的空间。
给定n个线性无关的向量,找到n个彼此垂直的单位向量。
(1) 利用施密特正交求出正交矩阵Q
假设存在 n n n个线性无关的 m m m维向量
A 1 , A 2 , ⋯ , A n A_{1},A_{2},\cdots,A_{n} A1,A2,⋯,An
- 第 1 1 1步:选定初始向量,归一化。
y 1 = A 1 y_{1}=A_{1} y1=A1
p 1 = y 1 ∣ ∣ y 1 ∣ ∣ 2 p_{1}=\dfrac{y_{1}}{||y_{1}||_{2}} p1=∣∣y1∣∣2y1
- 第 2 2 2步:下一个向量例如 A 2 A_{2} A2,减去该向量在所有已知的正交向量集 ( p 1 , p i , ⋯ ) (p_{1},p_{i},\cdots) (p1,pi,⋯)上的投影分量,再进行归一化得到当前的正交向量。
投影分量如何计算?利用向量的内积 c o s ( θ ) = < a , b > ∣ ∣ a ∣ ∣ 2 ∣ ∣ b ∣ ∣ 2 cos(\theta)=\dfrac{<a,b>}{||a||_{2}||b||_{2}} cos(θ)=∣∣a∣∣2∣∣b∣∣2<a,b>,此处符号 < a , b > <a,b> <a,b>为向量内积。
由于正交向量 p i p_{i} pi的模长,也即是2范数为1,此时 A j A_{j} Aj在向量 p i p_{i} pi上的投影系数为 < A j , p i > ∣ ∣ A j ∣ ∣ 2 \dfrac{<A_{j},p_{i}>}{||A_{j}||_{2}} ∣∣Aj∣∣2<Aj,pi>,也即是 p i T A j p_{i}^{T}A_{j} piTAj,注意此为一个数值标量。进一步可得到, A j A_{j} Aj在向量 p i p_{i} pi上的投影分量为 p i ( p i T A j ) p_{i}(p_{i}^{T}A_{j}) pi(piTAj)。
y 2 = A 2 − p 1 ( p 1 T A 2 ) y_{2}=A_{2}-p_{1}(p_{1}^{T}A_{2}) y2=A2−p1(p1TA2)
p 2 = y 2 ∣ ∣ y 2 ∣ ∣ 2 p_{2}=\dfrac{y_{2}}{||y_{2}||_{2}} p2=∣∣y2∣∣2y2
- 以此类推,第 k k k步,
y k = A k − p 1 ( p 1 T A k ) − ⋯ − p k − 1 ( p k − 1 T A k ) y_{k}=A_{k}-p_{1}(p_{1}^{T}A_{k})-\cdots -p_{k-1}(p_{k-1}^{T}A_{k}) yk=Ak−p1(p1TAk)−⋯−pk−1(pk−1TAk)
p k = y k ∣ ∣ y k ∣ ∣ k p_{k}=\dfrac{y_{k}}{||y_{k}||_{k}} pk=∣∣yk∣∣kyk
- 最终得出正交矩阵为 Q = ( p 1 , p i , ⋯ , p n ) Q=(p_{1},p_{i},\cdots,p_{n}) Q=(p1,pi,⋯,pn),注意此时的维度为 m ∗ n m*n m∗n,即 m m m行 n n n列。
(2) 求出上三角矩阵R
由以上求正交矩阵的过程,反推:
A 1 = p 1 ∗ ∣ ∣ y 1 ∣ ∣ 2 A_{1}=p_{1}*||y_{1}||_{2} A1=p1∗∣∣y1∣∣2
A 2 = p 2 ∗ ∣ ∣ y 2 ∣ ∣ 2 + p 1 ∗ ( p 1 T A 2 ) A_{2}=p_{2}*||y_{2}||_{2}+p_{1}*(p_{1}^{T}A_{2}) A2=p2∗∣∣y2∣∣2+p1∗(p1TA2)
A k = p k ∗ ∣ ∣ y k ∣ ∣ 2 + p 1 ∗ ( p 1 T A k ) + ⋯ + p k − 1 ∗ ( p k − 1 T A k ) A_{k}=p_{k}*||y_{k}||_{2}+p_{1}*(p_{1}^{T}A_{k})+\cdots+p_{k-1}*(p_{k-1}^{T}A_{k}) Ak=pk∗∣∣yk</