Normalised Integration Method (NIM)¶
Definition¶
NIM (Donno, Chauris & Calandra 2013) maps a signed seismic trace \(d(t)\) to a probability density and then compares cumulative distributions in L2:
\[
f(t) = \sigma\bigl(d(t)\bigr),\qquad
F(t) = \frac{\int_0^t f(\tau)\,\mathrm d\tau}{\int_0^T f(\tau)\,\mathrm d\tau},
\]
\[
\mathcal J_{\mathrm{NIM}}(m) \;=\; \tfrac12 \sum_{\text{trace}}\int_0^T \bigl(F_{\mathrm s}(t)-F_{\mathrm o}(t)\bigr)^2\,\mathrm dt.
\]
The positive transform \(\sigma\) is selectable:
positive= |
\(\sigma(d)\) | First proposed in |
|---|---|---|
"square" |
\(d^2\) | NIM (default) |
"abs" |
\(\lvert d\rvert\) | Donno et al. (2013) |
"linear" |
\(d + c\) (\(c \ge \max\lvert d\rvert\)) | Engquist & Froese (2014) |
"exp" |
\(\exp(d)\) | Engquist, Froese & Yang (2016) |
Why it works¶
Comparing CDFs is equivalent to the 1-Wasserstein distance on the density (Bonneel et al. 2011) — a shift of a wavelet by \(\Delta t\) contributes \(\sim (\Delta t)^2\) to NIM regardless of cycle-skipping. L2 saturates once the shift exceeds half a wavelength; NIM does not.
API¶
from sweep_loss import NIMLoss, nim_loss
NIMLoss(positive="square", dt=1e-3)(syn, obs)
nim_loss(syn, obs, positive="linear", dt=1e-3)
Tests¶
tests/test_nim.py checks:
- zero for identical signals across all four positive transforms,
- monotone growth in the shift of a Gaussian wavelet,
- equality with the explicit CDF-difference formula,
- anti-cycle-skipping property: NIM keeps growing past the half-wavelength shift where L2 starts to drop,
- gradients flow,
- parameter validation.
References¶
- Donno, D., Chauris, H. & Calandra, H. (2013). Estimating the background velocity model with the normalised integration method. 75th EAGE Conference & Exhibition. doi:10.3997/2214-4609.20130411
- Bonneel, N., van de Panne, M., Paris, S. & Heidrich, W. (2011). Displacement interpolation using Lagrangian mass transport. ACM Trans. Graph. 30 (6). doi:10.1145/2070781.2024192