QR分解
QR分解将矩阵分解为正交矩阵与上三角矩阵的乘积,事实上,QR分解是格拉姆-施密特正交化的另一种表现形式。
对于任意一个 n 阶方阵A,QR分解成一个n阶正交矩阵Q与一个n阶上三角矩阵R的乘积。
A = QR
例如一个矩阵 A = [[0,1,1],[1,0,1],[1,1,0]],
其特征多项式为 |A-λI| = det[[-λ ,1,1],[1,-λ,1],[1,1,-λ]] = -(λ-2)(λ+1)^2, 可以解得特征值为2,-1,-1。
带入式子 (A-λI)x = 0,
解出:x1 = [1,1,1].T, x2 = [-1,1,0].T, x3 = [-1,-1,2].T
正交单位化后Q = [1/sqrt(3)**x1,**1/sqrt(2)x2,1/sqrt(6)x3],
使用python计算:
import numpy as np
A0 = np.array([[0,1,1],[1,0,1],[1,1,0]])
#QR分解
Q,R = np.linalg.qr(A0)
Q = array([[ 0. , 0.81649658, -0.57735027],
[-0.70710678, -0.40824829, -0.57735027],
[-0.70710678, 0.40824829, 0.57735027]])
R = array([[-1.41421356, -0.70710678, -0.70710678],
[ 0. , 1.22474487, 0.40824829],
[ 0. , 0. , -1.15470054]])
特征值分解
对于n阶矩阵A,如果它有n各线性无关的特征向量,则可以分解如下3个矩阵的乘积:
A = QʌQ^-1
∧为对角矩阵。
使用特征值分解,可以快速的解出矩阵A的特征值,
eigditgit,eigvector = np.linalg.eig(A0)
eigditgit = array([-1., 2., -1.])
eigvector = array([[-0.81649658, 0.57735027, 0.22645541],
[ 0.40824829, 0.57735027, -0.79259392],
[ 0.40824829, 0.57735027, 0.56613852]])
奇异值分解
特征值分解只适用于方阵,奇异值分解是对它的推广。其思路是对A * A.T和A.T * A进行特征值分解,对于一个m*n矩阵A有
A =U∑V
其中U为m阶正交矩阵,其列是矩阵A的左奇异向量,是A * A.T的特征向量,∑ = [ [∑n,0(m-n)*n] ]
∑n = diag(σ1…σn),σi是矩阵A的奇异值,是A * A.T的非负平方根。
V为n阶正交矩阵,其行是矩阵A的右奇异向量,是A.T * A的非负平方根。
使用python计算:
A = np.array([[-1,3],[3,1],[1,1]])
U,sig,V = np.linalg.svd(A)
得到U :
array([[ 4.08248290e-01, -8.94427191e-01, -1.82574186e-01],
[ 8.16496581e-01, 4.47213595e-01, -3.65148372e-01],
[ 4.08248290e-01, -9.43689571e-16, 9.12870929e-01]])
sig:array([3.46410162, 3.16227766])
V:array([[ 0.70710678, 0.70710678],
[ 0.70710678, -0.70710678]])
特征值分解进行比较
B = np.dot(A,A.T)
np.linalg.eig(B)
可以得到:
(array([ 0., 10., 12.]),
array([[ 1.82574186e-01, -8.94427191e-01, -4.08248290e-01],
[ 3.65148372e-01, 4.47213595e-01, -8.16496581e-01],
[-9.12870929e-01, 9.27403771e-16, -4.08248290e-01]]))
特征值为0,10,12,那么非负平方根即为sqrt(10),sqrt(12).
对于对称矩阵,例如开头给出的矩阵A = [[0,1,1],[1,0,1],[1,1,0]],
进行奇异值分解,
np.linalg.svd(A)
结果为:
(array([[-5.77350269e-01, 2.77555756e-16, 8.16496581e-01],
[-5.77350269e-01, -7.07106781e-01, -4.08248290e-01],
[-5.77350269e-01, 7.07106781e-01, -4.08248290e-01]]),
array([2., 1., 1.]),
array([[-0.57735027, -0.57735027, -0.57735027],
[-0. , 0.70710678, -0.70710678],
[-0.81649658, 0.40824829, 0.40824829]]))
可以看到对称矩阵A的奇异值即是特征值的绝对值。