基于ksvd分解的过完备字典在一维机械信号重构上的应用

本文探讨了基于ksvd分解的过完备字典在一维机械信号重构中的应用,强调了过完备表示对复杂信号的优越逼近能力。通过实例分析了信号重构过程,指出稀疏系数选择对提取冲击特征的影响,揭示了选择适当稀疏系数的重要性。
摘要由CSDN通过智能技术生成

基于ksvd分解的过完备字典在一维机械信号重构上的应用


前言

字典学习的理论基础是稀疏表征理论,我们假设自然界所有的信号都是稀疏信号,也就是自然可分解。傅里叶变换是基于一组完备的正交基函数来表示信号。小波变换是基于一组完备的正交小波函数来表示信号。上述信号分解方法的局限性在于其自适应能力差,例如傅里叶变换适合平稳信号而不适合非平稳信号分析,小波变换则恰恰相反。针对该问题,基于过完备字典的稀疏表征被提出。稀疏表征的目的是用尽可能少的原子表示目标信号,以获得信号最简单的表达形式。这种稀疏表达方法可以更精确地刻画信号的内在特征。信号稀疏表达的两大核心问题包括稀疏分解和字典选择。严格意义上的稀疏分解是一个非凸的 NP 难的问题,因此需要对其进行次优化求解。常见的稀疏分解方法包括贪婪追踪算法;基于凸优化算法;基于贝叶斯概率估计算法等。信号的稀疏表征不仅仅与稀疏分解有关,同时也与选取的字典有关。一种有效的方法是选取常用的分析字典,例如 Gabor 字典、小波字典、DCT 字典等。这种预定义的字典虽然降低了稀疏分解的复杂度,但是也存在适应性不足的缺点。而学习字典通过训练样本自适应地产生最能匹配目标信号内在结构的原子库,常见的字典学习算法包括 ML、MAP、KSVD 等方法,这些方法大都采用系数更新和字典更新交替优化的方式。尽管字典学习算法的复杂度更高,但是其能获得适应性更强的字典,其分解的稀疏性也
更高。
字典学习最开始是应用在图像处理上的,而后引入到一维机械信号中,但是在网上搜了很久也没有相关的demo,全部都是图像处理的,就很桑心


一、稀疏表征理论

1.1 过完备表示

与正交分解不同,过完备表示能够在更广泛的函数集合里选择基函数,也并非线性无关,这种方式对复杂信号能够有更好的逼近效果,但也有相关的论文针对过完备字典的原子的线性无关进行研究,参考张志强提出的非相关字典学习算法(INK-SVD)。
而过完备的概念就是能够尽可能的包含所提取到的特征,

1.2 数学描述

基于构造初始字典的方式的不同,有很多字典,gabor字典,傅里叶字典,等等,
其中样本用y表示,字典用d表示,稀疏稀疏用x表示,字典d是一个n*k的矩阵,其中的原子(atom)就是一列矩阵,n是原子的维度(dims),k是字典所含的原子个数,而要构造一个过完备字典,则要求其k>n。
字典学习无非两个步骤,第一个步骤就是构造初始字典结构,第二个步骤就是如何更新字典,来求取稀疏稀疏。
而我们实际上求解的问题也就是这样一个等式,由于要求解字典的最稀疏表示和稀疏稀疏,这实际上是一个L0范数的最优化问题,但 L0范数最优化是 NP难问题,很难准确求解,因此通常采用更宽泛的 Lp范数作为稀疏性度量函数。

在这里插入图片描述

在这里插入图片描述

1.3 Ksvd算法流程如下

稀疏稀疏求解算法有如下几类:基追踪法,匹配追踪法,正交匹配追踪法
字典学习算法有如下几类:k-means,最大似然估计法,最佳方向法,移不变字典学习算法,ksvd算法。
有兴趣的大家可以自行查阅资料,这里简要介绍下ksvd的算法流程,其余不做赘述。
在这里插入图片描述

二、代码和信号

1.引入库

代码如下(示例):

import numpy as np
from sklearn import linear_model
import scipy.misc
import matplotlib.pyplot as plt
import time
from scipy.io import loadmat


class KSVD(object):
    def __init__(self, n_components, max_iter, tol, n_nonzero_coefs):
        '''
        稀疏模型Y=DX,Y位样本矩阵,使用KSVD动态更新字典矩阵D和稀疏稀疏
        param n_components 字典所含原子数目
        param max_iter 最大迭代次数
        param tol 稀疏表示结果的容差
        param n_nonzero_coefs 稀疏度
        '''
        self.dictionary = None
        self.sparsecode = None
        self.max_iter = max_iter
        self.tol = tol
        self.n_components = n_components
        self.n_nonzero_coefs = n_nonzero_coefs

    def _initialize(self, y):
        '''
        初始化字典矩阵
        '''
        '''
        用随机选取样本的方法来初始化字典矩阵,y=160*3060
        
        y_sample = y.T #y_sample=3060*160
        rand_arr = np.arange(y_sample.shape[0])#生成0-3059的数
        np.random.shuffle(rand_arr)#将其顺序打乱
        shape1 = y_sample[rand_arr[0:200]].T
        self.dictionary = shape1
        print(self.dictionary.shape)

        for i in range(200):
            self.dictionary[:, i] = self.dictionary[:, i] / np.linalg.norm(sel
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值