comparison pyCSalgos/ABS/ABSexact.py @ 67:a8d96e67717e

Added the Analysis-By-Synthesis algorithms used in the papers "Analysis-based sparse reconstruction with synthesis-based solvers", "Choosing Analysis or Synthesis Recovery for Sparse Reconstruction" and "A generalization of synthesis and analysis sparsity"
author Nic Cleju <nikcleju@gmail.com>
date Tue, 09 Jul 2013 14:21:10 +0300
parents
children
comparison
equal deleted inserted replaced
66:ee10ffb60428 67:a8d96e67717e
1 # -*- coding: utf-8 -*-
2 """
3 Algorithms for exact analysis recovery based on synthesis solvers (a.k.a. Analysis by Synthesis, ABS).
4 Exact reconstruction.
5
6 Author: Nicolae Cleju
7 """
8 __author__ = "Nicolae Cleju"
9 __license__ = "GPL"
10 __email__ = "nikcleju@gmail.com"
11
12
13 import numpy
14
15 # Import synthesis solvers from pyCSalgos package
16 import pyCSalgos.BP.l1eq_pd
17 import pyCSalgos.BP.cvxopt_lp
18 import pyCSalgos.OMP.omp_QR
19 import pyCSalgos.SL0.SL0
20 import pyCSalgos.TST.RecommendedTST
21
22
23 def bp(y,M,Omega,x0, pdtol=1e-3, pdmaxiter=50, cgtol=1e-8, cgmaxiter=200, verbose=False):
24 """
25 ABS-exact: Basis Pursuit (based on l1magic toolbox)
26 """
27 N,n = Omega.shape
28 D = numpy.linalg.pinv(Omega)
29 U,S,Vt = numpy.linalg.svd(D)
30 Aextra = Vt[-(N-n):,:]
31
32 # Create aggregate problem
33 Atilde = numpy.vstack((numpy.dot(M,D), Aextra))
34 ytilde = numpy.concatenate((y,numpy.zeros(N-n)))
35
36 return numpy.dot(D , pyCSalgos.BP.l1eq_pd.l1eq_pd(x0,Atilde,Atilde.T,ytilde, pdtol, pdmaxiter, cgtol, cgmaxiter, verbose))
37
38 def bp_cvxopt(y,M,Omega):
39 """
40 ABS-exact: Basis Pursuit (based cvxopt)
41 """
42 N,n = Omega.shape
43 D = numpy.linalg.pinv(Omega)
44 U,S,Vt = numpy.linalg.svd(D)
45 Aextra = Vt[-(N-n):,:]
46
47 # Create aggregate problem
48 Atilde = numpy.vstack((numpy.dot(M,D), Aextra))
49 ytilde = numpy.concatenate((y,numpy.zeros(N-n)))
50
51 return numpy.dot(D , pyCSalgos.BP.cvxopt_lp.cvxopt_lp(ytilde, Atilde))
52
53
54 def ompeps(y,M,Omega,epsilon):
55 """
56 ABS-exact: OMP with stopping criterion residual < epsilon
57 """
58
59 N,n = Omega.shape
60 D = numpy.linalg.pinv(Omega)
61 U,S,Vt = numpy.linalg.svd(D)
62 Aextra = Vt[-(N-n):,:]
63
64 # Create aggregate problem
65 Atilde = numpy.vstack((numpy.dot(M,D), Aextra))
66 ytilde = numpy.concatenate((y,numpy.zeros(N-n)))
67
68 opts = dict()
69 opts['stopCrit'] = 'mse'
70 opts['stopTol'] = epsilon
71 return numpy.dot(D , pyCSalgos.OMP.omp_QR.greed_omp_qr(ytilde,Atilde,Atilde.shape[1],opts)[0])
72
73 def ompk(y,M,Omega,k):
74 """
75 ABS-exact: OMP with stopping criterion fixed number of atoms = k
76 """
77
78 N,n = Omega.shape
79 D = numpy.linalg.pinv(Omega)
80 U,S,Vt = numpy.linalg.svd(D)
81 Aextra = Vt[-(N-n):,:]
82
83 # Create aggregate problem
84 Atilde = numpy.vstack((numpy.dot(M,D), Aextra))
85 ytilde = numpy.concatenate((y,numpy.zeros(N-n)))
86
87 opts = dict()
88 opts['stopTol'] = k
89 return numpy.dot(D , pyCSalgos.OMP.omp_QR.greed_omp_qr(ytilde,Atilde,Atilde.shape[1],opts)[0])
90
91 def sl0(y,M,Omega, sigma_min, sigma_decrease_factor=0.5, mu_0=2, L=3, true_s=None):
92 """
93 ABS-exact: Smooth L0 (SL0)
94 """
95
96 N,n = Omega.shape
97 D = numpy.linalg.pinv(Omega)
98 U,S,Vt = numpy.linalg.svd(D)
99 Aextra = Vt[-(N-n):,:]
100
101 # Create aggregate problem
102 Atilde = numpy.vstack((numpy.dot(M,D), Aextra))
103 ytilde = numpy.concatenate((y,numpy.zeros(N-n)))
104
105 return numpy.dot(D, pyCSalgos.SL0.SL0.SL0(Atilde,ytilde,sigma_min,sigma_decrease_factor,mu_0,L,true_s))
106
107 def tst_recom(y,M,Omega, nsweep=300, tol=0.00001, xinitial=None, ro=None):
108 """
109 ABS-exact: Two Stage Thresholding (TST) with optimized parameters (see Maleki & Donoho)
110 """
111
112 N,n = Omega.shape
113 D = numpy.linalg.pinv(Omega)
114 U,S,Vt = numpy.linalg.svd(D)
115 Aextra = Vt[-(N-n):,:]
116
117 # Create aggregate problem
118 Atilde = numpy.vstack((numpy.dot(M,D), Aextra))
119 ytilde = numpy.concatenate((y,numpy.zeros(N-n)))
120
121 return numpy.dot(D, pyCSalgos.TST.RecommendedTST.RecommendedTST(Atilde, ytilde, nsweep, tol, xinitial, ro))
122