def test_knn_graph_anisotropy(): k = 3 a = 13 n_pca = 20 anisotropy = 0.9 thresh = 1e-4 data_small = data[np.random.choice(len(data), len(data) // 2, replace=False)] pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data_small) data_small_nu = pca.transform(data_small) pdx = squareform(pdist(data_small_nu, metric="euclidean")) knn_dist = np.partition(pdx, k, axis=1)[:, :k] epsilon = np.max(knn_dist, axis=1) weighted_pdx = (pdx.T / epsilon).T K = np.exp(-1 * weighted_pdx ** a) K[K < thresh] = 0 K = K + K.T K = np.divide(K, 2) d = K.sum(1) W = K / (np.outer(d, d) ** anisotropy) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data_small, n_pca=n_pca, thresh=thresh, decay=a, knn=k - 1, random_state=42, use_pygsp=True, anisotropy=anisotropy, ) assert isinstance(G2, graphtools.graphs.kNNGraph) assert G.N == G2.N np.testing.assert_allclose(G.dw, G2.dw, atol=1e-14, rtol=1e-14) np.testing.assert_allclose((G2.W - G.W).data, 0, atol=1e-14, rtol=1e-14)
def test_knn_graph_multiplication_symm(): k = 3 n_pca = 20 pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data) data_nu = pca.transform(data) pdx = squareform(pdist(data_nu, metric="euclidean")) knn_dist = np.partition(pdx, k, axis=1)[:, :k] epsilon = np.max(knn_dist, axis=1) K = np.empty_like(pdx) for i in range(len(pdx)): K[i, pdx[i, :] <= epsilon[i]] = 1 K[i, pdx[i, :] > epsilon[i]] = 0 W = K * K.T np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data, n_pca=n_pca, decay=None, knn=k - 1, random_state=42, use_pygsp=True, kernel_symm="*", ) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G.W - G2.W).nnz == 0 assert (G2.W - G.W).sum() == 0 assert isinstance(G2, graphtools.graphs.kNNGraph)
def test_knn_graph(): k = 3 n_pca = 20 pca = PCA(n_pca, svd_solver='randomized', random_state=42).fit(data) data_nu = pca.transform(data) pdx = squareform(pdist(data_nu, metric='euclidean')) knn_dist = np.partition(pdx, k, axis=1)[:, :k] epsilon = np.max(knn_dist, axis=1) K = np.empty_like(pdx) for i in range(len(pdx)): K[i, pdx[i, :] <= epsilon[i]] = 1 K[i, pdx[i, :] > epsilon[i]] = 0 K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph(data, n_pca=n_pca, decay=None, knn=k, random_state=42, use_pygsp=True) assert(G.N == G2.N) assert(np.all(G.d == G2.d)) assert((G.W != G2.W).nnz == 0) assert((G2.W != G.W).sum() == 0) assert(isinstance(G2, graphtools.graphs.kNNGraph))
def test_knn_graph_fixed_bandwidth(): k = None decay = 5 bandwidth = 10 bandwidth_scale = 1.3 n_pca = 20 thresh = 1e-4 pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data) data_nu = pca.transform(data) pdx = squareform(pdist(data_nu, metric="euclidean")) K = np.exp(-1 * np.power(pdx / (bandwidth * bandwidth_scale), decay)) K[K < thresh] = 0 K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data, n_pca=n_pca, decay=decay, bandwidth=bandwidth, bandwidth_scale=bandwidth_scale, knn=k, random_state=42, thresh=thresh, search_multiplier=2, use_pygsp=True, ) assert isinstance(G2, graphtools.graphs.kNNGraph) np.testing.assert_array_equal(G.N, G2.N) np.testing.assert_array_equal(G.d, G2.d) np.testing.assert_allclose((G.W - G2.W).data, np.zeros_like((G.W - G2.W).data), atol=1e-14) bandwidth = np.random.gamma(20, 0.5, len(data)) K = np.exp(-1 * (pdx.T / (bandwidth * bandwidth_scale)).T**decay) K[K < thresh] = 0 K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data, n_pca=n_pca, decay=decay, bandwidth=bandwidth, bandwidth_scale=bandwidth_scale, knn=k, random_state=42, thresh=thresh, use_pygsp=True, ) assert isinstance(G2, graphtools.graphs.kNNGraph) np.testing.assert_array_equal(G.N, G2.N) np.testing.assert_allclose(G.dw, G2.dw, atol=1e-14) np.testing.assert_allclose((G.W - G2.W).data, np.zeros_like((G.W - G2.W).data), atol=1e-14)
def test_exact_graph_callable_bandwidth(): decay = 2 knn = 5 def bandwidth(x): return 2 n_pca = 20 thresh = 1e-4 pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data) data_nu = pca.transform(data) pdx = squareform(pdist(data_nu, metric="euclidean")) K = np.exp(-1 * (pdx / bandwidth(pdx))**decay) K[K < thresh] = 0 K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data, n_pca=n_pca, knn=knn - 1, decay=decay, bandwidth=bandwidth, random_state=42, thresh=thresh, use_pygsp=True, ) assert isinstance(G2, graphtools.graphs.TraditionalGraph) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G2.W != G.W).sum() == 0 assert (G.W != G2.W).nnz == 0 def bandwidth(x): return np.percentile(x, 10, axis=1) K = np.exp(-1 * (pdx / bandwidth(pdx))**decay) K[K < thresh] = 0 K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data, n_pca=n_pca, knn=knn - 1, decay=decay, bandwidth=bandwidth, random_state=42, thresh=thresh, use_pygsp=True, ) assert isinstance(G2, graphtools.graphs.TraditionalGraph) assert G.N == G2.N np.testing.assert_allclose(G.dw, G2.dw) np.testing.assert_allclose((G2.W - G.W).data, 0, atol=1e-14)
def test_exact_graph_fixed_bandwidth(): decay = 2 knn = None bandwidth = 2 n_pca = 20 pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data) data_nu = pca.transform(data) pdx = squareform(pdist(data_nu, metric="euclidean")) K = np.exp(-1 * (pdx / bandwidth)**decay) K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data, n_pca=n_pca, graphtype="exact", knn=knn, decay=decay, bandwidth=bandwidth, random_state=42, thresh=0, use_pygsp=True, ) assert isinstance(G2, graphtools.graphs.TraditionalGraph) assert G.N == G2.N np.testing.assert_allclose(G.dw, G2.dw) np.testing.assert_allclose((G2.W - G.W).data, 0, atol=1e-14) bandwidth = np.random.gamma(5, 0.5, len(data)) K = np.exp(-1 * (pdx.T / bandwidth).T**decay) K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data, n_pca=n_pca, graphtype="exact", knn=knn, decay=decay, bandwidth=bandwidth, random_state=42, thresh=0, use_pygsp=True, ) assert isinstance(G2, graphtools.graphs.TraditionalGraph) assert G.N == G2.N np.testing.assert_allclose(G.dw, G2.dw) np.testing.assert_allclose((G2.W - G.W).data, 0, atol=1e-14)
def test_knn_interpolate(): G = build_graph(data, decay=None) assert_raises(ValueError, G.interpolate, data) pca_data = PCA(2).fit_transform(data) transitions = G.extend_to_data(data) assert(np.all(G.interpolate(pca_data, Y=data) == G.interpolate(pca_data, transitions=transitions)))
def test_knn_graph(): k = 3 n_pca = 20 pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data) data_nu = pca.transform(data) pdx = squareform(pdist(data_nu, metric="euclidean")) knn_dist = np.partition(pdx, k, axis=1)[:, :k] epsilon = np.max(knn_dist, axis=1) K = np.empty_like(pdx) for i in range(len(pdx)): K[i, pdx[i, :] <= epsilon[i]] = 1 K[i, pdx[i, :] > epsilon[i]] = 0 K = K + K.T W = np.divide(K, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph(data, n_pca=n_pca, decay=None, knn=k - 1, random_state=42, use_pygsp=True) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G.W - G2.W).nnz == 0 assert (G2.W - G.W).sum() == 0 assert isinstance(G2, graphtools.graphs.kNNGraph) K2 = G2.build_kernel_to_data(G2.data_nu, knn=k) K2 = (K2 + K2.T) / 2 assert (G2.K - K2).nnz == 0 assert (G2.build_kernel_to_data( G2.data_nu, knn=data.shape[0]).nnz == data.shape[0] * data.shape[0]) with assert_warns_message( UserWarning, "Cannot set knn ({}) to be greater than " "n_samples ({}). Setting knn={}".format(data.shape[0] + 1, data.shape[0], data.shape[0]), ): G2.build_kernel_to_data( Y=G2.data_nu, knn=data.shape[0] + 1, )
def test_exact_interpolate(): G = build_graph(data, decay=10, thresh=0) with assert_raises_message( ValueError, "Either `transitions` or `Y` must be provided."): G.interpolate(data) pca_data = PCA(2).fit_transform(data) transitions = G.extend_to_data(data) assert np.all( G.interpolate(pca_data, Y=data) == G.interpolate( pca_data, transitions=transitions))
def test_knn_interpolate(): G = build_graph(data, decay=None) with assert_raises_message( ValueError, "Either `transitions` or `Y` must be provided."): G.interpolate(data) pca_data = PCA(2).fit_transform(data) transitions = G.extend_to_data(data) np.testing.assert_equal( G.interpolate(pca_data, Y=data), G.interpolate(pca_data, transitions=transitions), )
def test_exact_graph_anisotropy(): k = 3 a = 13 n_pca = 20 anisotropy = 0.9 data_small = data[np.random.choice(len(data), len(data) // 2, replace=False)] pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data_small) data_small_nu = pca.transform(data_small) pdx = squareform(pdist(data_small_nu, metric="euclidean")) knn_dist = np.partition(pdx, k, axis=1)[:, :k] epsilon = np.max(knn_dist, axis=1) weighted_pdx = (pdx.T / epsilon).T K = np.exp(-1 * weighted_pdx**a) K = K + K.T K = np.divide(K, 2) d = K.sum(1) W = K / (np.outer(d, d)**anisotropy) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data_small, thresh=0, n_pca=n_pca, decay=a, knn=k - 1, random_state=42, use_pygsp=True, anisotropy=anisotropy, ) assert isinstance(G2, graphtools.graphs.TraditionalGraph) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G2.W != G.W).sum() == 0 assert (G.W != G2.W).nnz == 0 with assert_raises_message(ValueError, "Expected 0 <= anisotropy <= 1. Got -1"): build_graph( data_small, thresh=0, n_pca=n_pca, decay=a, knn=k - 1, random_state=42, use_pygsp=True, anisotropy=-1, ) with assert_raises_message(ValueError, "Expected 0 <= anisotropy <= 1. Got 2"): build_graph( data_small, thresh=0, n_pca=n_pca, decay=a, knn=k - 1, random_state=42, use_pygsp=True, anisotropy=2, ) with assert_raises_message(ValueError, "Expected 0 <= anisotropy <= 1. Got invalid"): build_graph( data_small, thresh=0, n_pca=n_pca, decay=a, knn=k - 1, random_state=42, use_pygsp=True, anisotropy="invalid", )
def test_truncated_exact_graph(): k = 3 a = 13 n_pca = 20 thresh = 1e-4 data_small = data[np.random.choice(len(data), len(data) // 2, replace=False)] pca = PCA(n_pca, svd_solver="randomized", random_state=42).fit(data_small) data_small_nu = pca.transform(data_small) pdx = squareform(pdist(data_small_nu, metric="euclidean")) knn_dist = np.partition(pdx, k, axis=1)[:, :k] epsilon = np.max(knn_dist, axis=1) weighted_pdx = (pdx.T / epsilon).T K = np.exp(-1 * weighted_pdx**a) K[K < thresh] = 0 W = K + K.T W = np.divide(W, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph( data_small, thresh=thresh, graphtype="exact", n_pca=n_pca, decay=a, knn=k - 1, random_state=42, use_pygsp=True, ) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G.W != G2.W).nnz == 0 assert (G2.W != G.W).sum() == 0 assert isinstance(G2, graphtools.graphs.TraditionalGraph) G2 = build_graph( pdx, n_pca=None, precomputed="distance", thresh=thresh, decay=a, knn=k - 1, random_state=42, use_pygsp=True, ) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G.W != G2.W).nnz == 0 assert (G2.W != G.W).sum() == 0 assert isinstance(G2, graphtools.graphs.TraditionalGraph) G2 = build_graph( K, n_pca=None, precomputed="affinity", thresh=thresh, random_state=42, use_pygsp=True, ) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G.W != G2.W).nnz == 0 assert (G2.W != G.W).sum() == 0 assert isinstance(G2, graphtools.graphs.TraditionalGraph) G2 = build_graph(W, n_pca=None, precomputed="adjacency", random_state=42, use_pygsp=True) assert G.N == G2.N np.testing.assert_equal(G.dw, G2.dw) assert (G.W != G2.W).nnz == 0 assert (G2.W != G.W).sum() == 0 assert isinstance(G2, graphtools.graphs.TraditionalGraph)
def test_exact_graph(): k = 3 a = 13 n_pca = 20 data_small = data[np.random.choice(len(data), len(data) // 2, replace=False)] pca = PCA(n_pca, svd_solver='randomized', random_state=42).fit(data_small) data_small_nu = pca.transform(data_small) pdx = squareform(pdist(data_small_nu, metric='euclidean')) knn_dist = np.partition(pdx, k, axis=1)[:, :k] epsilon = np.max(knn_dist, axis=1) weighted_pdx = (pdx.T / epsilon).T K = np.exp(-1 * weighted_pdx**a) W = K + K.T W = np.divide(W, 2) np.fill_diagonal(W, 0) G = pygsp.graphs.Graph(W) G2 = build_graph(data_small, thresh=0, n_pca=n_pca, decay=a, knn=k, random_state=42, use_pygsp=True) assert (G.N == G2.N) assert (np.all(G.d == G2.d)) assert ((G.W != G2.W).nnz == 0) assert ((G2.W != G.W).sum() == 0) assert (isinstance(G2, graphtools.graphs.TraditionalGraph)) G2 = build_graph(pdx, n_pca=None, precomputed='distance', decay=a, knn=k, random_state=42, use_pygsp=True) assert (G.N == G2.N) assert (np.all(G.d == G2.d)) assert ((G.W != G2.W).nnz == 0) assert ((G2.W != G.W).sum() == 0) assert (isinstance(G2, graphtools.graphs.TraditionalGraph)) G2 = build_graph(sp.coo_matrix(K), n_pca=None, precomputed='affinity', random_state=42, use_pygsp=True) assert (G.N == G2.N) assert (np.all(G.d == G2.d)) assert ((G.W != G2.W).nnz == 0) assert ((G2.W != G.W).sum() == 0) assert (isinstance(G2, graphtools.graphs.TraditionalGraph)) G2 = build_graph(K, n_pca=None, precomputed='affinity', random_state=42, use_pygsp=True) assert (G.N == G2.N) assert (np.all(G.d == G2.d)) assert ((G.W != G2.W).nnz == 0) assert ((G2.W != G.W).sum() == 0) assert (isinstance(G2, graphtools.graphs.TraditionalGraph)) G2 = build_graph(W, n_pca=None, precomputed='adjacency', random_state=42, use_pygsp=True) assert (G.N == G2.N) assert (np.all(G.d == G2.d)) assert ((G.W != G2.W).nnz == 0) assert ((G2.W != G.W).sum() == 0) assert (isinstance(G2, graphtools.graphs.TraditionalGraph))