def test_logistic_counts(): """ Test the equivalence of binary/count specification in logistic_deviance """ #Form the count version of the problem trials = np.random.binomial(5,0.5,100)+1 successes = np.random.binomial(trials,0.5,len(trials)) n = len(successes) p = 2*n X = np.random.normal(0,1,n*p).reshape((n,p)) loss = rr.logistic_deviance.linear(X, successes=successes, trials=trials) penalty = rr.quadratic(p, coef=1.) prob1 = rr.container(loss, penalty) solver1 = rr.FISTA(prob1) solver1.fit() solution1 = solver1.composite.coefs #Form the binary version of the problem Ynew = [] Xnew = [] for i, (s,n) in enumerate(zip(successes,trials)): Ynew.append([1]*s + [0]*(n-s)) for j in range(n): Xnew.append(X[i,:]) Ynew = np.hstack(Ynew) Xnew = np.vstack(Xnew) loss = rr.logistic_deviance.linear(Xnew, successes=Ynew) penalty = rr.quadratic(p, coef=1.) prob2 = rr.container(loss, penalty) solver2 = rr.FISTA(prob2) solver2.fit() solution2 = solver2.composite.coefs npt.assert_array_almost_equal(solution1, solution2, 3)
def test_quadratic(): l = rr.quadratic(5, coef=3., offset=np.arange(5)) l.quadratic = rr.identity_quadratic(1, np.ones(5), 2 * np.ones(5), 3.) c1 = l.get_conjugate(as_quadratic=True) q1 = rr.identity_quadratic(3, -np.arange(5), 0, 0) q2 = q1 + l.quadratic c2 = rr.zero(5, quadratic=q2.collapsed()).conjugate ww = np.random.standard_normal(5) np.testing.assert_almost_equal(c2.smooth_objective(ww, 'grad'), c1.smooth_objective(ww, 'grad')) np.testing.assert_almost_equal(c2.objective(ww), c1.objective(ww)) np.testing.assert_almost_equal( c2.smooth_objective(ww, 'func') + c2.nonsmooth_objective(ww), c1.smooth_objective(ww, 'func') + c1.nonsmooth_objective(ww))
def test_quadratic(): l = rr.quadratic(5, coef=3., offset=np.arange(5)) l.quadratic = rr.identity_quadratic(1,np.ones(5), 2*np.ones(5), 3.) c1 = l.get_conjugate(as_quadratic=True) q1 = rr.identity_quadratic(3, -np.arange(5), 0, 0) q2 = q1 + l.quadratic c2 = rr.zero(5, quadratic=q2.collapsed()).conjugate ww = np.random.standard_normal(5) np.testing.assert_almost_equal(c2.smooth_objective(ww, 'grad'), c1.smooth_objective(ww, 'grad')) np.testing.assert_almost_equal(c2.objective(ww), c1.objective(ww)) np.testing.assert_almost_equal(c2.smooth_objective(ww, 'func') + c2.nonsmooth_objective(ww), c1.smooth_objective(ww, 'func') + c1.nonsmooth_objective(ww))
def ridge(self): if self.lambda2 > 0: return rr.quadratic(self.p,bound=self.lambda2) else: return None