🎯要点
- 离散小波变换和逆离散小波变换
 - 时间序列谱分析
 - 计算比例图和频谱图显示数据
 - 莫莱小波时频数据表征
 - 海表温度异常的区域平均值
 - 捕捉市场波动时间频率关联信息
 - 信号和图像分解压缩重建
 - 降维
 - 分析金融波动
 - 连续小波卷积网络和离散小波信号分类
 - 图像处理、提取地震图速度和衰减参数
 - 高质量无噪音时频分析

 
Python哈尔小波
在数学中,哈尔小波是一系列重新缩放的“方形”函数,它们共同构成小波族或基。小波分析类似于傅立叶分析,因为它允许用正交基来表示间隔内的目标函数。哈尔序列现在被认为是第一个已知的小波基,并被广泛用作教学示例。哈尔小波也是最简单的小波。哈尔小波的技术缺点是它不连续,因此不可微分。然而,这一特性对于分析具有突然转变的信号(离散信号)来说却是一个优势,例如监控机器中的工具故障。
哈尔小波的母小波函数 
     
      
       
       
         ψ 
        
       
         ( 
        
       
         t 
        
       
         ) 
        
       
      
        \psi(t) 
       
      
    ψ(t)可以描述为
  
      
       
        
        
          ψ 
         
        
          ( 
         
        
          t 
         
        
          ) 
         
        
          = 
         
         
         
           { 
          
          
           
            
             
             
               1 
              
             
            
            
             
              
              
                0 
               
              
                ≤ 
               
              
                t 
               
              
                < 
               
               
               
                 1 
                
               
                 2 
                
               
              
             
            
           
           
            
             
              
              
                − 
               
              
                1 
               
              
             
            
            
             
              
               
               
                 1 
                
               
                 2 
                
               
              
                ≤ 
               
              
                t 
               
              
                < 
               
              
                1 
               
              
             
            
           
           
            
             
             
               0 
              
             
            
            
             
             
                否则  
              
             
            
           
          
         
        
       
         \psi(t)= \begin{cases}1 & 0 \leq t<\frac{1}{2} \\ -1 & \frac{1}{2} \leq t<1 \\ 0 & \text { 否则 }\end{cases} 
        
       
     ψ(t)=⎩ 
              ⎨ 
              ⎧1−100≤t<2121≤t<1 否则 
其尺度函数 
     
      
       
       
         φ 
        
       
         ( 
        
       
         t 
        
       
         ) 
        
       
      
        \varphi(t) 
       
      
    φ(t)可描述为
  
      
       
        
        
          φ 
         
        
          ( 
         
        
          t 
         
        
          ) 
         
        
          = 
         
         
         
           { 
          
          
           
            
             
             
               1 
              
             
            
            
             
              
              
                0 
               
              
                ≤ 
               
              
                t 
               
              
                < 
               
              
                1 
               
              
             
            
           
           
            
             
             
               0 
              
             
            
            
             
             
                否则  
              
             
            
           
          
         
        
       
         \varphi(t)= \begin{cases}1 & 0 \leq t<1 \\ 0 & \text { 否则 }\end{cases} 
        
       
     φ(t)={100≤t<1 否则 
 与哈尔小波相关的 2×2 哈尔矩阵为
  
      
       
        
         
         
           H 
          
         
           2 
          
         
        
          = 
         
         
         
           [ 
          
          
           
            
             
             
               1 
              
             
            
            
             
             
               1 
              
             
            
           
           
            
             
             
               1 
              
             
            
            
             
              
              
                − 
               
              
                1 
               
              
             
            
           
          
         
           ] 
          
         
        
       
         H_2=\left[\begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array}\right] 
        
       
     H2=[111−1]
 使用离散小波变换,可以将任意长度的偶数序列  
     
      
       
       
         ( 
        
        
        
          a 
         
        
          0 
         
        
       
         , 
        
        
        
          a 
         
        
          1 
         
        
       
         , 
        
       
         … 
        
       
         , 
        
        
        
          a 
         
         
         
           2 
          
         
           n 
          
         
        
       
         , 
        
        
        
          a 
         
         
         
           2 
          
         
           n 
          
         
           + 
          
         
           1 
          
         
        
       
         ) 
        
       
      
        \left(a_0, a_1, \ldots, a_{2 n}, a_{2 n+1}\right) 
       
      
    (a0,a1,…,a2n,a2n+1) 变换为二元序列 -向量  
     
      
       
       
         ( 
        
        
        
          ( 
         
         
         
           a 
          
         
           0 
          
         
        
          , 
         
         
         
           a 
          
         
           1 
          
         
        
          ) 
         
        
       
         , 
        
        
        
          ( 
         
         
         
           a 
          
         
           2 
          
         
        
          , 
         
         
         
           a 
          
         
           3 
          
         
        
          ) 
         
        
       
         , 
        
       
         … 
        
       
         , 
        
        
        
          ( 
         
         
         
           a 
          
          
          
            2 
           
          
            n 
           
          
         
        
          , 
         
         
         
           a 
          
          
          
            2 
           
          
            n 
           
          
            + 
           
          
            1 
           
          
         
        
          ) 
         
        
       
         ) 
        
       
      
        \left(\left(a_0, a_1\right),\left(a_2, a_3\right), \ldots,\left(a_{2 n}, a_{2 n+1}\right)\right) 
       
      
    ((a0,a1),(a2,a3),…,(a2n,a2n+1))。如果将每个向量与矩阵  
     
      
       
        
        
          H 
         
        
          2 
         
        
       
      
        H_2 
       
      
    H2 右乘,则得到结果  
     
      
       
       
         ( 
        
        
        
          ( 
         
         
         
           s 
          
         
           0 
          
         
        
          , 
         
         
         
           d 
          
         
           0 
          
         
        
          ) 
         
        
       
         , 
        
       
         … 
        
       
         , 
        
        
        
          ( 
         
         
         
           s 
          
         
           n 
          
         
        
          , 
         
         
         
           d 
          
         
           n 
          
         
        
          ) 
         
        
       
         ) 
        
       
      
        \left(\left(s_0, d_0\right), \ldots,\left(s_n, d_n\right)\right) 
       
      
    ((s0,d0),…,(sn,dn)) 为快速哈尔小波变换的阶段。通常,我们将序列  
     
      
       
       
         s 
        
       
      
        s 
       
      
    s 和  
     
      
       
       
         d 
        
       
      
        d 
       
      
    d 分开,然后继续转换序列  
     
      
       
       
         s 
        
       
      
        s 
       
      
    s。序列  
     
      
       
       
         s 
        
       
      
        s 
       
      
    s 通常被称为平均值部分,而  
     
      
       
       
         d 
        
       
      
        d 
       
      
    d 被称为细节部分。
如果一个序列的长度是四的倍数,则可以构建 4 个元素的块,并使用 4×4 哈尔矩阵以类似的方式对其进行变换
  
      
       
        
         
         
           H 
          
         
           4 
          
         
        
          = 
         
         
         
           [ 
          
          
           
            
             
             
               1 
              
             
            
            
             
             
               1 
              
             
            
            
             
             
               1 
              
             
            
            
             
             
               1 
              
             
            
           
           
            
             
             
               1 
              
             
            
            
             
             
               1 
              
             
            
            
             
              
              
                − 
               
              
                1 
               
              
             
            
            
             
              
              
                − 
               
              
                1 
               
              
             
            
           
           
            
             
             
               1 
              
             
            
            
             
              
              
                − 
               
              
                1 
               
              
             
            
            
             
             
               0 
              
             
            
            
             
             
               0 
              
             
            
           
           
            
             
             
               0 
              
             
            
            
             
             
               0 
              
             
            
            
             
             
               1 
              
             
            
            
             
              
              
                − 
               
              
                1 
               
              
             
            
           
          
         
           ] 
          
         
        
       
         H_4=\left[\begin{array}{cccc} 1 & 1 & 1 & 1 \\ 1 & 1 & -1 & -1 \\ 1 & -1 & 0 & 0 \\ 0 & 0 & 1 & -1 \end{array}\right] 
        
       
     H4= 
              111011−101−1011−10−1 
              
 它结合了快速哈尔小波变换的两个阶段。
一般来说,2N×2N 哈尔矩阵可以通过以下等式导出。
  
      
       
        
         
         
           H 
          
          
          
            2 
           
          
            N 
           
          
         
        
          = 
         
         
         
           [ 
          
          
           
            
             
              
               
               
                 H 
                
               
                 N 
                
               
              
                ⊗ 
               
              
                [ 
               
              
                1 
               
              
                , 
               
              
                1 
               
              
                ] 
               
              
             
            
           
           
            
             
              
               
               
                 I 
                
               
                 N 
                
               
              
                ⊗ 
               
              
                [ 
               
              
                1 
               
              
                , 
               
              
                − 
               
              
                1 
               
              
                ] 
               
              
             
            
           
          
         
           ] 
          
         
        
       
         H_{2 N}=\left[\begin{array}{c} H_N \otimes[1,1] \\ I_N \otimes[1,-1] \end{array}\right] 
        
       
     H2N=[HN⊗[1,1]IN⊗[1,−1]]
 其中  
     
      
       
        
        
          I 
         
        
          N 
         
        
       
         = 
        
        
        
          [ 
         
         
          
           
            
            
              1 
             
            
           
           
            
            
              0 
             
            
           
           
            
            
              … 
             
            
           
           
            
            
              0 
             
            
           
          
          
           
            
            
              0 
             
            
           
           
            
            
              1 
             
            
           
           
            
            
              … 
             
            
           
           
            
            
              0 
             
            
           
          
          
           
            
             
             
               ⋮ 
              
              
               
              
             
            
           
           
            
             
             
               ⋮ 
              
              
               
              
             
            
           
           
            
            
              ⋱ 
             
            
           
           
            
             
             
               ⋮ 
              
              
               
              
             
            
           
          
          
           
            
            
              0 
             
            
           
           
            
            
              0 
             
            
           
           
            
            
              … 
             
            
           
           
            
            
              1 
             
            
           
          
         
        
          ] 
         
        
       
      
        I_N=\left[\begin{array}{cccc}1 & 0 & \ldots & 0 \\ 0 & 1 & \ldots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \ldots & 1\end{array}\right] 
       
      
    IN= 
             10⋮001⋮0……⋱…00⋮1 
              和  
     
      
       
       
         ⊗ 
        
       
      
        \otimes 
       
      
    ⊗ 是克罗内克积。
Python示例
哈尔小波的特点是简单和二元阶跃函数。其结构有利于图像和信号处理、数值分析,甚至数据压缩领域。其主要优势在于能够提供有关特定函数或数据集的局部频率信息。我们将使用 TensorFlow演示一维离散哈尔小波变换。
pip install numpy
pip install tensorflow
 
def haar1d_layer(x):
    outputs = []
    len = x.shape[1]
    while len > 1:
        v_reshape = tf.reshape(x, [-1, len//2, 2])
        v_diff = v_reshape[:,:,1:2] - v_reshape[:,:,0:1]
        v_diff = tf.reshape(v_diff, [-1, len//2])
        outputs.append(v_diff)
        x = tf.reduce_mean(v_reshape, axis=2)
        len = len // 2
    outputs.append(x)
    return tf.concat(outputs, 1)
def haar1d_inv_layer(x):
    idx = 1
    len = x.shape[1]
    while idx < len:
        v_avg = x[:, -idx:]
        v_avg = tf.reshape(v_avg, [-1, idx, 1])
        v_delta = x[:, (len - (idx << 1)):(len - idx)] / 2
        v_delta = tf.stack([-v_delta, v_delta], axis=2) 
        v_out = v_avg + v_delta
        v_out = tf.reshape(v_out, [-1, idx*2])
        x = tf.concat([x[:, :-(idx << 1)], v_out], axis=1)
        idx = idx << 1
    return x
 
haar1d_layer() 函数对输入向量中的元素对进行迭代,计算每对元素的平均值和差异,并将它们写入 output_vector。haar1d_inv_layer() 函数执行相反的操作,从 input_vector 中获取平均值和差异对,并计算原始值,然后将它们写入 output_vector。函数 stack() 用于将 TensorArray 转换为 Tensor。
使用上述函数
v = tf.Variable([
    [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],
    [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
],dtype=tf.float32)
x = layers.Input(shape=(v.shape[1],))
y = haar1d_layer(x)
encoder = Model(x, y)
encoded = encoder.predict(v)
print(encoded)
y = haar1d_inv_layer(x)
decoder = Model(x, y)
decoded = decoder.predict(encoded)
print(decoded)
 
运行时,您将看到转换后的向量以及转换后向量的反转结果,该结果应与原始输入向量相同。



















