关于K-SVD算法中逐列更新的目标函数的理解,再看不懂就打死我吧

K-svd采用逐列更新的方法更新字典,就是当更新第k列原子的时候,其它的原子固定不变。假设我们当前要更新第k个原子αk,令编码矩阵X对应的第k行为xk,则目标函数为:

一直没看明白这个表达式,刚才通过matlab验证,终于弄懂了。目标函数描述的是使通过字典D和X描述出的\hat{Y}与原始信号矩阵Y的残差。DX相乘没问题,那DX与是怎么等价呢?这里的xj是行向量,是系数矩阵的第j行;aj是列向量,是字典矩阵的第j列,那么一个行向量乘以一个列向量,乘出来一个子矩阵,这个矩阵和Y的行、列数是相同的,穷尽K次,得到K个子矩阵,这K个子矩阵相加,就是\hat{Y} 。这里的\hat{Y}是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是奇异值对角阵,奇异值\delta _{i}从大到小排列,意味着U(:,i)和V(:,i)的重要性随着i的增加而减小。前面我们知道,A=U*S*V^{T}=\sum_{i=1}^{r}S(i,i)*U(:,i)*V(:,i)^{T},也就是,U的每个列向量和V对应列向量的转置相乘,乘出来r个与A同型的子矩阵,然后每个子矩阵乘以对应的奇异值S(i,i),最后将i个结果加起来,得到A。如果最后一个奇异值或最后几个的值很小,则省掉之后,可以得到A的估计值,这样就可以减小存储空间,或者可以实现降维。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值