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