这里,我们讨论的是 n 阶的方阵A
从向量的定义可知,它是方向和长度的结合体。当一个线性变换 A 作用在 n 维线性空间V中的某一非零向量 x 上时,便是对该向量的长度和方向进行变化。然而,存在一些向量,线性变换A并没有改变其方向,而只是改变了长度,这种向量,叫做线性变换 A 的特征向量,它在变换中被改变的倍数,叫做它的特征值。用数学公式表示这一概念,即:
对应于同一个线性变换 A ,可以有多个特征向量(方向不同),但是有多个特征向量可以对应同一个特征值。 一个向量是一个方向,两个不同方向的向量就可以张成一个空间。在相同特征值的特征向量张成的空间内,任何一个向量在变换A下,都有相同的放大倍数 λ 。
公式(2)的左侧,总可以展成如下形式的多项式:
所以求特征值就是求下面方程的解:
关于特征值和特征向量的理解,参考资料3写的也很好,知乎上有很多大神的回答直击要害,对问题的理解很有帮助。
参考资料4中,认为矩阵的变换有三个作用:旋转,拉伸和投影。
当 A 是一个n×n方阵时,只涉及到旋转,拉伸。如果矩阵在实数域内可以得到 n 个特征值(重特征值按重数计算个数),那么利用其对应的特征向量(单位化后)组成矩阵正交Q可以使得:
按照定义,正交矩阵是 QQT=E ,它的行列式为1或者-1。
了解正交矩阵的性质,在很多计算方面,能够更深入了解所进行的运算的意义。
我们这里说的都是有限维欧式空间内的正交矩阵
假设 n 维欧式空间Rn中,一个正交变换 Q 存在一个一一对应的正交矩阵 Q 。所以研究正交变换的性质,可以转为研究正交矩阵。
根据正交矩阵行列式的值,将其分为两类:|Q|=1,为第一类; |Q|=−1 ,为第二类。
第一类正交矩阵,当其左乘一个向量时,几何意义是使该量在 Oxyz 坐标系下旋转;
第一类正交矩阵,当其左乘一个向量时,几何意义是使该向量沿 Oxyz 某一轴(点)进行反射;[5]
无论是哪一类正交矩阵,其左乘向量,均不会改变向量的长度,即 |Qv|=|Q|⋅|v|=|v| 。
所以上面将矩阵 A 拆成A=QΛQ−1的形式后,由于 Q 是正交矩阵,它作用在向量v上,只是对其进行旋转或者反射,而对向量长度有影响的是矩阵 Λ 。其上的元素由矩阵 A 的特征值组成。
需要注意的是,只有当矩阵A能够在实数域内有n个特征值(重数也计入)的情况下,可以如此分解。但是,对更多的一般性矩阵 A ,在实数域内没有n个实特征根,或者是更一般的 m×n 维矩阵,此时,我们用SVD分解的方法进行研究。
假设有两个变量 X 和Y,他们的取值为 X={x1,x2,⋯,xn} , Y={y1,y2,⋯,yn} ,他们的平均值(期望)记为是 E(X)=X¯=1n∑xi , E(Y)=Y¯=1n∑yi 。 X 和Y的协方差就是研究两个变量之间的相关关系。比如当一个的取值不断增大时,另一个变量的取值如何变化,知乎上的一篇文章( 如何通俗易懂地解释「协方差」与「相关系数」的概念?)讲的很好。
与 n×n 阶矩阵按特征值分解相似,任一 m×n 阶矩阵 A 也可以写成类似的形式:
利用如下公式可以计算出各矩阵:
当矩阵A=UΣVT左乘一个向量 v 时,只有Σ对向量的长度进行了拉伸(收缩),而矩阵 U 、V都只是对其进行旋转或反射。当作用在图像上时,也只有 Σ 对图像进行了各个方向上的伸缩改变。
用奇异值的方法,将这幅图像进行分解,得形如 A=UΣVT 格式的矩阵。其中 Σ 是由矩阵奇异值由大到小排列组成的对角矩阵。
我们分别保留前10,30,100,300个奇异值,其余奇异值设为0,比较图像的变化:
奇异值保留前10
奇异值保留前30
奇异值保留前100
奇异值保留前300。
import cv2
import numpy as np
from numpy import linalg as la # 用到别名
from scipy.misc import imsave
import scipy
im = cv2.imread('lena512.bmp')
print(im.shape)
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
U, Sigma, VT = la.svd(gray)
print('矩阵U的形状:', U.shape, ' 矩阵Sigma的形状:',
Sigma.shape, ' 矩阵VT的形状:', VT.shape)
se = np.eye(512, dtype=np.float64)
n = 512
i = 0
k = 30 # 保留特征值数目
# 改变特征值
while i < n:
if i > k - 1:
Sigma[i] = 0
se[i, i] = Sigma[i]
i += 1
svt = np.dot(se, VT)
usvt = np.dot(U, svt)
imsave('USVT_Sigma=30m.bmp', usvt)