def test_lowrank_matrix_approx():
    """
    Test low rank matrix approximation

    """

    Xobs, Xtrue = generate_lowrank_matrix()

    # helper function to test relative error of given parameters
    def test_error(Xhat):
        test_err = np.linalg.norm(Xhat - Xtrue, 'fro')
        naive_err = np.linalg.norm(Xobs - Xtrue, 'fro')
        err_ratio = test_err / naive_err
        assert err_ratio <= 0.5

    # Proximal gradient descent and Accelerated proximal gradient descent
    for algorithm in ['sgd', 'nag']:

        # objective
        def f_df(X):
            grad = X - Xtrue
            obj = 0.5 * np.linalg.norm(grad.ravel()) ** 2
            return obj, grad

        # optimizer
        opt = getattr(algorithms, algorithm)(lr=5e-3)
        opt.operators.append(nucnorm(0.2))

        # run it
        res = opt.minimize(f_df, Xobs, maxiter=5000, display=None)

        # test
        test_error(res.x)
def test_lowrank_matrix_approx():
    """
    Test low rank matrix approximation

    """

    Xobs, Xtrue = generate_lowrank_matrix()

    # helper function to test relative error of given parameters
    def test_error(Xhat):
        test_err = np.linalg.norm(Xhat - Xtrue, 'fro')
        naive_err = np.linalg.norm(Xobs - Xtrue, 'fro')
        err_ratio = test_err / naive_err
        assert err_ratio <= 0.5

    # Proximal gradient descent and Accelerated proximal gradient descent
    for algorithm in ['sgd', 'nag']:

        # objective
        def f_df(X):
            grad = X - Xtrue
            obj = 0.5 * np.linalg.norm(grad.ravel()) ** 2
            return obj, grad

        # optimizer
        opt = GradientDescent(Xobs, f_df, algorithm, {'lr': 5e-3}, proxop=nucnorm(0.2), rho=1.0)
        opt.callbacks = []
        opt.run(maxiter=5000)

        # test
        test_error(opt.theta)
def test_nucnorm():
    pen = 1.
    rho = 0.1
    tol = 1.

    X = 2 * np.outer(np.random.randn(50), np.random.randn(25))
    V = X + 0.5 * np.random.randn(50, 25)

    # compute the nuclear norm
    def nn(A):
        return np.linalg.svd(A, compute_uv=False).sum()

    # test nucnorm
    op = proxops.nucnorm(pen)
    assert np.abs(nn(X) - nn(op(V, rho)) - pen / rho) <= tol

    # test nucnorm (w/ reshape)
    op = proxops.nucnorm(pen, newshape=(50, 25))
    v = op(V.ravel(), rho)
    assert v.shape == (50 * 25, )
    assert np.abs(nn(X) - nn(v.reshape(X.shape)) - pen / rho) <= tol
Exemple #4
0
def test_nucnorm():
    pen = 1.
    rho = 0.1
    tol = 1.

    X = 2 * np.outer(np.random.randn(50), np.random.randn(25))
    V = X + 0.5 * np.random.randn(50, 25)

    # compute the nuclear norm
    def nn(A):
        return np.linalg.svd(A, compute_uv=False).sum()

    # test nucnorm
    op = proxops.nucnorm(pen)
    assert np.abs(nn(X) - nn(op(V, rho)) - pen / rho) <= tol

    # test nucnorm (w/ reshape)
    op = proxops.nucnorm(pen, newshape=(50, 25))
    v = op(V.ravel(), rho)
    assert v.shape == (50*25,)
    assert np.abs(nn(X) - nn(v.reshape(X.shape)) - pen / rho) <= tol
Exemple #5
0
def test_nucnorm():

    pen = 1.
    rho = 0.1
    tol = 1.

    op = proxops.nucnorm(pen)

    X = 2*np.outer(np.random.randn(50), np.random.randn(25))
    V = X + 0.5 * np.random.randn(50,25)

    nn = lambda A: np.linalg.svd(A, compute_uv=False).sum()

    assert np.abs(nn(X) - nn(op(X, rho)) - pen / rho) <= tol