def test_lle_simple_grid():
    rng = np.random.RandomState(42)

    # grid of equidistant points in 2D, out_dim = n_dim
    X = np.array(list(product(range(5), repeat=2)))
    out_dim = 2
    clf = manifold.LocallyLinearEmbedding(n_neighbors=5, out_dim=out_dim,
                                          random_state=rng)
    tol = .1

    N = neighbors.kneighbors_graph(
        X, clf.n_neighbors, mode='barycenter').todense()
    reconstruction_error = np.linalg.norm(np.dot(N, X) - X, 'fro')
    assert_lower(reconstruction_error, tol)

    for solver in eigen_solvers:
        clf.fit(X, eigen_solver=solver)
        assert clf.embedding_.shape[1] == out_dim
        reconstruction_error = np.linalg.norm(
            np.dot(N, clf.embedding_) - clf.embedding_, 'fro') ** 2
        # FIXME: ARPACK fails this test ...
        if solver != 'arpack':
            assert_lower(reconstruction_error, tol)
            assert_almost_equal(clf.reconstruction_error_,
                                reconstruction_error, decimal=4)

    # re-embed a noisy version of X using the transform method
    noise = rng.randn(*X.shape) / 100
    X_reembedded = clf.transform(X + noise)
    assert_lower(np.linalg.norm(X_reembedded - clf.embedding_), tol)
def test_lle_manifold():
    # similar test on a slightly more complex manifold
    X = np.array(list(product(range(20), repeat=2)))
    X = np.c_[X, X[:, 0]**2 / 20]
    clf = manifold.LocallyLinearEmbedding(n_neighbors=5, out_dim=2)
    tol = .5

    N = neighbors.kneighbors_graph(X, clf.n_neighbors, mode='barycenter').todense()
    reconstruction_error = np.linalg.norm(np.dot(N, X) - X)
    assert reconstruction_error < tol

    for solver in ('dense', 'lobpcg'):
        clf.fit(X, eigen_solver=solver)
        reconstruction_error = np.linalg.norm(
            np.dot(N, clf.embedding_) - clf.embedding_, 'fro') ** 2
        assert reconstruction_error < tol
        assert_array_almost_equal(clf.reconstruction_error_, reconstruction_error)
def test_lle_simple_grid():
    # grid of equidistant points in 2D, out_dim = n_dim
    X = np.array(list(product(range(5), repeat=2)))
    clf = manifold.LocallyLinearEmbedding(n_neighbors=5, out_dim=2)
    tol = .1

    N = neighbors.kneighbors_graph(X, clf.n_neighbors, mode='barycenter').todense()
    reconstruction_error = np.linalg.norm(np.dot(N, X) - X, 'fro')
    assert reconstruction_error < tol

    for solver in ('dense', 'lobpcg'):
        clf.fit(X, eigen_solver=solver)
        reconstruction_error = np.linalg.norm(
            np.dot(N, clf.embedding_) - clf.embedding_, 'fro') ** 2
        assert reconstruction_error < tol
        assert_array_almost_equal(clf.reconstruction_error_, reconstruction_error, decimal=4)
    noise = np.random.randn(*X.shape) / 100
    assert np.linalg.norm(clf.transform(X + noise) - clf.embedding_) < tol
def test_lle_manifold():
    # similar test on a slightly more complex manifold
    X = np.array(list(product(range(20), repeat=2)))
    X = np.c_[X, X[:, 0]**2 / 20]
    clf = manifold.LocallyLinearEmbedding(n_neighbors=5, out_dim=2)
    tol = .5

    N = neighbors.kneighbors_graph(X, clf.n_neighbors,
                                   mode='barycenter').todense()
    reconstruction_error = np.linalg.norm(np.dot(N, X) - X)
    assert reconstruction_error < tol

    for solver in ('dense', 'lobpcg'):
        clf.fit(X, eigen_solver=solver)
        reconstruction_error = np.linalg.norm(
            np.dot(N, clf.embedding_) - clf.embedding_, 'fro')**2
        assert reconstruction_error < tol
        assert_array_almost_equal(clf.reconstruction_error_,
                                  reconstruction_error)
