import itertools
from geometry import (euclidean_distances, assert_allclose, double_center, mds,
mds_randomized, place, eigh)
import numpy as np
[docs]def euclidean_distances_test():
n = 5
P = np.random.rand(3, n)
D = euclidean_distances(P)
assert D.shape == (n, n)
for i, j in itertools.product(range(n), range(n)):
d = np.linalg.norm(P[:, i] - P[:, j])
assert_allclose(d, D[i, j])
[docs]def rank_test():
''' Check that the double-centered matrix has small rank. '''
for n in range(5, 50, 5):
for k in range(1, 5):
P = np.random.rand(k, n)
D = euclidean_distances(P)
B = double_center(D * D)
w, v = eigh(B) #@UnusedVariable
w = w[::-1] # descending
# normalize
wn = w / w[0]
small = np.abs(wn[k])
assert_allclose(0, small, atol=1e-7)
# print('k = %d n = %d small = %s' % (k, n, small))
[docs]def evaluate_error(P1, P2):
D1 = euclidean_distances(P1)
D2 = euclidean_distances(P2)
return np.abs(D1 - D2).mean()
[docs]def mds_test():
for n in [10, 100]:
for k in [3, 4, 5]:
P = np.random.rand(k, n)
D = euclidean_distances(P)
P2 = mds(D, ndim=k)
error = evaluate_error(P, P2)
assert_allclose(0, error, atol=1e-7)
# print('k = %d n = %d mean_error = %s' % (k, n, error))
[docs]def mds_fast_test():
for n in [10, 100]:
for k in [2, 3]:
P = np.random.rand(k, n)
D = euclidean_distances(P)
for algo in [mds, mds_randomized]:
# t0 = time.clock()
P2 = algo(D, ndim=k)
# t1 = time.clock()
#t_mds = t1 - t0
# D2 = euclidean_distances(P2)
error = evaluate_error(P, P2)
assert_allclose(0, error, atol=1e-7)
#print('k = %d n = %d %-20s %7d ms mean_error = %s' %
# (k, n, algo.__name__, t_mds * 1000, error))
[docs]def place_test():
for n in [4, 10]:
for k in [3]:
S = np.random.rand(k, n)
p = np.random.rand(k)
ref = lambda x: np.linalg.norm(p - x)
distances = np.array([ref(S[:, i]) for i in range(n)])
p2 = place(S, distances)
assert_allclose(p, p2)