https://github.com/emmt/amors.jl
Framework to apply the AMORS algorithm in Julia
https://github.com/emmt/amors.jl
amors bilinear-model
Last synced: 3 months ago
JSON representation
Framework to apply the AMORS algorithm in Julia
- Host: GitHub
- URL: https://github.com/emmt/amors.jl
- Owner: emmt
- License: mit
- Created: 2023-03-17T16:32:40.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2025-11-28T17:00:46.000Z (7 months ago)
- Last Synced: 2025-11-30T22:12:58.564Z (7 months ago)
- Topics: amors, bilinear-model
- Language: Julia
- Homepage:
- Size: 80.1 KB
- Stars: 2
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: NEWS.md
- License: LICENSE.md
Awesome Lists containing this project
README
# The AMORS algorithm in Julia
[](https://github.com/emmt/AMORS.jl/actions/workflows/CI.yml?query=branch%3Amain) [](https://codecov.io/gh/emmt/AMORS.jl)
## Description
This Julia package provides an implementation of the `AMORS` algorithm (for *Alternated
Minimization using Optimal ReScaling*) for estimating the components `x` and `y` of a
*bilinear model* denoted by `x⊗y` and which has the following fundamental invariance
property:
``` julia
(α*x)⊗(y/α) = x⊗y
```
for any scalar factor `α > 0`.
The objective of `AMORS` is to minimize in `x ∈ 𝕏` and `y ∈ 𝕐` an objective function of
the form:
``` julia
F(x, y, μ, ν) = G(x⊗y) + μ*J(x) + ν*K(y)
```
where `G` is a function of the *bilinear model* `x⊗y`, `J` and `K` are positive
homogeneous functions of the respective variables `x` and `y`, `μ > 0` and `ν > 0` are
hyperparameters.
An *homogeneous function*, say `J: 𝕏 → ℝ`, of degree `q` is such that `J(α*x) =
abs(α)^q*J(x)` for any `α ∈ ℝ` and for any `x ∈ 𝕏` with `𝕏` the domain of `J`. It can be
noted that the following property must hold `∀ α ∈ ℝ`: `x ∈ 𝕏` implies that `α*x ∈ 𝕏`. In
other words, `𝕏` must be a cone.
Typically, `AMORS` is suitable to solve estimation problems where the unknowns, `x` and
`y`, are the components of a bilinear model given some observations of this model and
`G(x⊗y)` is a data-fidelity term (the lower the better is the agreement of the model with
the observations) while `J(x)` and `K(y)` are regularization terms implementing a priori
constraints in the components.
The `AMORS` algorithm has the following benefits over other methods such as alternating
optimization in the variables `x` and `y`:
- `AMORS` is not slower and usually much faster than the alternating method and its
convergence rate does not depend on the scaling of the initial variables (`x` or `y`);
- With `AMORS` the tuning of the hyperparameters `μ` and `ν` is easier since the result
only depend on some averaging of `μ` and `ν` so only one hyperparameter really needs to
be tuned.
To benefit from `AMORS` algorithm, the user mostly has to provide code to solve the
following two sub-problems:
``` julia
x⁺ ≈ argmin_{x ∈ 𝕏} G(x⊗y) + μ*J(x)
y⁺ ≈ argmin_{y ∈ 𝕐} G(x⊗y) + ν*K(y)
```
## References
The `AMORS` algorithm is described in:
1. Samuel Thé, Éric Thiébaut, Loïc Denis, and Ferréol Soulez, "*Exploiting the scaling
indetermination of bi-linear models in inverse problems*", in 28th European Signal
Processing Conference (EUSIPCO), pp. 2358–2362 (2021)
[DOI](https://doi.org/10.23919/Eusipco47968.2020.9287593).
2. Samuel Thé, Éric Thiébaut, Loïc Denis, and Ferréol Soulez, "*Unsupervised
blind-deconvolution with optimal scaling applied to astronomical data*", in Adaptive
Optics Systems VIII, International Society for Optics and Photonics (SPIE), Vol. 12185
(2022) [DOI](https://doi.org/10.1117/12.2630245).
## Examples
An example of usage with a rank-1 bilinear model is provided in
[`src/rank1.jl`](src/rank1.jl) and is tested in [`test/rank1tests.jl`](test/rank1tests.jl).