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
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
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