SVD、奇异值分解后矩阵值增加
Posted
技术标签:
【中文标题】SVD、奇异值分解后矩阵值增加【英文标题】:Matrix values increasing after SVD, singular value decomposition 【发布时间】:2016-01-10 07:45:02 【问题描述】:我正在尝试学习用于图像处理的 SVD...比如压缩。
我的方法:使用 ImageIO 将图像作为 BufferedImage... 获取 RGB 值并使用它们来获取等效的灰度值(位于 0-255 之间)并将其存储在 double[][]
数组中。并在 SVD 中使用该数组对其进行压缩。
我的 USV 矩阵是正确的……希望如此。 我从 AATranspose (AAT) 的 U 获取,从 ATA 获取 V。
举个例子
A 是我的原始矩阵。
A = 7.0 3.0 2.0
9.0 7.0 5.0
9.0 8.0 7.0
5.0 3.0 6.0
U = -0.34598 -0.65267 -0.59969 -0.30771
-0.57482 -0.27634 0.26045 0.72484
-0.64327 0.21214 0.44200 -0.58808
-0.36889 0.67280 -0.61415 0.18463
S = 21.57942 0.00000 0.00000
0.00000 3.35324 0.00000
0.00000 0.00000 2.02097
0.00000 0.00000 0.00000
VT = -0.70573 -0.52432 -0.47649
-0.53158 -0.05275 0.84536
-0.46838 0.84989 -0.24149
所以现在我必须进行外部产品扩展,省略一些压缩项。让我们将截断的术语称为k
。
当我让 k = 1,并用奇异值进行外积扩展时,这就是我得到的新矩阵
B = 6.43235 4.03003 1.70732
9.24653 6.55266 5.12711
9.41838 7.24083 7.21571
4.41866 4.05485 5.70027
如您所见,B 中的一些值(我认为这应该是我在 SVD 之后的最终矩阵)大于我的原始矩阵。
A
只是一个测试矩阵。我稍后会尝试压缩灰度图像,并且值必须是 0-255。任何大于 255 的东西都帮不了我。
我哪里出错了?
编辑:k
是我要截断的术语数。所以当我说k = 1
时,我要重构的矩阵是:
A = u1 * S11 * vt1 + u2 * S22 + vt2
这里 u1 和 u2 是 U 的第 1 列和第 2 列,vt1 和 vt2 是 V 的第 1 和 2 行。
【问题讨论】:
【参考方案1】:实际上我最近在 Kaggle 上这样问过a question。希望它与您的计算机视觉问题有关...不过,我不明白的一件事是,您在截断S
后如何重建A'
。据我了解,当您的k=1
时,截断的对角矩阵将如下所示:
21.57942 0.00000 0.00000
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000
而A'
,可以通过A' = US'Vt
重建A
在没有更错误、低能量奇异值的情况下的近似值。这是我对A'
的结果:
5.268951 3.914582 3.557461
8.753958 6.503777 5.910449
9.796523 7.278353 6.614362
5.617932 4.173858 3.793084
为什么有些值高于原始 A
矩阵是有道理的@矩阵。
使用其他资源进行编辑:同时检查 this question。
【讨论】:
k
是我要删除的术语数,k
不是我将使用的术语数。但我想通了……我只能截断来自U
和VT
的向量,它们对应于S
中的零奇异值。如果我继续截断一个非零奇异值,我就会得到我在问题中谈论的问题。
我还是不明白为什么这是一个“问题”。近似矩阵中的值允许大于原始矩阵,因为您无疑将从V
和U
矩阵中删除一些负项。这家伙有一个关于 SVD 基本直觉的很好的教程(记住,有不同的用例):matpalm.com/lsa_via_svd/eg1.html
如果您对去噪用例不感兴趣,您可能对我在答案中包含的 Kaggle 链接中的答案中提出的用例更感兴趣,回复:V
“混合矩阵”的矩阵截断。以上是关于SVD、奇异值分解后矩阵值增加的主要内容,如果未能解决你的问题,请参考以下文章