K-SVD算法

转载 2015年12月05日 21:43:38

1、目标:找到一个字典D,使得对于给定的训练信号集能获得稀疏表达。具体目标为:

K-SVD算法

2、具体迭代步骤

(1)第一阶段:固定字典 D ,找最好的稀疏矩阵 X 。

K-SVD算法
此为NP难问题。 给定T0,可以采用任何approximation pursuit method去求解 X。论文采用OrthogonalMatching Pursuit (OMP) algorithms。

(2)第二阶段:也是K-SVD与MOD的不同之处,字典D是逐列更新的。

因为矩阵的相乘A*B=A的列向量*B的行向量的线性相加。

假设系数X和字典D都是固定的,要更新字典的第k列dk,令稀疏矩阵X中与dk相乘的第k行记做K-SVD算法,则目标函数可以重写为: 

上式中,DX被分解为K个秩为1的矩阵的和,假设其中K-1项都是固定的,剩下的1列就是要处理更新的第k个。矩阵Ek表示去掉原子dk的成分在所有N个样本中造成的误差。

如果在这一步就用SVD更新dkK-SVD算法,SVD能找到距离Ek最近的秩为1的矩阵,但这样得到的系数K-SVD算法不稀疏,换句话说,K-SVD算法与更新dkK-SVD算法的非零元所处位置和value不一样。那怎么办呢?直观地想,只保留系数中的非零值,再进行SVD分解就不会出现这种现象了。所以对EkK-SVD算法做变换,K-SVD算法中只保留x中非零位置的,Ek只保留dkK-SVD算法中非零位置乘积后的那些项。形成K-SVD算法,将K-SVD算法SVD分解,更新dk

 这里因为X的系数很多是0的,所以我们可以用E的SVD分解出来的E=UWV;W是E的特征向量的根号,很多是0可以得到X。

3、K-SVD总可以保证误差单调下降或不变,但需要合理设置字典大小和稀疏度。

 

4、在Michael Elad的主页上有KSVD的matlab代码下载:http://www.cs.technion.ac.il/~elad/software/。感觉速度还是有点慢。

    A newer version with various improvements, created by Ron Rubinstein, is available in his webpag:

http://www.cs.technion.ac.il/~ronrubin/software.html

 

function [A,x]= KSVD(y,codebook_size,errGoal) 
%============================== 
%input parameter 
% y - input signal 
% codebook_size - count of atoms 
%output parameter 
% A - dictionary 
% x - coefficent 
%============================== 
if(size(y,2)<codebook_size) 
   disp('codebook_size is too large or training samples is too small'); 
   return; 
end 
% initialization 
[rows,cols]=size(y);
 r=randperm(cols); 
A=y(:,r(1:codebook_size)); 
A=A./repmat(sqrt(sum(A.^2,1)),rows,1); 
ksvd_iter=10; 
for k=1:ksvd_iter 
 % sparse coding 
        x=OMP(A,y,5.0/6*rows); 
  % update dictionary 
    for m=1:codebook_size 
       mindex=find(x(m,:)); 
       if ~isempty(mindex) 
            mx=x(:,mindex); mx(m,:)=0; my=A*mx; resy=y(:,mindex); 

            mE=resy-my; [u,s,v]=svds(mE,1); A(:,m)=u; x(m,mindex)=s*v';
       end 
   end 
end

书友会主讲:张永强

  • foxfly
  • foxfly
  • 2004-04-17 10:42:00
  • 643

K-SVD算法总结

K-SVD算法总结这几天看了稀疏表示的一些文章,对字典学习方法K-SVD[1]查阅了相关资料,特此总结如下,如有理解上不正确的地方,还望指正,本人还处于初学者的状态。一、概述K-SVD是一种迭代算法,...
  • Garrison2012
  • Garrison2012
  • 2015-08-31 16:12:34
  • 5376

K-SVD学习笔记

K-SVD是一个用于稀疏表示的字典学习算法,是一个迭代算法,是K-Means算法的泛化。 对于问题(1) K-SVD的算法流程如下: I)固定字典,利用追踪算法(Pursuit Algorithm...
  • JDPlus
  • JDPlus
  • 2015-11-26 15:56:37
  • 5514

K-SVD算法—图像解析,让你看透彻!(附代码)

举例:K-SVD最大的不同在字典更新这一步,K-SVD每次更新一个原子(即字典的一列)和其对应的稀疏系数,直到所有的原子更新完毕,重复迭代几次即可得到优化的字典和稀疏系数。如下。    ...
  • liu_guanzhang
  • liu_guanzhang
  • 2015-03-13 15:42:18
  • 2889

K-SVD算法详解

  • 2015年05月05日 22:51
  • 842KB
  • 下载

小白理解k-svd算法

小白理解k-svd字典学习一、字典学习字典学习也可简单称之为稀疏编码,字典学习偏向于学习字典D。从矩阵分解角度,看字典学习过程:给定样本数据集Y,Y的每一列表示一个样本;字典学习的目标是把Y矩阵分解成...
  • qq_31734083
  • qq_31734083
  • 2018-02-26 21:52:02
  • 172

K-SVD Algorithm

1. 算法简介 K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个信号的线性组合来表示的。 K-SVD通过构建字典来...
  • chlele0105
  • chlele0105
  • 2013-11-22 17:32:15
  • 8842

K-均值和K-SVD算法—最简单最透彻的讲解,不要看其他资料了

一。K-均值算法:(每个信号由一个Ck表达)     输入参数:     目标函数: ek为自然向量,除第k个分量为1,其余为0     输出:(1)求坐标矩阵X(本质上是稀疏编码,每一列非零元只有一...
  • qq1028850792
  • qq1028850792
  • 2013-10-21 14:51:27
  • 39357

K-SVD简述——字典学习,稀疏编码

K-SVDRachel Zhang 1. k-SVD introduction1.     K-SVD usage:Design/Learn a dictionary adaptively to be...
  • abcjennifer
  • abcjennifer
  • 2013-03-20 12:51:58
  • 75544

MATLAB中的svd与svds

设A为m*n阶矩阵,A'表示A的转置矩阵,A'*A的n个特征值的非负平方根叫作A的奇异值。记为σi(A)。 这几天做实验涉及到奇异值分解svd(singular value decomposit...
  • mingtian715
  • mingtian715
  • 2016-03-30 20:33:17
  • 2122
收藏助手
不良信息举报
您举报文章:K-SVD算法
举报原因:
原因补充:

(最多只允许输入30个字)