关于MATLAB中稀疏表示的K-SVD算法的疑问,跪求各位大神指点,感激不尽,详细内容见问题补充

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于MATLAB中稀疏表示的K-SVD算法的疑问,跪求各位大神指点,感激不尽,详细内容见问题补充相关的知识,希望对你有一定的参考价值。

刚接触压缩感知KSVD稀疏表示,从网上下了个MATLAB的该算法代码,可是我带入了一个50*48的矩阵(基本每个元素都是几百左右的数值)试了一下,结果发现字典D都是小数,而系数矩阵X每个元素都是几百左右的数值,按理说X应该是稀疏的也就是绝大部分元素数值等于或近似于0啊,以下是我用到的代码,一个是KSVD的,另一个是其用到的OMP的,跪求各位大神指点迷津,该代码哪里出问题了,为何X不是稀疏的,该如何改进?感激不尽啊
function [A,x]= KSVD(y,codebook_size,errGoal)
%==============================
%input parameter
% y - input signal
% codebook_size - count of atoms
%output parameter
% A - dictionary
% x - coefficent
%reference:K-SVD:An Algorithm for Designing of Overcomplete Dictionaries
% for Sparse Representation,Aharon M.,Elad M.etc
%==============================
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);%y的列、行数目分别赋值给两者
r=randperm(cols);%r的维度为cols的随机置换向量
A=y(:,r(1:codebook_size));%将y的第(r的第一个到第“原子个数”个)列提取出构成初试字典A
A=A./repmat(sqrt(sum(A.^2,1)),rows,1);
ksvd_iter=10;
for k=1:ksvd_iter
% sparse coding
if nargin==2
x=OMP(A,y,codebook_size);
elseif nargin==3
x=OMP(A,y,errGoal);
end
% 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

function A=OMP(D,X,L)
% 输入参数:
% D - 过完备字典,注意:必须字典的各列必须经过了规范化
% X - 信号
% L - 系数中非零元个数的最大值(可选,默认为D的列数,速度可能慢)
% 输出参数:
% A - 稀疏系数
if nargin==2
L=size(D,2);
end
P=size(X,2);
K=size(D,2);
for k=1:1:P,
a=[];
x=X(:,k);
residual=x;
indx=zeros(L,1);
for j=1:1:L,
proj=D'*residual;
[maxVal,pos]=max(abs(proj));
pos=pos(1);
indx(j)=pos;
a=pinv(D(:,indx(1:j)))*x;
residual=x-D(:,indx(1:j))*a;
if sum(residual.^2) < 1e-6
break;
end
end;
temp=zeros(K,1);
temp(indx(1:j))=a;
A(:,k)=sparse(temp);
end;
return;

参考技术A 字典都是小数是因为里面每个列都经过了normalization,L2 norm都是1
如果要得到稀疏系数,试试OMPerr
参考技术B 稀疏是指用训练出的字典表达原始信号时的表达向量是稀疏的 参考技术C % L - 系数中非零元个数的最大值(可选,默认为D的列数,速度可能慢)

这个你设置一个合适的数值试试
参考技术D 你好,我想问一下,这个信号X是一个二维矩阵还是一个列向量呢 第5个回答  2013-11-20 要怎么带入矩阵

图像融合基于matlab稀疏表示多光谱图像融合含Matlab源码 1301期

一、稀疏表示简介

1 稀疏表示理论
稀疏表示用较少的基本信号的线性组合来表达大部分或者全部的原始信号。信号经稀疏表示后, 如果越稀疏那么重构后的信号精度越高。设x∈Rn为待处理信号, D∈Rn×m为字典, 则x可以表示为:

式中:Θ∈Rm, Θ= (θ1, θ2…, θm) 为稀疏系数;D (nm) 为过完备字典。加入稀疏性约束后, 式 (1) 可由式 (2) 得到:

式中‖·‖0表示l0范数, 它表示Θ中非0元素的个数。式 (2) 的精确稀疏表示通常不能满足, 其逼近形式可以描述为:

式中v∈Rn为逼近误差, 因此将式 (2) 转化为对式 (3) 的求解。

式中ε为容许误差, ε>0。直接求解l0范数是一个NP难问题, 对于它的求解可以使用松弛算法或贪婪算法。
稀疏表示中的稀疏分解算法首先由Mallat提出, 他提出的匹配追踪算法 (Matching Pursuit, MP) 算法, 简单且易于实现, 因此得到了广泛的应用。随后, 学者们基于MP算法相继提出了改进算法, 如正交匹配追踪算法 (Orthogonal Matching Pursuit, OMP) 相较于MP算法收敛速度更快。

以上是关于关于MATLAB中稀疏表示的K-SVD算法的疑问,跪求各位大神指点,感激不尽,详细内容见问题补充的主要内容,如果未能解决你的问题,请参考以下文章

K-SVD的基本介绍

K-SVD字典学习及其实现(Python)

毕业设计/Matlab系列基于稀疏表示(mp算法)的图像修复

关于如何解决稀疏OLS - 如何在Matlab中应用`l1`最小化(教育目的)

用matlab怎样估计信号的稀疏度,提供程序最好了

图像融合基于matlab稀疏表示多光谱图像融合含Matlab源码 1301期