我需要通过 * 奇异值分解 * 来降低我的图片维度。
我看过很多关于这个主题的资料。他们建议使用以下方法:
m, n = img.shape
U, S, V = np.linalg.svd(img)
#U.shape = m * m; S.shape = m * n; V.shape = n * n
img_cut = U[:, :x] @ np.diag(S[:x, :x]) @ V[:x, :]
字符串
这应该将图像的大小减小到x
。但是图像的大小将是相同的m * n
,因为U.shape[0]
和V.shape[1]
保持相同。我该怎么办?
2条答案
按热度按时间tgabmvqs1#
正如你已经意识到的,维度是相同的。SVD的原理是将矩阵分解为三个部分
M=USV^T
。通过只使用前 x 个奇异向量和值,您可以将数据点减少到x
维。为此,您只需使用两个矩阵:
字符串
你也可以用V来做,这是一个减少。当考虑表格数据时,这样做不是减少特征,而是减少样本。
通过使用另一个矩阵,您可以重建原始数据-根据 x 有一些误差。该重构数据是具有秩 x 的 * 低秩近似 *。
型
pqwbnv8z2#
矩阵 A 的SVD分解不改变 A 的维数。这将是一个没有价值的事情,只是减少和图像的大小,因为,它会降低图像质量。但我们希望保持图像质量!
相反,SVD分解 A = U Σ V^T 意味着我们对 A 保持相同的维数,但是我们可以用更小的矩阵 U_r,\Sigma_r,V_r 来替换三个矩阵 U,Σ,V,它们需要更少的数字来写,但是乘积 A_r = U_r Σ_r V_r^T 非常接近我们的原始矩阵 A。
这些课堂笔记详细解释了这件事:https://www.researchgate.net/publication/318066716_Linear_Algebra_Theory_and_Algorithms?o=Linear_Algebra
具体请参见第38.2节和第41.1节**(本节专门讨论图像!).