def test_fused_lasso(n=100, l1=15., ratio=0.1): Y = np.random.standard_normal(n) Y[int(0.1*n):int(0.3*n)] += 6. D1 = (np.identity(n) - np.diag(np.ones(n-1),-1))[1:] D2 = np.dot(D1[1:,1:], D1) D2 = np.vstack([D1, ratio*np.identity(n)]) M = np.linalg.eigvalsh(np.dot(D2.T, D2)).max() D1sp = scipy.sparse.csr_matrix(D1) Dsp = scipy.sparse.csr_matrix(D2) D3 = np.identity(n) D3sp = scipy.sparse.csr_matrix(D3) semi = seminorm(l1norm(l1)) #+ seminorm(genl1norm(D1sp,l1)) p2 = squaredloss((np.eye(n),Y),semi) opt2 = regreg.FISTA(p2) opt2.debug = True obj2 = opt2.fit(tol=1.0e-10, max_its=5000) beta2, _ = opt2.output print beta2 p1 = sapprox.gengrad_sparse((D3sp, Y),L=M) p1.assign_penalty(l1=l1) opt1 = regreg.FISTA(p1) #opt1.debug = True obj1 = opt1.fit(tol=1.0e-10, max_its=5000, alpha=1.05) beta1, _ = opt1.output print beta1 print np.allclose(beta1,beta2,rtol=1e-4) """
import pylab import numpy as np import scipy.sparse from regreg.algorithms import FISTA from regreg.smooth import l2normsq from regreg.atoms import l1norm, maxnorm from regreg.seminorm import seminorm sparsity = l1norm(500, l=1.3) D = (np.identity(500) + np.diag([-1]*499,k=1))[:-1] D = scipy.sparse.csr_matrix(D) fused = l1norm(D, l=20) penalty = seminorm(sparsity,fused) Y = np.random.standard_normal(500); Y[100:150] += 7; Y[250:300] += 14 loss = l2normsq.shift(-Y, l=0.5) problem = loss.add_seminorm(penalty) solver = FISTA(problem) solver.fit(max_its=100, tol=1e-10) solution = solver.problem.coefs import pylab pylab.scatter(np.arange(Y.shape[0]), Y, c='r') pylab.plot(solution, color='yellow', linewidth=5) l1_fused = np.fabs(D * solution).sum() l1_sparsity = np.fabs(solution).sum()
import scipy.sparse from regreg.algorithms import FISTA from regreg.smooth import quadratic from regreg.atoms import l1norm, maxnorm from regreg.seminorm import seminorm D = (np.diag(np.ones(500)) - np.diag(np.ones(499),1))[:-1] DT = scipy.sparse.csr_matrix(D.T) D = scipy.sparse.csr_matrix(D) Y = np.random.standard_normal(500); Y[100:150] += 7; Y[250:300] += 14 loss = quadratic.shift(-Y, l=0.5) penalty = l1norm(D, l=20) problem = loss.add_seminorm(seminorm(penalty)) solver = FISTA(problem) solver.fit(max_its=100, tol=1e-10) solution = solver.problem.coefs l1_soln = np.fabs(D * solution).sum() tfocs_penalty = maxnorm(499, l=l1_soln) tfocs_loss = quadratic.affine(DT, -Y, l=0.5) tfocs_loss.coefs = np.zeros(499) tfocs_problem = tfocs_loss.add_seminorm(tfocs_penalty) tfocs_solver = FISTA(tfocs_problem) tfocs_solver.debug = True tfocs_solver.fit(max_its=1000, tol=1e-10) tfocs_dual_solution = tfocs_problem.coefs tfocs_primal_solution = Y - DT * tfocs_dual_solution
from regreg.algorithms import FISTA from regreg.smooth import l2normsq from regreg.atoms import l1norm, maxnorm from regreg.seminorm import seminorm D = (np.diag(np.ones(500)) - np.diag(np.ones(499), 1))[:-1] DT = scipy.sparse.csr_matrix(D.T) D = scipy.sparse.csr_matrix(D) Y = np.random.standard_normal(500) Y[100:150] += 7 Y[250:300] += 14 loss = l2normsq.shift(-Y, l=0.5) penalty = l1norm(D, l=20) problem = loss.add_seminorm(seminorm(penalty)) solver = FISTA(problem) solver.fit(max_its=100, tol=1e-10) solution = solver.problem.coefs l1_soln = np.fabs(D * solution).sum() tfocs_penalty = maxnorm(499, l=l1_soln) tfocs_loss = l2normsq.affine(DT, -Y, l=0.5) tfocs_loss.coefs = np.zeros(499) tfocs_problem = tfocs_loss.add_seminorm(tfocs_penalty) tfocs_solver = FISTA(tfocs_problem) tfocs_solver.debug = True tfocs_solver.fit(max_its=1000, tol=1e-10) tfocs_dual_solution = tfocs_problem.coefs tfocs_primal_solution = Y - DT * tfocs_dual_solution