def test_lle_simple_grid():
    # grid of equidistant points in 2D, out_dim = n_dim
    X = np.array(list(product(range(5), repeat=2)))
    clf = manifold.LocallyLinearEmbedding(n_neighbors=5, out_dim=2)
    tol = .1

    N = neighbors.kneighbors_graph(X, clf.n_neighbors,
                                   mode='barycenter').todense()
    reconstruction_error = np.linalg.norm(np.dot(N, X) - X, 'fro')
    assert reconstruction_error < tol

    for solver in ('dense', 'lobpcg'):
        clf.fit(X, eigen_solver=solver)
        reconstruction_error = np.linalg.norm(
            np.dot(N, clf.embedding_) - clf.embedding_, 'fro')**2
        assert reconstruction_error < tol
        assert_array_almost_equal(clf.reconstruction_error_,
                                  reconstruction_error,
                                  decimal=4)
    noise = np.random.randn(*X.shape) / 100
    assert np.linalg.norm(clf.transform(X + noise) - clf.embedding_) < tol
Example #6
0
def test_isomap_reconstruction_error():
    # Same setup as in test_isomap_simple_grid, with an added dimension
    N_per_side = 5
    Npts = N_per_side ** 2
    n_neighbors = Npts - 1

    # grid of equidistant points in 2D, out_dim = n_dim
    X = np.array(list(product(range(N_per_side), repeat=2)))

    # add noise in a third dimension
    rng = np.random.RandomState(0)
    noise = 0.1 * rng.randn(Npts, 1)
    X = np.concatenate((X, noise), 1)

    # compute input kernel
    G = neighbors.kneighbors_graph(X, n_neighbors,
                                   mode='distance').toarray()

    centerer = preprocessing.KernelCenterer()
    K = centerer.fit_transform(-0.5 * G ** 2)

    for eigen_solver in eigen_solvers:
        for path_method in path_methods:
            clf = manifold.Isomap(n_neighbors=n_neighbors, out_dim=2,
                                  eigen_solver=eigen_solver,
                                  path_method=path_method)
            clf.fit(X)

            # compute output kernel
            G_iso = neighbors.kneighbors_graph(clf.embedding_,
                                               n_neighbors,
                                               mode='distance').toarray()

            K_iso = centerer.fit_transform(-0.5 * G_iso ** 2)

            # make sure error agrees
            reconstruction_error = np.linalg.norm(K - K_iso) / Npts
            assert_almost_equal(reconstruction_error,
                                clf.reconstruction_error())
def test_lle_manifold():
    # similar test on a slightly more complex manifold
    X = np.array(list(product(range(20), repeat=2)))
    X = np.c_[X, X[:, 0] ** 2 / 20]
    out_dim = 2
    clf = manifold.LocallyLinearEmbedding(n_neighbors=5, out_dim=out_dim,
                                          random_state=42)
    tol = .5

    N = neighbors.kneighbors_graph(X, clf.n_neighbors,
                                   mode='barycenter').toarray()
    reconstruction_error = np.linalg.norm(np.dot(N, X) - X)
    assert_lower(reconstruction_error, tol)

    for solver in eigen_solvers:
        clf.fit(X, eigen_solver=solver)
        assert clf.embedding_.shape[1] == out_dim
        reconstruction_error = np.linalg.norm(
            np.dot(N, clf.embedding_) - clf.embedding_, 'fro') ** 2
        details = "solver: " + solver
        assert_lower(reconstruction_error, tol, details=details)
        assert_lower(np.abs(clf.reconstruction_error_ - reconstruction_error),
                     tol * reconstruction_error, details=details)
Example #8
0
def test_isomap_simple_grid():
    # Isomap should preserve distances when all neighbors are used
    N_per_side = 5
    Npts = N_per_side ** 2
    n_neighbors = Npts - 1

    # grid of equidistant points in 2D, out_dim = n_dim
    X = np.array(list(product(range(N_per_side), repeat=2)))

    # distances from each point to all others
    G = neighbors.kneighbors_graph(X, n_neighbors,
                                   mode='distance').toarray()

    for eigen_solver in eigen_solvers:
        for path_method in path_methods:
            clf = manifold.Isomap(n_neighbors=n_neighbors, out_dim=2,
                                  eigen_solver=eigen_solver,
                                  path_method=path_method)
            clf.fit(X)

            G_iso = neighbors.kneighbors_graph(clf.embedding_,
                                               n_neighbors,
                                               mode='distance').toarray()
            assert_array_almost_equal(G, G_iso)