def test_group_lasso_atom(): ps = np.array([0]*5 + [3]*3) weights = {3:2., 0:2.3} lagrange = 1.5 lipschitz = 0.2 p = gl.group_lasso(ps, lagrange, weights) z = 30 * np.random.standard_normal(8) q = rr.identity_quadratic(lipschitz, z, 0, 0) x = p.solve(q) a = gl.prox_group_lasso(z, lagrange, lipschitz, np.array([],np.int), np.array([],np.int), np.array([], np.int), np.array([0,0,0,0,0,1,1,1]), np.array([np.sqrt(5), 2])) result = np.zeros_like(a) result[:5] = z[:5] / np.linalg.norm(z[:5]) * max(np.linalg.norm(z[:5]) - weights[0] * lagrange/lipschitz, 0) result[5:] = z[5:] / np.linalg.norm(z[5:]) * max(np.linalg.norm(z[5:]) - weights[3] * lagrange/lipschitz, 0) lipschitz = 1. q = rr.identity_quadratic(lipschitz, z, 0, 0) x2 = p.solve(q) pc = p.conjugate a2 = pc.solve(q) np.testing.assert_allclose(z-a2, x2)
def test_group_lasso2(l1=1, **control): """ fits a LASSO as a group lasso with all 2norms are one dimensional """ X = np.load("X.npy") Y = np.load('Y.npy') n, p = X.shape XtX = np.dot(X.T, X) M = np.linalg.eigvalsh(XtX).max() #/ (1*len(Y)) def e(i, n): z = np.zeros(n) z[i] = 1. return z p1 = lasso.gengrad((X, Y), L=M) p1.assign_penalty(l1=l1 * n) Dv = [(e(i, p), l1 * n) for i in range(p)] p2 = group.group_lasso((X, Dv, Y)) p2.dualcontrol['tol'] = 1.0e-10 t1 = time.time() opt1 = regreg.FISTA(p1) opt1.fit(tol=control['tol'], max_its=control['max_its']) t2 = time.time() ts1 = t2 - t1 t1 = time.time() opt2 = regreg.FISTA(p2) opt2.debug = True opt2.fit(tol=control['tol'], max_its=control['max_its']) t2 = time.time() ts3 = t2 - t1 p3 = glasso.generalized_lasso((X, np.identity(p), Y), L=M) p3.assign_penalty(l1=l1 * n) p3.dualcontrol['tol'] = 1.0e-10 t1 = time.time() opt3 = regreg.FISTA(p3) opt3.fit(tol=control['tol'], max_its=control['max_its']) t2 = time.time() ts3 = t2 - t1 beta1, _ = opt1.output beta2, _ = opt2.output beta3, _ = opt3.output X = np.arange(n) nose.tools.assert_true( (np.fabs(beta1 - beta2).sum() / np.fabs(beta1).sum()) < 5.0e-04) nose.tools.assert_true( (np.fabs(beta1 - beta3).sum() / np.fabs(beta1).sum()) < 5.0e-04)
def test_group_lasso(l1=0.1, **control): """ fits a fused lasso as a group lasso approximator, i.e. all 2norms are one dimensional """ Y = np.load('Y.npy') n = Y.shape[0] def e(i, n): z = np.zeros(n) z[i] = 1. z[i + 1] = -1 return z Dv = [(e(i, n), l1 * n) for i in range(n - 1)] D = (np.identity(n) - np.diag(np.ones(n - 1), -1))[1:] M = np.linalg.eigvalsh(np.dot(D.T, D)).max() p1 = group.group_approximator((Dv, Y), L=M) p2 = group.group_lasso((np.identity(n), Dv, Y), L=M) p3 = signal_approximator.signal_approximator((D, Y), L=M) p3.assign_penalty(l1=l1 * n) t1 = time.time() opt1 = regreg.FISTA(p1) opt1.debug = True opt1.fit(tol=control['tol'], max_its=control['max_its']) t2 = time.time() ts1 = t2 - t1 t1 = time.time() opt2 = regreg.FISTA(p3) opt2.fit(tol=control['tol'], max_its=control['max_its']) t2 = time.time() ts3 = t2 - t1 t1 = time.time() opt3 = regreg.FISTA(p3) opt3.fit(tol=control['tol'], max_its=control['max_its']) t2 = time.time() ts3 = t2 - t1 beta1, _ = opt1.output beta2, _ = opt2.output beta3, _ = opt3.output X = np.arange(n) nose.tools.assert_true( (np.fabs(beta1 - beta3).sum() / np.fabs(beta1).sum()) < 1.0e-04) nose.tools.assert_true( (np.fabs(beta1 - beta2).sum() / np.fabs(beta1).sum()) < 1.0e-04)