K-SVD代码上手解析

本文详细介绍了KSVD算法的字典训练过程,包括确定训练集、设置字典尺寸、设定目标稀疏度等关键步骤。训练集中,信号需按长度折叠构造,确保训练集大于字典列数。字典尺寸应使列数大于行数,形成过完备字典。目标稀疏度影响结果的稀疏度和误差。字典迭代次数用于观察稀疏稳定度。通过KSVD训练得到的字典可用于重构原始信号,实现信号的稀疏表示。
摘要由CSDN通过智能技术生成

在KSVD代码段中,字典训练共需要以下几个常用条件:

  • 确定训练集(必要字段)
  • 确定字典尺寸(必要字段)
  • 确定目标稀疏度(必要字段)
  • 确定字典迭代次数(选填字段,不填的话默认就是10次)
  • 内存使用容忍度(选填字段,不填默认是normal)
  • 目标模式(选填字段,不填默认是以稀疏为目标)

代码段中对KSVD各种参数的描述

第一步:

确定训练集信息

\quad 训练集要根据所选择信号的长度来构造,若手头信号数量充足且信号长度较短,则可以直接用信号原长度构造训练集,在此常规要求信号训练集列数大于字典列数,否则训练没有意义。原则上是训练集越大对目标信号特征提取越好。
\quad 本文环境中数据量并不大,且单个数据长度较长,故采用分段的方式将单个信号折叠为多个,以2048长信号为例,将其分为64长的32段(64*32=2048);
以此类推,训练集10个数据,则总训练集大小为64×320。

第二步:

确定字典尺寸

\quad 设置字典要求为字典列数要大于字典行数,以上述数据为例,则字典行数为64,列数应大于64(文中取值为100、200左右),才为一个扁矩阵(过完备字典一定是扁的)。

第三步:

确定目标稀疏度

\quad 目标稀疏度越小,理论上可能产生的稀疏结果稀疏度就越小,同理误差可能也越大,在相关参考文献(WX)中采用实验不同参数下的稀疏误差率来获取最佳误差值。

这个目标稀疏度参数传递至KSVD中体现在Tdata变量中,作为该函数中计算Gamma的thresh值,深挖下去就是单次OMP中的最大迭代次数。
在这个程序中使用的omp函数中共有两个,分别是以稀疏为目的的omp函数,还有一个以最小误差为目的的omp2函数。
在omp函数中有D X G T四个输入,D是一个字典,也就是传感矩阵,x是信号序列,G是缓存D’*D用的,在低内存情况下可缺省,先不管。
G的描述赋值
T就是稀疏度,在前面的目标稀疏度中K=thresh=T;最终输出在当前字典D下的稀疏向量,就是最终输出的Gamma.
KSVD函数中的omp函数位置

---------------------必选参数设置完毕,理论上此时已经可以进行字典训练了---------------------------------

额外说明:

设置字典迭代次数,字典迭代次数实际为字典中对于字典构造的循环重复次数。

乍一看好像是没啥用,就是简单重复啊。。。。默认是10次,并不影响整体的误差,提高与降低都会在误差变量中输出每一次迭代的误差,倒是可以用来看稀疏稳定度。

函数中optimize_atom就是对其进行svd分解,与OMP交替的那个
KSVD函数中那个误差输出就是单次迭代误差的输出,计算的是当前输出的稀疏变量与当前字典取逆后再与原始输入data,也就是训练集的差,可以反映字典的训练结果,是所有输入信号的总误差。
关于函数中误差的描述
在训练完字典后,获得了一个符合之前设置的长度的字典,对于我折叠后的信号其实是看成了多个不同的训练信号,再重新展开折叠,获取原始信号。
由于x=Dθ,所以获取原信号直接将字典与稀疏稀疏相乘即可。注意维度还原问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值