# SimPEG.regularization.SparseSmoothness.update_weights#

SparseSmoothness.update_weights(m)[source]#

Update the IRLS weights for sparse smoothness regularization.

Parameters:
mnumpy.ndarray

The model used to update the IRLS weights.

Notes

Let us consider the IRLS weights for sparse smoothness along the x-direction. When the class property gradient_type=’components’, IRLS weights are computed using the regularization kernel function and we define:

$\mathbf{f_m} = \mathbf{G_x} \big [ \mathbf{m} - \mathbf{m}^{(ref)} \big ]$

where $$\mathbf{m}$$ is the model provided, $$\mathbf{G_x}$$ is the partial cell gradient operator along x (i.e. x-derivative), and $$\mathbf{m}^{(ref)}$$ is a reference model (optional, activated using reference_model_in_smooth). See SmoothnessFirstOrder.f_m() for a more comprehensive definition of the regularization kernel function.

However, when the class property gradient_type=’total’, IRLS weights are computed using the magnitude of the total gradient and we define:

$\mathbf{{f}_m} = \mathbf{A_{cx}} \sum_{j=x,y,z} \Big | \mathbf{A_j G_j} \big [ \mathbf{m} - \mathbf{m}^{(ref)} \big ] \Big |$

where $$\mathbf{A_j}$$ for $$j=x,y,z$$ averages the partial gradients from their respective faces to cell centers, and $$\mathbf{A_{cx}}$$ averages the sum of the absolute values back to the appropriate faces.

Once $$\mathbf{f_m}$$ is obtained, the IRLS weights are computed via:

$\mathbf{w_r} = \boldsymbol{\lambda} \oslash \Big [ \mathbf{f_m}^{\!\! 2} + \epsilon^2 \Big ]^{1 - \mathbf{p}/2}$

where $$\oslash$$ represents elementwise division, $$\epsilon$$ is a small constant added for stability of the algorithm (set using the irls_threshold property), and $$\mathbf{p}$$ defines the norm for each element (set using the norm property).

$$\boldsymbol{\lambda}$$ applies optional scaling to the IRLS weights (when the irls_scaled property is True). The scaling acts to preserve the balance between the data misfit and the components of the regularization based on the derivative of the l2-norm measure. And it assists the convergence by ensuring the model does not deviate aggressively from the global 2-norm solution during the first few IRLS iterations.

To apply the scaling, let

$f_{max} = \big \| \, \mathbf{f_m} \, \big \|_\infty$

and define a vector array $$\mathbf{\tilde{f}_{\! max}}$$ such that:

$\begin{split}\tilde{f}_{\! i,max} = \begin{cases} f_{max} \;\;\;\;\; for \; p_i \geq 1 \\ \frac{\epsilon}{\sqrt{1 - p_i}} \;\;\; for \; p_i < 1 \end{cases}\end{split}$

The scaling vector $$\boldsymbol{\lambda}$$ is:

$\boldsymbol{\lambda} = \Bigg [ \frac{f_{max}}{\mathbf{\tilde{f}_{max}}} \Bigg ] \odot \Big [ \mathbf{\tilde{f}_{max}}^{\!\! 2} + \epsilon^2 \Big ]^{1 - \mathbf{p}/2}$