矩阵的奇异值分解(Singular Value Decomposition,SVD)是数值计算中的精彩之处,在其它数学领域和机器学习领域得到了广泛的应用,如矩阵的广义逆,主分成分析(PCA),自然语言处理(NLP)中的潜在语义索引(Latent Semantic Indexing),推荐算法等。
鉴于实际应用,本次分享中的数域为实数域,即我们只在实数范围内讨论。我们假定读者具有大学线性代数的水平。那么,矩阵的奇异值分解定理如下:
(定理)(奇异值分解定理)任意一个
其中P是
证明:矩阵
所以
假设
于是
用
当
其中
我们选择额外的向量
这是因为
证毕。
在上面证明中,我们称实数
在Python中的Numpy模块中,已经实现了矩阵的奇异值分解。以下为示例的应用代码:
import numpy as np
#generate a random 3*4 matrix
A = np.random.randint(5, size=(3, 4))
#parameter full_matrices: control the size of P and Q
#d returns as numpy.ndarray, not matrix
P,d,Q = np.linalg.svd(A, full_matrices=True)
print('A:',A)
print('P:',P)
#D return as diagonal 3*4 matrix
D = np.zeros(12).reshape(3,4)
for i in range(len(d)):
D[i][i] = d[i]
print('D:',D)
print('Q:',Q)
#check if P*D*Q == A
print('P*D*Q:',np.dot(P,np.dot(D,Q)))
输入结果如下:
至于如何用原始算法来实现矩阵的SVD,也是需要考虑的,有机会的话,可以交流哦~~
本次分享到此结束,欢迎大家批评与交流~~
参考文献:
- SVD 维基百科:https://en.wikipedia.org/wiki/SVD
- 数值分析 机械工业出版社 作者:萨奥尔(Timothy Sauer) 译者:裴玉茹
numpy的svd实现函数: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.svd.html - 奇异值分解(SVD)原理与在降维中的应用:https://www.cnblogs.com/pinard/p/6251584.html
- 奇异值分解SVD应用——LSI:http://blog.csdn.net/abcjennifer/article/details/8131087
论文:CALCULATING THE SINGULAR VALUES AND PSEUDO-INVERSE OF A MATRIX, G. GOLUB AND W. KAHAN, J. SIAM llrM,B. AfeArd.Ser. B, Vol. 2, No. 2, 1965