Main Content

Wavelet Scattering Invariance Scale and Oversampling

This example shows how changing the invariance scale and oversampling factor affects the output of the wavelet scattering transform.

Invariance Scale

The InvarianceScale property of a wavelet time scattering framework sets the time scale of the scaling (lowpass) filter. Create a wavelet scattering framework with a signal length of 10,000 and invariance scale of 500. Obtain the filter bank.

sigLength = 1e4;
sf = waveletScattering('SignalLength',sigLength,'InvarianceScale',500);
[fb,f] = filterbank(sf);

Use the helper function helperPlotScalingWavelet to plot the scaling filter in time along with the real and imaginary parts of the coarsest-scale wavelet from the first filter bank. The source code for helperPlotScalingWavelet is listed in the appendix. The supports of the scaling filter and wavelet are essentially the size of the invariance scale.

helperPlotScalingWavelet(fb,f,500)

Generate a random signal and use featureMatrix to obtain the scattering feature matrix for the signal and scattering framework.

x = randn(1,sigLength);
smat = featureMatrix(sf,x);
whos smat
  Name        Size            Bytes  Class     Attributes

  smat      109x79            68888  double              

Each row of the feature matrix is a vector which has been convolved (filtered) with the lowpass filter (after other wavelet filtering). The second dimension of the feature matrix is the time resolution. The output of the filtering is downsampled as much as possible without aliasing, what is called "critically downsampling". The amount of downsampling depends on the bandwidth of the filter. The bigger the invariance scale, the larger the time support of the lowpass (scaling) function and accordingly the more we can downsample.

Obtain the scattering transform of the signal.

[S,~] = scatteringTransform(sf,x);
S{2}
ans=40×4 table
       signals        path      bandwidth    resolution
    _____________    _______    _________    __________

    {79x1 double}    0     1    0.0084478        -7    
    {79x1 double}    0     2    0.0084478        -7    
    {79x1 double}    0     3    0.0084478        -7    
    {79x1 double}    0     4    0.0084478        -7    
    {79x1 double}    0     5    0.0084478        -7    
    {79x1 double}    0     6    0.0084478        -7    
    {79x1 double}    0     7    0.0084478        -7    
    {79x1 double}    0     8    0.0084478        -7    
    {79x1 double}    0     9    0.0084478        -7    
    {79x1 double}    0    10    0.0084478        -7    
    {79x1 double}    0    11    0.0084478        -7    
    {79x1 double}    0    12    0.0084478        -7    
    {79x1 double}    0    13    0.0084478        -7    
    {79x1 double}    0    14    0.0084478        -7    
    {79x1 double}    0    15    0.0084478        -7    
    {79x1 double}    0    16    0.0084478        -7    
      ⋮

The scattering coefficient vectors, signals, have length 79, and the resolution is -7. This means that we expect approximately 104/27 coefficients in each vector.

Create a wavelet scattering framework with an invariance scale of 200. Obtain the scattering transform of the signal. Because the invariance scale is smaller, the bandwidth of the scaling filter increases and we cannot downsample as much without aliasing. Therefore, the number of scattering coefficients increases.

sf = waveletScattering('SignalLength',sigLength,'InvarianceScale',200);
[S,~] = scatteringTransform(sf,x);
S{2}
ans=29×4 table
       signals         path      bandwidth    resolution
    ______________    _______    _________    __________

    {157x1 double}    0     1     0.02112         -6    
    {157x1 double}    0     2     0.02112         -6    
    {157x1 double}    0     3     0.02112         -6    
    {157x1 double}    0     4     0.02112         -6    
    {157x1 double}    0     5     0.02112         -6    
    {157x1 double}    0     6     0.02112         -6    
    {157x1 double}    0     7     0.02112         -6    
    {157x1 double}    0     8     0.02112         -6    
    {157x1 double}    0     9     0.02112         -6    
    {157x1 double}    0    10     0.02112         -6    
    {157x1 double}    0    11     0.02112         -6    
    {157x1 double}    0    12     0.02112         -6    
    {157x1 double}    0    13     0.02112         -6    
    {157x1 double}    0    14     0.02112         -6    
    {157x1 double}    0    15     0.02112         -6    
    {157x1 double}    0    16     0.02112         -6    
      ⋮

Oversampling Factor

Because the invariance scale is such an important hyperparameter for scattering frameworks (one of the most important for performance), you should set the value based on the problem at hand and not because you want a certain number of coefficients. You can use the OversamplingFactor property for adjusting the number of coefficients for a given InvarianceScale. The OversamplingFactor specifies how much the scattering coefficients are oversampled with respect to the critically downsampled values. The factor is on a log2 scale.

Create a scattering framework with an invariance scale of 500, and an OversamplingFactor equal to 1. Obtain the scattering transform of the signal. As expected, the number of scattering paths is greater than in the case where InvarianceScale is 200. By setting OversamplingFactor to 1, the scattering transform returns two times as many coefficients for each scattering path with respect to the critically sampled number. The size of the scattering coefficient vectors returned is equal to the size when the scattering framework has an invariance scale of 200 with default critical downsampling.

sf = waveletScattering('SignalLength',sigLength,'InvarianceScale',500,'OversamplingFactor',1);
[S,~] = scatteringTransform(sf,x);
S{2}
ans=40×4 table
       signals         path      bandwidth    resolution
    ______________    _______    _________    __________

    {157x1 double}    0     1    0.0084478        -6    
    {157x1 double}    0     2    0.0084478        -6    
    {157x1 double}    0     3    0.0084478        -6    
    {157x1 double}    0     4    0.0084478        -6    
    {157x1 double}    0     5    0.0084478        -6    
    {157x1 double}    0     6    0.0084478        -6    
    {157x1 double}    0     7    0.0084478        -6    
    {157x1 double}    0     8    0.0084478        -6    
    {157x1 double}    0     9    0.0084478        -6    
    {157x1 double}    0    10    0.0084478        -6    
    {157x1 double}    0    11    0.0084478        -6    
    {157x1 double}    0    12    0.0084478        -6    
    {157x1 double}    0    13    0.0084478        -6    
    {157x1 double}    0    14    0.0084478        -6    
    {157x1 double}    0    15    0.0084478        -6    
    {157x1 double}    0    16    0.0084478        -6    
      ⋮

Appendix

function helperPlotScalingWavelet(fb,f,invScale)
% This function is in support of wavelet scattering examples only. It may
% change or be removed in a future release.
fBin = diff(f(1:2));
time = (-1/2:fBin:1/2-fBin)*1e4;
phi = ifftshift(ifft(fb{1}.phift));
psiL1 = ifftshift(ifft(fb{2}.psift(:,end)));
figure
plot(time,phi,'b','LineWidth',1.5)
grid on
hold on
plot(time,real(psiL1));
plot(time,imag(psiL1));
plot([-invScale/2 -invScale/2],[-6e-3 6.5e-3],'k--')
plot([invScale/2 invScale/2],[-6e-3 6.5e-3],'k--')
ylim([-6e-3 6.5e-3])
xlim([-invScale invScale])
legend('Scaling Function','Wavelet-Real Part','Wavelet-Imaginary Part')
end

See Also

| |