java – SVD后的矩阵值增加,奇异值分解

我正在尝试学习用于图像处理的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行.

最佳答案 我最近在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的近似可以没有更多错误的低能量奇异值,可以通过A’= US’Vt重建.这是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

当您考虑到U和Vt都具有负值时,为什么有一些值高于原始A矩阵是有意义的,当您乘以新的S矩阵时,这些值现在被归零.

使用其他资源进行编辑:同时检查this question.

点赞