深刻理解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


Guru of the Week 条款14:类之间的关系(上篇)

GotW #14 Class Relationships Part I著者:Herb Sutter     翻译:kingofark[声明]:本文内容取自www.gotw.ca网站上的Guru of ...
  • kingofark
  • kingofark
  • 2001-10-29 20:05:00
  • 1129

KSVD算法原理简述

附上原论文截图:
  • AP1005834
  • AP1005834
  • 2016-12-02 09:42:55
  • 2800

KSVD

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

Ksvd算法

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

k-svd字典学习

k-svd字典学习 原文地址:http://blog.csdn.net/hjimce/article/details/50810129 作者:hjimce 一、字典学习 字...
  • s151506879
  • s151506879
  • 2016-07-24 15:58:37
  • 4257

K-SVD算法

1:固定字典D通过下面的目标函数采用yi
  • hjxzb
  • hjxzb
  • 2014-09-20 18:52:54
  • 7292

D-KSVD(Discrimination K-SVD)

1.概述D-KSVD算法基于SRC算法而提出。SRC算法最大的特点是:(1)选取训练样本作为字典来进行编码,由此可能产生的问题有:字典过大,导致实验进行时运算量大耗时过长,字典原子未经过预处理可能存在...
  • qq_31076269
  • qq_31076269
  • 2017-11-09 11:47:02
  • 226

matlab:安装ksvd工具包

截图自:http://www.ilovematlab.cn/thread-225434-2-1.html 之前也看了这个readme.txt 但愣是没看懂是这个意思,看来英语还是太弱。 ...
  • durpur
  • durpur
  • 2015-11-25 19:50:39
  • 2089

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
收藏助手
不良信息举报
您举报文章:深刻理解KSVD字典训练方法
举报原因:
原因补充:

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