During my master thesis is was working on Compressive Sensing algorithms. Compressive Sensing (or Compressed Sampling) is about reconstructing a signal from fewer samples than the signal actually has. This only works when the signal is sparse in some domain.
Now I want to get back into the topic and for this reason I wrote the smallest example for Compressive Sensing that came to my mind. A random sequence of sparse spikes is generated and then I reconstruct the sequence with fewer samples than the original sequence. The signal is sampled by using a normal distributed sampling matrix and the implementation uses the Lasso function of scikit learn.
In the following plot you can see the reconstruction of a signal of length 1000 with only 200 samples. An undersampling factor of 200
import numpy as np from sklearn import linear_model import matplotlib.pyplot as plt n=1000 m=200 percent_zero=0.98 signal = 1.0*(np.random.rand(1, n) > percent_zero) sampling_scheme = 1.0*(np.random.randn(m, n)) samples = np.dot(sampling_scheme, signal.T) clf = linear_model.Lasso(alpha=0.001, fit_intercept=False, positive=True) clf.fit(sampling_scheme, samples) print("Non zeros original signal: %i" % sum(signal.T > 0)) print("Non zeros reconstructed signal: %i" % sum(clf.coef_ > 0)) plt.subplot(311) plt.plot(signal.T) plt.xlabel("Original signal") plt.subplot(312) plt.plot(clf.coef_) plt.xlabel("Reconstructed signal") plt.subplot(313) plt.plot((signal-clf.coef_).T) plt.xlabel("Reconstructed error") print("Reconstrudtion RMSE: %f" % np.sqrt(np.mean(delta * delta)))
Code is also available on GitHub
Also check out my second post about compressive sensing.