如何使用numpython更改SVD的顺序

2024-04-27 05:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用奇异值分解(SVD)进行图像的主成分分析(PCA)。在

我有17张20 X 20的照片 所以我创建了图像矩阵

M =  dim(400 X 17)

当我应用SVD(M=u@d@v)时,它给了我

^{pr2}$

但是我想找到u = dim(400 X 400)和{}和{},因为有400个特征向量和400个特征值。在

我甚至试过换位,但没有成功

我知道问题的标题可能不太清楚,所以请随意更改,下面是一些与数据相关的信息

  1. 我通过减去平均面来集中数据

  2. 我试图通过寻找协方差矩阵(MM')的特征向量来解决问题,但当我试图显示PCA1时,它只显示一个黑色图像

请帮帮我


Tags: 数据图像信息标题矩阵照片mmsvd
1条回答
网友
1楼 · 发布于 2024-04-27 05:18:33

矩形矩阵的特征值没有定义,但奇异值是相关的。对于特征向量,您总是有一组跨越列和行空间的左右特征向量。在

SVDMM'和{}的特征值分解有关

  • M'M = V (S'S) V'
  • MM' = U (SS') U'

现在

  • V的列是M'M的特征向量,在您的例子中它的大小是(17 x 17)。因此V是{}
  • U的列是MM'的特征向量,在您的例子中它的大小是(400 x 400)。因此U是{}

现在S的大小是多少?S(奇异值)的非零元素是M'M和{}的非零特征值的平方根。因此,在第二个例子中,这两个非cdw}集可以是M = USV'这一事实相一致?我们用17个非零特征值的平方根建立一个rectangular diagonal matrix(400 x 17)。在

您可以从scipy使用SVD:

import scipy

u, s, vh = scipy.linalg.svd(M, full_matrices=True)
print(u.shape, s.shape, vh.shape)

这给了我

^{pr2}$

要使您的S(400 x 17)

s = np.concatenate([np.diag(s), np.zeros((400-17, 17))], axis=0)

检查SVD的正确性:

res = u@s@vh
np.allclose(res, a)

True

低秩矩阵逼近

有时你想用一个低秩M_tilde近似你的矩阵M,在这种情况下,如果你想最小化这两者之间的Frobenius范数,你只需保持r最大的奇异值(Eckhart-Young定理)。 U, S, V的大小变成:(400 x r), (r x r), (r x 17),其中S是对角线。在

我不知道您使用的是哪个函数,但实际情况是这样的:零单数值被丢弃,因为(m x n)矩阵最多可以有min(m, n)(在您的例子中是17)。在

相关问题 更多 >