This notebook introduces the basic concepts in order to compute Fermat distance using the Fermat package.
We use a toy data set (the swiss roll) in order to illustrate.
Contents:
o Data generation
o Computing Fermat distance
o Visualization using t-sne
import numpy as np
from scipy.spatial import distance_matrix
from sklearn.manifold import TSNE
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from generate_data import generate_swiss_roll
If you prefer to work without installing Fermat package, then you can import directly the files from the fermat folder
#import sys
#path_to_FermatFolder = '/home/facu/Dropbox/Repositorios/Fermat-distance'
#sys.path.append(path_to_FermatFolder)
from fermat import Fermat
help(Fermat)
Generate the Swiss Roll data set.
data, labels = generate_swiss_roll(oscilations = 15, A = 3, n = 250)
print('Data dimension:{}'.format(data.shape))
Visualize the data
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.view_init(10, 80)
ax.scatter(xs=data[:,0], ys=data[:,1], zs=data[:,2], c=labels, s=4)
plt.title('Swiss Roll Normals dataset \n N=%s'%(data.shape[0]))
plt.show()
Compute euclidean distances between points in the data set
distances = distance_matrix(data,data)
Parameters
alpha = 3
k = 100
landmarks = 30
%%time
# Initialize the model
f_exact = Fermat(alpha = alpha, path_method='FW')
# Fit
f_exact.fit(np.matrix(distances))
fermat_dist_exact = f_exact.get_distances()
%%time
# Initialize Fermat model
f_aprox_D = Fermat(alpha, path_method='D', k=k)
# Fit
f_aprox_D.fit(np.matrix(distances))
fermat_dist_aprox_D = f_aprox_D.get_distances()
%%time
# Initialize Fermat model
f_aprox_L = Fermat(alpha, path_method='L', k=k, landmarks=landmarks)
# Fit
f_aprox_L.fit(np.matrix(distances))
fermat_dist_aprox_L = f_aprox_L.get_distances()
Visualization for the Fermat distances using t-SNE
tsne_model = TSNE(n_components=2, verbose=0, perplexity=50, n_iter=500)
tsnes = tsne_model.fit_transform(fermat_dist_exact)
plt.scatter(tsnes[:,0],tsnes[:,1], c = labels, s = 5)