def test_prox_binarsity_range(self): """...Test ProxBinarsity deals with range correctly """ np.random.seed(2093) coeffs = np.random.randn(10) # put a very high strength that will push the penalized coefficients # to zero l_binarsity = 1e2 blocks_start = [1] blocks_length = [3] prox_range = (3, 7) prox = ProxBinarsity(strength=l_binarsity, blocks_start=blocks_start, blocks_length=blocks_length, range=prox_range) start_penalized_coeff = prox_range[0] + blocks_start[0] end_penalized_coeff = prox_range[0] + blocks_start[0] + blocks_length[0] self.assertTrue(all(prox.call(coeffs) [start_penalized_coeff:end_penalized_coeff] == 0))
def test_ProxBinarsity(self): """...Test of ProxBinarsity """ coeffs = self.coeffs.copy() l_binarsity = 0.5 t = 1.7 out = np.array([0., 0., 0., -0.72681389, -0.72681389, 0.4845426, 0.4845426, 0.4845426, 0., 0.]) blocks_start = [0, 3, 8] blocks_length = [3, 5, 2] prox = ProxBinarsity(strength=l_binarsity, blocks_start=blocks_start, blocks_length=blocks_length) val = 0 for j, d_j in enumerate(blocks_length): start = blocks_start[j] val += np.abs(coeffs[start + 1:start + d_j] - coeffs[start:start + d_j - 1]).sum() val *= l_binarsity self.assertAlmostEqual(prox.value(coeffs), val, delta=1e-15) assert_almost_equal(prox.call(coeffs, step=t), out, decimal=7)