在KSVD代码段中,字典训练共需要以下几个常用条件:
- 确定训练集(必要字段)
- 确定字典尺寸(必要字段)
- 确定目标稀疏度(必要字段)
- 确定字典迭代次数(选填字段,不填的话默认就是10次)
- 内存使用容忍度(选填字段,不填默认是normal)
- 目标模式(选填字段,不填默认是以稀疏为目标)
第一步:
确定训练集信息
\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用的,在低内存情况下可缺省,先不管。
T就是稀疏度,在前面的目标稀疏度中K=thresh=T;最终输出在当前字典D下的稀疏向量,就是最终输出的Gamma.
---------------------必选参数设置完毕,理论上此时已经可以进行字典训练了---------------------------------
额外说明:
设置字典迭代次数,字典迭代次数实际为字典中对于字典构造的循环重复次数。
乍一看好像是没啥用,就是简单重复啊。。。。默认是10次,并不影响整体的误差,提高与降低都会在误差变量中输出每一次迭代的误差,倒是可以用来看稀疏稳定度。
函数中optimize_atom就是对其进行svd分解,与OMP交替的那个
KSVD函数中那个误差输出就是单次迭代误差的输出,计算的是当前输出的稀疏变量与当前字典取逆后再与原始输入data,也就是训练集的差,可以反映字典的训练结果,是所有输入信号的总误差。
在训练完字典后,获得了一个符合之前设置的长度的字典,对于我折叠后的信号其实是看成了多个不同的训练信号,再重新展开折叠,获取原始信号。
由于x=Dθ,所以获取原信号直接将字典与稀疏稀疏相乘即可。注意维度还原问题。