K-svd采用逐列更新的方法更新字典,就是当更新第k列原子的时候,其它的原子固定不变。假设我们当前要更新第k个原子αk,令编码矩阵X对应的第k行为xk,则目标函数为:
一直没看明白这个表达式,刚才通过matlab验证,终于弄懂了。目标函数描述的是使通过字典D和X描述出的与原始信号矩阵Y的残差。DX相乘没问题,那DX与是怎么等价呢?这里的xj是行向量,是系数矩阵的第j行;aj是列向量,是字典矩阵的第j列,那么一个行向量乘以一个列向量,乘出来一个子矩阵,这个矩阵和Y的行、列数是相同的,穷尽K次,得到K个子矩阵,这K个子矩阵相加,就是 。这里的是Y的估计,并不一定等于Y。
下面的matlab代码是该计算的验证,Y是原始矩阵,Y1是K个子矩阵加起来的和,这里两者是相等的,因为Y就是通过D*X计算出来的。
clc;clear all; close all;
D=[1 2 3 4 5; 8 9 3 2 5; 2 3 1 5 2]
X=[2 1; 5 6; 0 1; 4 2; 9 0]
Y=D*X
Y1=zeros(size(Y));
cols=size(D,2);
for i=1:cols
Y1=Y1+D(:,i)*X(i,:);
end
Y1
运行结果如下:
D =
1 2 3 4 5
8 9 3 2 5
2 3 1 5 2
X =
2 1
5 6
0 1
4 2
9 0
Y =
73 24
114 69
57 31
Y1 =
73 24
114 69
57 31
>>
关于SVD分解再补充一些个人理解:
SVD分解后的U、S、V矩阵,S是奇异值对角阵,奇异值从大到小排列,意味着U(:,i)和V(:,i)的重要性随着i的增加而减小。前面我们知道,,也就是,U的每个列向量和V对应列向量的转置相乘,乘出来r个与A同型的子矩阵,然后每个子矩阵乘以对应的奇异值S(i,i),最后将i个结果加起来,得到A。如果最后一个奇异值或最后几个的值很小,则省掉之后,可以得到A的估计值,这样就可以减小存储空间,或者可以实现降维。