-- 2014-06-05 --
最近想学习K-SVD,从Google上找到retarget-toolkit代码,
$svn checkout http://retarget-toolkit.googlecode.com/svn/trunk/ retarget-toolkit-read-only
下载之后居然有500多M…… 内容很丰富。其实我只想要这三个包而已:
ksvdbox13.zip nips08matlab.zip ompbox10.zip
先安装ompbox10,再安装ksvdbox13,mac下很顺利(xcode5.0.2,matlab2014a),matlab下ompdemo,ksvddemo都运行正常。
Windows 8.1 x64+matlab 2014a折腾不明白mex -setup了,放弃!
-- 2014-06-09 --
今天学习了一下SVD奇异值分解,这是K-SVD算法的理论基础,它与特征值分解不同,不仅仅适用于方阵,而是可以应用于所有矩阵。在Matlab上一个简单的实验:
>> A=[1:4;5:8;9:12;13:16;17:20]
A =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
>> [U,S,V]=svd(A)
U =
-0.0965 -0.7686 0.6036 0.1183 0.1470
-0.2455 -0.4896 -0.5821 -0.5846 0.1395
-0.3945 -0.2107 -0.4514 0.7627 -0.1209
-0.5435 0.0683 0.2343 -0.2448 -0.7650
-0.6924 0.3472 0.1955 -0.0516 0.5993
S =
53.5202 0 0 0
0 2.3634 0 0
0 0 0.0000 0
0 0 0 0.0000
0 0 0 0
V =
-0.4430 0.7097 -0.0331 0.5467
-0.4799 0.2640 -0.3634 -0.7536
-0.5167 -0.1816 0.8260 -0.1329
-0.5536 -0.6273 -0.4296 0.3398
>> U(:,1:2)*S(1:2,:)*V'
ans =
1.0000 2.0000 3.0000 4.0000
5.0000 6.0000 7.0000 8.0000
9.0000 10.0000 11.0000 12.0000
13.0000 14.0000 15.0000 16.0000
17.0000 18.0000 19.0000 20.0000
A是一个4*5矩阵,分解成USV之后,S奇异值减小非常迅速,用r*r方阵代替S,r小于A的行列数。
>> U(:,1:2)*S(1:2,:)*V'
ans =
1.0000 2.0000 3.0000 4.0000
5.0000 6.0000 7.0000 8.0000
9.0000 10.0000 11.0000 12.0000
13.0000 14.0000 15.0000 16.0000
17.0000 18.0000 19.0000 20.0000
>> U(:,1)*S(1,:)*V'
ans =
2.2892 2.4796 2.6701 2.8605
5.8213 6.3055 6.7898 7.2741
9.3534 10.1315 10.9096 11.6876
12.8855 13.9574 15.0293 16.1012
16.4176 17.7833 19.1491 20.5148
很神奇,即使r=1,也能基本还原矩阵A。