Source code for magni.cs.reconstruction.iht
"""
..
Copyright (c) 2014-2017, Magni developers.
All rights reserved.
See LICENSE.rst for further information.
Subpackage providing an implementation of Iterative Hard Thresholding (IHT).
.. note:: Deprecated in Magni 1.3.0.
`magni.cs.reconstruction.iht` will be removed in a future version.
Use the more general `magni.cs.reconstruction.it` instead.
.. warning:: Change of variable interpretation.
In `magni.cs.reconstruction.it` the config variable
`threshold_fixed` has a different interpretation than in
`magni.cs.reconstruction.iht`.
Routine listings
----------------
config
Configger providing configuration options for this subpackage.
run(y, A)
Run the IHT reconstruction algorithm.
Notes
-----
The IHT reconstruction algorithm is described in [1]_. The default
configuration uses the False Alarm Rate heuristic described in [2]_.
References
----------
.. [1] T. Blumensath and M.E. Davies, "Iterative Thresholding for Sparse
Approximations", *Journal of Fourier Analysis and Applications*, vol. 14,
pp. 629-654, Sep. 2008.
.. [2] A. Maleki and D.L. Donoho, "Optimally Tuned Iterative Reconstruction
Algorithms for Compressed Sensing", *IEEE Journal Selected Topics in Signal
Processing*, vol. 3, no. 2, pp. 330-341, Apr. 2010.
"""
import warnings
from magni.cs.reconstruction.iht._config import configger as config
from magni.cs.reconstruction import it as _it
[docs]def run(y, A):
"""
Run the IHT reconstruction algorithm.
.. note:: Deprecated in Magni 1.3.0
`magni.cs.reconstruction.iht` will be removed in a future version.
Use the more general `magni.cs.reconstruction.it` instead.
Parameters
----------
y : ndarray
The m x 1 measurement vector.
A : ndarray
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.
Examples
--------
For example, recovering a vector from random measurements
>>> import warnings
>>> import numpy as np
>>> from magni.cs.reconstruction.iht import run, config
>>> 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)
>>> with warnings.catch_warnings():
... warnings.simplefilter('ignore')
... alpha_hat = run(y, A)
...
>>> np.set_printoptions(suppress=True)
>>> alpha_hat[:12]
array([[ 0.99836297],
[ 1.00029086],
[ 0.99760224],
[ 0.99927175],
[ 0.99899124],
[ 0.99899434],
[ 0.9987368 ],
[ 0.99801849],
[ 1.00059408],
[ 0.9983772 ],
[ 0. ],
[ 0. ]])
>>> (np.abs(alpha_hat) > 1e-2).sum()
10
Or recovering the same only using a fixed threshold level:
>>> config.update({'threshold': 'oracle', 'threshold_fixed': 10./80})
>>> with warnings.catch_warnings():
... warnings.simplefilter('ignore')
... alpha_hat_2 = run(y, A)
...
>>> alpha_hat_2[:12]
array([[ 0.99877706],
[ 0.99931441],
[ 0.9978366 ],
[ 0.99944973],
[ 1.00052762],
[ 1.00033436],
[ 0.99943286],
[ 0.99952526],
[ 0.99941578],
[ 0.99942908],
[ 0. ],
[ 0. ]])
>>> (np.abs(alpha_hat_2) > 1e-2).sum()
10
"""
warnings.warn(
'`magni.cs.reconstruction.iht` is deprecated in magni 1.3.0. It ' +
'will be removed in a future version. Use the more general ' +
'`magni.cs.reconstruction.it` instead.', DeprecationWarning)
current_it_config = dict(_it.config.items())
iht_config = dict(config.items())
k = int(iht_config['threshold_fixed'] * A.shape[0])
iht_config['threshold_fixed'] = k
if iht_config['threshold'] == 'oracle':
iht_config['threshold'] = 'fixed'
try:
_it.config.update(iht_config)
alpha = _it.run(y, A)
finally:
_it.config.update(current_it_config)
return alpha