Created
January 20, 2018 18:17
-
-
Save thechargedneutron/c2f95ac46a9ab61beb0de8a91a9a533f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
from sklearn.neighbors import NearestNeighbors | |
from sklearn import neighbors | |
from sklearn.utils.testing import assert_array_almost_equal | |
def check_precomputed(make_train_test): | |
"""Tests unsupervised NearestNeighbors with a distance matrix.""" | |
# Note: smaller samples may result in spurious test success | |
rng = np.random.RandomState(42) | |
X = rng.random_sample((10, 4)) | |
Y = rng.random_sample((3, 4)) | |
DXX, DYX = make_train_test(X, Y) | |
for method in ['kneighbors']: | |
# TODO: also test radius_neighbors, but requires different assertion | |
# As a feature matrix (n_samples by n_features) | |
nbrs_X = neighbors.NearestNeighbors(n_neighbors=3) | |
nbrs_X.fit(X) | |
dist_X, ind_X = getattr(nbrs_X, method)(Y) | |
# As a dense distance matrix (n_samples by n_samples) | |
nbrs_D = neighbors.NearestNeighbors(n_neighbors=3, algorithm='brute', | |
metric='precomputed') | |
nbrs_D.fit(DXX) | |
dist_D, ind_D = getattr(nbrs_D, method)(DYX) | |
assert_array_almost_equal(dist_X, dist_D) | |
assert_array_almost_equal(ind_X, ind_D) | |
# Check auto works too | |
nbrs_D = neighbors.NearestNeighbors(n_neighbors=3, algorithm='auto', | |
metric='precomputed') | |
nbrs_D.fit(DXX) | |
dist_D, ind_D = getattr(nbrs_D, method)(DYX) | |
assert_array_almost_equal(dist_X, dist_D) | |
assert_array_almost_equal(ind_X, ind_D) | |
# Check X=None in prediction | |
dist_X, ind_X = getattr(nbrs_X, method)(None) | |
dist_D, ind_D = getattr(nbrs_D, method)(None) | |
assert_array_almost_equal(ind_X, ind_D) | |
# Must raise a ValueError if the matrix is not of correct shape | |
assert_raises(ValueError, getattr(nbrs_D, method), X) | |
target = np.arange(X.shape[0]) | |
for Est in (neighbors.KNeighborsClassifier, | |
neighbors.RadiusNeighborsClassifier, | |
neighbors.KNeighborsRegressor, | |
neighbors.RadiusNeighborsRegressor): | |
print(Est) | |
est = Est(metric='euclidean') | |
est.radius = est.n_neighbors = 1 | |
pred_X = est.fit(X, target).predict(Y) | |
est.metric = 'precomputed' | |
pred_D = est.fit(DXX, target).predict(DYX) | |
assert_array_almost_equal(pred_X, pred_D) | |
def test_precomputed_sparse_explicit_diagonal(): | |
def make_train_test(X_train, X_test): | |
nn = NearestNeighbors(n_neighbors=3, radius=10).fit(X_train) | |
return (nn.kneighbors_graph(X_train.copy(), mode='distance'), | |
nn.kneighbors_graph(X_test, mode='distance')) | |
check_precomputed(make_train_test) | |
test_precomputed_sparse_explicit_diagonal() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment