gpt4 book ai didi

python - 如何使用 numpy python 更改 SVD 的顺序

转载 作者:太空宇宙 更新时间:2023-11-03 15:41:43 25 4
gpt4 key购买 nike

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

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

M =  dim(400 X 17)

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

u = dim(400 X 17)
d = dim(17 X 17)
v = dim(17 X 17)

但我想找到 u = dim(400 X 400)d =(400 X 400)v =(400 X 17) 因为会有 400 个特征向量和 400 个特征值。

我什至尝试过转置但没有成功

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

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

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

请帮帮我

最佳答案

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

SVDMM'M'M

的特征值分解有关
  • M'M = V (S'S) V'
  • MM' = U (SS') U'

现在

  • V 的列是 M'M 的特征向量,在您的情况下其大小为 (17 x 17)。因此 V(17 x 17)
  • U 的列是 MM' 的特征向量,在您的情况下其大小为 (400 x 400)。因此 U(400 x 400)

现在 S 的大小是多少? S 的非零元素(奇异值)是 M'MMM' 的非零特征值的平方根。可以看出这两个具有相同的非零特征值集,因此在第一种情况下 S(17 x 17) 而在第二种情况下 (400 x 400)。我们如何将其与我们的 SVD 是 M = USV' 的事实相协调?我们建立一个rectangular diagonal matrix (400 x 17) 对 17 个非零特征值求平方根。

您可以使用 scipy 中的 SVD:

import scipy

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

((400, 400), (17,), (17, 17))

要让您的 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

低秩矩阵近似

有时你想用 r 的低阶 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)。

关于python - 如何使用 numpy python 更改 SVD 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52235314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com