如何使用 numpy python 更改 SVD 的顺序
How change order of SVD using numpy python
我正在使用奇异值分解 (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 个特征值。
我什至尝试过转置但没有成功
我知道问题的标题可能不太清楚所以请随意更改,这里有一些与数据相关的信息
我通过减去均值面来集中数据
我试图通过寻找协方差矩阵 (MM') 的特征向量来解决问题,但是当我试图显示 PCA1 时它只显示黑色图像
请帮帮我
没有为矩形矩阵定义特征值,但奇异值是相关的。至于特征向量,您总是有一组跨越列和行的左右特征向量 space.
SVD与MM'
和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'M
和 MM'
的非零特征值的平方根。可以看出这两个具有相同的非零特征值集,因此在第一种情况下 S
是 (17 x 17)
,在第二种情况下 (400 x 400)
。我们如何将其与我们的 SVD 是 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)
这给了
((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
低秩矩阵近似
有时您想要近似您的矩阵M
具有低秩M_tilde
r
,在这种情况下,如果你想最小化两者之间的 Frobenius 范数,你只需保留 r
最大的奇异值(Eckhart-Young 定理)。
U, S, V
的大小变为:(400 x r), (r x r), (r x 17)
,其中 S
是对角线。
我不知道您使用的是哪个函数,但这就是正在发生的事情:零奇异值被丢弃,因为 (m x n)
矩阵最多可以具有秩 min(m, n)
(在你的情况下是 17)。
我正在使用奇异值分解 (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 个特征值。
我什至尝试过转置但没有成功
我知道问题的标题可能不太清楚所以请随意更改,这里有一些与数据相关的信息
我通过减去均值面来集中数据
我试图通过寻找协方差矩阵 (MM') 的特征向量来解决问题,但是当我试图显示 PCA1 时它只显示黑色图像
请帮帮我
没有为矩形矩阵定义特征值,但奇异值是相关的。至于特征向量,您总是有一组跨越列和行的左右特征向量 space.
SVD与MM'
和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'M
和 MM'
的非零特征值的平方根。可以看出这两个具有相同的非零特征值集,因此在第一种情况下 S
是 (17 x 17)
,在第二种情况下 (400 x 400)
。我们如何将其与我们的 SVD 是 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)
这给了
((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
低秩矩阵近似
有时您想要近似您的矩阵M
具有低秩M_tilde
r
,在这种情况下,如果你想最小化两者之间的 Frobenius 范数,你只需保留 r
最大的奇异值(Eckhart-Young 定理)。
U, S, V
的大小变为:(400 x r), (r x r), (r x 17)
,其中 S
是对角线。
我不知道您使用的是哪个函数,但这就是正在发生的事情:零奇异值被丢弃,因为 (m x n)
矩阵最多可以具有秩 min(m, n)
(在你的情况下是 17)。