奇异值与奇异向量
定义
特征值分解是求解方阵的特征,对于非方阵而言可以通过奇异值分解描述矩阵的特征。
对于矩阵A为m*n的矩阵,可以分解成如下形式:
A是一个m*n的矩阵,那么得到的U是一个m * m的方阵(里面的向量是正交的,称为左奇异向量),Σ是一个m * n的矩阵(除了对角线的元素外,其它都是0,对角线上的元素称为奇异值),VT是一个n * n的矩阵(里面的向量也是正交的,称为右奇异向量)。
右奇异向量求解
矩阵A左乘转置AT,将会得到一个方阵(n*n),通过该方阵求特征值和特征向量,该特征向量即A的右奇异向量。
上面的Vi构成的矩阵即A的右奇异矩阵。
右奇异向量和奇异值的求解
根据上面得到的特征值λ,计算奇异值σ,以及左奇异向量u:
python代码实现
m = 4
n = 3
A = np.random.randint(-10,10,(m, n)).astype(float)
# np.dot(A.T, A)的特征向量构成的矩阵为rvecs,需要注意的是rvecs的每个行向量为特征向量
lvecs, vals, rvecs = np.linalg.svd(A)
# 验证是否正确
# *表示只对固定位置的数相乘
np.allclose(A, np.dot(lvecs[:, :n] * vals, rvecs))
# 将s转化为奇异值矩阵
smat = np.zeros((m, n))
smat[:n, :n] = np.diag(vals)
np.allclose(A, np.dot(lvecs, np.dot(smat, rvecs)))