K-SVD算法学习

来源:互联网 发布:什么是云计算举例说明 编辑:程序博客网 时间:2024/05/22 05:11

1:稀疏表示:
考虑线性等式,或者是线性逼近。X=Da,这里的D是MP 的矩阵。称为字典(字典学习中),测量矩阵(压缩感知中),权重矩阵(多任务学习中),其中M<<PD 中的每一列称为原子。其模型为

min||a||0
s.t.X=Da
等价于
min1/2||XDa||22+λ||a||0
当然其中||a||0 可以用其最优凸近似||a||1 来近似替代进行求解。
这里写图片描述
如图,即为稀疏表示模型。我们对al0 范数,就是要求a 中的元素非0元尽可能少,0元素尽可能多,故为稀疏表示。有由上图可以看到,a 只有三个位置非0,也即是X 可以由字典D 的第四个原子,第七个原子,第13个原子线性表出,而系数的大小,由a 中的非0元确定。

2:K-means 算法
所谓K-means 算法,聚类方法中最简单的一种。其目的就是寻找潜在的K 个类别y,从而使样本Xi 合理的归属到不同的类别y 中。其具体算法是如下两步:
:首先随机选取K 个质心μ1,μ2,,μK
:重复如下两步直到收敛:
1) 把样本Xi 归属到某一类中,具体的做法如下:

Ci=argminj||Xiμj||22
表示的是如果Xiμj 距离最小的话,那么就把Xi 归属到μj 这一类中。对样本中所有元素都如此进行分类。
2)重新计算质心的位置μ1,μ2,,μK 。最简单的办法就是把一类中的所有元素的坐标求平均。

其实K-means也是一中稀疏表示:对于样本元素Y,目的是找到其距离最近的质心 。其解决如下优化问题:
这里写图片描述
字典D中含有K 个原子或者说是质心。对于样本Yi ,约束要求的是,找到对应的稀疏表示Xi ,只有一个原子被选中,也即是稀疏表示 Xi 中只有一个元素不为0。那么样本样本Yi 即属于相应的质心。近似模型如下:
这里写图片描述

3:K-svd算法
K-means算法是字典中只有一个原子被选中,也就是这个元素Yi只由一个原子来表示。而K-svd 松弛了这一要求:用尽可能少的原子来近似表出。其模型如下:
这里写图片描述
其中X 为样本数据,A 为稀疏表示矩阵。对于样本Xi,约束条件要求的是,用尽可能少的原子(<T0个)来近似表示Xi。也可以用如下模型来近似:
这里写图片描述
关于其直观描述如下图:
这里写图片描述
其中矩阵A 为稀疏表示矩阵。也即是对于样本X1,用第三个原子和第十个原子线性表出。同样的可以看出其他的样本。

K-svd的算法求解:
1)固定D,更新求解A。暂且还没看。
2)更新D 。在这个过程中,只更新D的一列,一列更新完,更新下一列。更新第K列的时候,其他的列固定,那么原问题可以写成如下分解方式:
这里写图片描述
其中需要说明的是dkD的第K列,akTAK行。这意思是dk原子对整个样本矩阵的影响或者说贡献,把所有用到dk原子的样本抽取出来进行计算,也即是如下图所示:
这里写图片描述

接下来有:

这里写图片描述

4:K-svd算法
这里写图片描述
自己写的一个程序,不太成熟,也可能不正确,只是为了自己加深理解罢了。

“`
function [D,X]=Ksvd(Y,X)

D=rand(25,100);%%随机生成字典
k=size(D,2);
N=size(Y,2);
err=Y-D*X;
for iter=1:50 %%最多迭代100次
for i=1:k
temp=find(X(i,:)); %%表示第i行的所有非零元
max=length(temp);
omega=zeros(N,max);
for ind=1:max
omega(temp(ind),ind)=1;
end

Err=err+D(:,i)*X(i,:);
ErR=Err*omega;
[U S V]=svds(ErR,1,’L’);
D(:,i)=U(:,1);
X(i,:)=V(:,1)*S(1,1);
end
end

参考文献
1:An Algorithm for Designing Overcomplete Dictionaries for Sparse Representation

2:KSVD学习

0 0
原创粉丝点击