magni.cs.reconstruction.sl0._algorithm module¶
Module providing the core Smoothed l0 (SL0) algorithm.
Routine listings¶
- run(y, A)
- Run the SL0 reconstruction algoritm.
See also
magni.cs.reconstruction.sl0._config
- Configuration options.
Notes
Implementations of the original SL0 reconstruction algorithm [1] and a modified Sl0 reconstruction algorithm [3] are available. It is also possible to configure the subpackage to provide customised versions of the SL0 reconstruction algorithm. The projection algorithm [1] is used for small delta (< 0.55) whereas the contraint elimination algorithm [2] is used for large delta (>= 0.55) which merely affects the computation time.
References
[1] | (1, 2) H. Mohimani, M. Babaie-Zadeh, and C. Jutten, “A Fast Approach for Overcomplete Sparse Decomposition Based on Smoothed l0 Norm”, IEEE Transactions on Signal Processing, vol. 57, no. 1, pp. 289-301, Jan. 2009. |
[2] | Z. Cui, H. Zhang, and W. Lu, “An Improved Smoothed l0-norm Algorithm Based on Multiparameter Approximation Function”, in 12th IEEE International Conference on Communication Technology (ICCT), Nanjing, China, Nov. 11-14, 2011, pp. 942-945. |
[3] | C. S. Oxvig, P. S. Pedersen, T. Arildsen, and T. Larsen, “Surpassing the Theoretical 1-norm Phase Transition in Compressive Sensing by Tuning the Smoothed l0 Algorithm”, in IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), Vancouver, Canada, May 26-31, 2013, pp. 6019-6023. |
-
magni.cs.reconstruction.sl0._algorithm.
run
(y, A)[source]¶ Run the SL0 reconstruction algorithm.
Parameters: - y (ndarray) – The m x 1 measurement vector.
- A (ndarray or magni.utils.matrices.{Matrix, MatrixCollection}) – The m x n matrix which is the product of the measurement matrix and the dictionary matrix.
Returns: alpha (ndarray) – The n x 1 reconstructed coefficient vector.
See also
magni.cs.reconstruction.sl0.config()
- Configuration options.
Notes
The algorithm terminates after a fixed number of iterations or if the ratio between the 2-norm of the residual and the 2-norm of the measurements falls below the specified tolerance.
Examples
For example, recovering a vector from random measurements using the original SL0 reconstruction algorithm
>>> import numpy as np, magni >>> from magni.cs.reconstruction.sl0 import run >>> np.set_printoptions(suppress=True) >>> magni.cs.reconstruction.sl0.config['L'] = 'fixed' >>> magni.cs.reconstruction.sl0.config['mu'] = 'fixed' >>> magni.cs.reconstruction.sl0.config['sigma_start'] = 'fixed' >>> np.random.seed(seed=6021) >>> A = 1 / np.sqrt(80) * np.random.randn(80, 200) >>> alpha = np.zeros((200, 1)) >>> alpha[:10] = 1 >>> y = A.dot(alpha) >>> alpha_hat = run(y, A) >>> alpha_hat[:12] array([[ 0.99993202], [ 0.99992793], [ 0.99998107], [ 0.99998105], [ 1.00005882], [ 1.00000843], [ 0.99999138], [ 1.00009479], [ 0.99995889], [ 0.99992509], [-0.00001509], [ 0.00000275]]) >>> (np.abs(alpha_hat) > 1e-2).sum() 10
Or recover the same vector as above using the modified SL0 reconstruction algorithm
>>> magni.cs.reconstruction.sl0.config['L'] = 'geometric' >>> magni.cs.reconstruction.sl0.config['mu'] = 'step' >>> magni.cs.reconstruction.sl0.config['sigma_start'] = 'reciprocal' >>> alpha_hat = run(y, A) >>> alpha_hat[:12] array([[ 0.9999963 ], [ 1.00000119], [ 1.00000293], [ 0.99999661], [ 1.00000021], [ 0.9999951 ], [ 1.00000103], [ 1.00000662], [ 1.00000404], [ 0.99998937], [-0.00000075], [ 0.00000037]]) >>> (np.abs(alpha_hat) > 1e-2).sum() 10