关于MATLAB中稀疏表示的K-SVD算法的疑问,跪求各位大神指点,感激不尽,详细内容见问题补充 20
刚接触压缩感知KSVD稀疏表示,从网上下了个MATLAB的该算法代码,可是我带入了一个50*48的矩阵(基本每个元素都是几百左右的数值)试了一下,结果发现字典D都是小数,...
刚接触压缩感知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; 展开
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; 展开
6个回答
展开全部
字典都是小数是因为里面每个列都经过了normalization,L2 norm都是1
如果要得到稀疏系数,试试OMPerr
如果要得到稀疏系数,试试OMPerr
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
稀疏是指用训练出的字典表达原始信号时的表达向量是稀疏的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-25
展开全部
% L - 系数中非零元个数的最大值(可选,默认为D的列数,速度可能慢)
这个你设置一个合适的数值试试
这个你设置一个合适的数值试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你好,我想问一下,这个信号X是一个二维矩阵还是一个列向量呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询