深刻理解KSVD字典训练方法

转载 2014年11月02日 11:34:26

在两个博客的基础上深入理解KSVD算法字典训练过程,包括程序运行的步骤:

http://blog.csdn.net/qq1028850792/article/details/12905977

http://blog.sina.com.cn/s/blog_9206acb20101crbw.html

一。K-均值算法:(每个信号由一个Ck表达)

    输入参数:

    目标函数: ek为自然向量,除第k个分量为1,其余为0

    输出:(1)求坐标矩阵X(本质上是稀疏编码,每一列非零元只有一个),X=[x1,x2,x3,...,xN];(2)矩阵C(迭代更新码本),

   理解:本质是通过N个信号,分成K类,每一类的中心点就是码字,是一个迭代过程

  举例:如下,K=2.

   

二。K-SVD算法-广义K-均值算法(放宽了坐标矩阵X(每一列非零元有多个,记为K0个),每个信号yi由多个Ck线性组合而成)

      

    输入参数:

    目标函数: 字典D相当于码本C

    输出:(1)求坐标矩阵X,X=[x1,x2,x3,...,xN];(2)字典D(迭代更新码本),

    注意:迭代求出目标值的时候,不能立即采用SVD分解来做(否则这样可能使解发散),

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

             
 
          

如上图(左上),现在我们要更新第k个原子,即d_k..那我们需要知道在上一步迭代之后哪些信号使用了该原子,即稀疏系数不为0的部分是哪些?从左上图中很容易看出,x'的第k列T(x_k),也就是x的第k行中不为0的那部分所对应的T(y_k)即是我们要找的信号,结果见左下图蓝色部分。我们用d_k和稀疏系数x(k)'来重构这部分使用了d(k)的信号,它和T(y_k)的差值即E,右上图中绿色部分,接下来我们要使用右下图这个约束来更新x_k和d_k这两个值…如此反复,直到过完备字典D的所有原子更新完毕为止…求解这个x_k和d_k,直接对E进行SVD分解即可。


matlab代码


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


Ksvd算法

1. 算法简介 K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的。 K-SVD通...
  • chengfanyong
  • chengfanyong
  • 2014年11月08日 19:28
  • 10988

KSVD算法原理简述

附上原论文截图:
  • AP1005834
  • AP1005834
  • 2016年12月02日 09:42
  • 1818

K-SVD算法

1:固定字典D通过下面的目标函数采用yi
  • hjxzb
  • hjxzb
  • 2014年09月20日 18:52
  • 6542

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

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

KSVD

K-SVD是一个用于稀疏表示的字典学习算法,是一个迭代算法,是K-Means算法的泛化。 对于问题(1) K-SVD的算法流程如下: I)固定字典,利用追踪算法(Pursuit Al...
  • u011584941
  • u011584941
  • 2016年11月05日 20:56
  • 716

KSVD

1. 算法简介 K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的。 K-SVD通过构建...
  • wwf_lightning
  • wwf_lightning
  • 2017年06月10日 17:07
  • 232

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
  • 74298

机器学习(十三)k-svd字典学习

给定训练数据Y,Y的每一列表示一个样本,我们的目标是求解字典D的每一列(原子)。K-svd算法,个人感觉跟k-means差不多,是k-means的一种扩展,字典D的每一列就相当于k-means的聚类中...
  • hjimce
  • hjimce
  • 2016年03月05日 18:44
  • 11482

ksvd算法代码

  • 2011年09月21日 11:26
  • 12KB
  • 下载

ksvd算法(matlab)稀疏表示中训练字典

  • 2010年10月29日 11:47
  • 5.98MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深刻理解KSVD字典训练方法
举报原因:
原因补充:

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