Parameter estimation#
TL;DR
An estimator is fitted from the simulator of the acquisition it inverts, and returns one named map per unknown.
Dictionary matching and lookup tables search simulated signals; PERK regresses on a prior; a per-voxel fit of the model itself is bartorch’s
apps.mobafit.A grid grows with the product of the parameter ranges; a fit grows by one Jacobian column per parameter.
You give an estimator the simulator of your acquisition and the range of each unknown, and it returns parameter maps from a measured volume.
Capabilities#
Draws the training set from the simulator being inverted, and returns one named map per unknown.
Show code and tests
Code:
fit(),map(). Tests: a mapping recovers a tissue it was trained over; the maps come back named and shaped like the volume (test_mapping.py).Matches by normalized inner products, and returns M0 from the score and the stored atom norm.
Show code and tests
Code:
DictionaryMatcher. Tests: dictionary matcher recovers complex scaled atoms (test_dictionary.py); a match answers with the density without touching an atom (test_uncertainty.py).Works in a low-rank temporal subspace, fitted here or passed in, and reports the signal energy it retains.
Show code and tests
Code:
Subspace. Tests: retained is the error it will cost (test_subspace.py); a subspace maps as well as the contrasts it replaces (test_mapping.py).Clusters the dictionary and excludes whole groups before scoring their atoms.
Show code and tests
Code:
DictionaryMatcher(groups=...). Tests: grouped matching finds what direct matching finds; most of the dictionary is ruled out (test_grouped.py).Reads one unknown off a monotonic signal curve by interpolation.
Show code and tests
Code:
LookupTable. Tests: interpolating beats the grid it was built on; a t1 map is read from the two blocks (test_lookup.py).Trains a kernel ridge regression on random Fourier features.
Show code and tests
Code:
PERK. Tests: streaming reaches what holding the dictionary reaches (test_perk.py); perk is comparable to dictionary matching under noise (test_mapping_comparison.py).Takes separately measured maps, such as B1, in PERK.
Show code and tests
Code:
fit(known=...). Tests: a known property reaches the simulator and is asked for again (test_mapping.py).Returns an uncertainty map where the method defines one.
Show code and tests
Code:
map(volume, uncertainty=True). Tests: perk states a spread without repeating itself; a method that answers with a grid point says it has none (test_uncertainty.py).
Division of responsibility#
Spatial regularization. Every estimator is voxel-wise; a spatial prior belongs to Model-based reconstruction.
Neural-network estimators. PERK’s estimate is differentiable with respect to the signal, so it can sit inside one.
Nonlinear least squares. A per-voxel Levenberg-Marquardt fit of the same simulator is bartorch’s
apps.mobafit, over aModelOperator; its answer depends on its starting point.Declared equality constraints. Two fractions summing to one are written into the model, with one of them as the unknown.
Method#
T2 and M0 from a 16-echo spin echo at 1 % noise. The lookup table reads the ratio of late to early echoes. On the same 24-point grid the dictionary is limited by the spacing and the table is not. PERK is least accurate at the short-T2 end of its prior. Times are measured at build time.#
Data requirements#
Dictionary matching: a grid. A subspace shortens each inner product to the rank; grouping reduces how many are taken. A
pruneset too small can exclude the group holding the match.Lookup table: one unknown, and a
combinethat is monotonic in it, such as the MP2RAGE unified image.PERK: a prior and the noise level of the scan. Mapping costs one feature projection per voxel, whatever the number of unknowns.
Nuisance parameters#
Normalization removes M0 and the receive phase from a match. M0 is recovered as
the measurement norm times the score divided by the atom norm;
PERK(normalize=True) regresses the reciprocal signal norm instead. A nuisance
parameter that survives normalization, such as the noise floor of a magnitude
image, has to be put on the grid.
Uncertainty#
PERK regresses the absolute error of its training estimates on its features,
so its uncertainty includes the bias toward the prior; it holds at the signal
amplitude it was trained at. It is read against crlb(),
the bound for an unbiased estimator. Grid methods raise
NotImplementedError when asked for one.
Examples#
Dictionary matching: an MRF train matched in full, in a rank-4 subspace, and in 32 groups.
MP2RAGE lookup table: MP2RAGE T1 by lookup table and by dictionary, against the number of grid points.
T2 mapping by nonlinear least squares: multi-echo T2 with a noise-floor offset, fitted with bartorch’s
apps.mobafitand matched.PERK: kernel ridge regression: PERK at three regression sizes, and its uncertainty against the Cramér-Rao bound.