[h1]SVD[/h1]将一个矩阵分解为U,V(U,V均为列正交矩阵,即列向量直接内积为0)
中间的矩阵为对角阵,元素为奇异值。
[h2]SVD计算方式[/h2]
- 由于其为列正交向量,所以矩阵在非对角位置都为0, 因此当V的列向量是单位向量时,对角位为1,则为单位阵。
因此,U为
特征向量构成的矩阵,然后
的对角元为特征值。
同理,可知
对应于V的计算。
[h1]Python实现[/h1]- A = np.linspace(0, 14, 15).reshape((3, -1))A
复制代码- array([[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.]])
复制代码- def SVD(A, n): M = np.dot(A, A.T) eigval, eigvec = np.linalg.eig(M) indexes = np.argsort(-eigval)[:n] U = eigvec[:, indexes] sigma_sq = eigval[indexes] M = np.dot(A.T, A) eigval, eigvec = np.linalg.eig(M) indexes = np.argsort(-eigval)[:n] V = eigvec[:, indexes] sigma = np.diag(np.sqrt(sigma_sq))# print(sigma) return np.dot(np.dot(U, sigma), V.T)
复制代码- array([[2.01625019e-16, 1.00000000e+00, 2.00000000e+00, 3.00000000e+00, 4.00000000e+00], [5.00000000e+00, 6.00000000e+00, 7.00000000e+00, 8.00000000e+00, 9.00000000e+00], [1.00000000e+01, 1.10000000e+01, 1.20000000e+01, 1.30000000e+01, 1.40000000e+01]])
复制代码 非常近了,然后量化判断下,用二范数来测量下:
ps:笔者最近上线了自己的GitHub账号,大家有感兴趣的项目可以一起参与其中哦!点击阅读原文可跳转至我的github网站。
排版|Shane
作者|Sean
审稿|Vinson
长按识别二维码
喜欢的可以点
右下角的好看哦
[h1][/h1]
|
|