import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
rho = np.pi * np.sqrt(np.linspace(4, 49, 150))
curve_1 = np.row_stack([(rho-1)*np.cos(rho), (rho-1)*np.sin(rho), rho])
curve_2 = np.row_stack([(rho+0)*np.cos(rho), (rho+0)*np.sin(rho), rho])
curve_3 = np.row_stack([(rho+1)*np.cos(rho), (rho+1)*np.sin(rho), rho])
X, Y, color = np.hstack([curve_1, curve_2, curve_3])
plt.scatter(X, Y, c=color)
points = np.column_stack([X, Y])
from scipy.spatial.distance import pdist, squareform
squared_distance = squareform(pdist(points, 'sqeuclidean'))
sigma = 1
W = np.exp(-squared_distance/sigma)
W_without_diag = W - np.diag(W.diagonal())
plt.imshow(W_without_diag, vmin=0, vmax=W_without_diag.max())
plt.colorbar()
from numpy.linalg import svd
D = np.diag(W.sum(axis=1))
L = D - W
U, Sigma, VT = svd(L)
print(Sigma[-10:])
plt.scatter(U[:, -2], U[:, -3], c=color)
from sklearn.datasets import make_moons
points, clusters = make_moons(n_samples=300, noise=0.1)
plt.scatter(points[:, 0], points[:, 1], c=clusters)
from scipy.spatial.distance import pdist, squareform
squared_distance = squareform(pdist(points, 'sqeuclidean'))
sigma = 0.01
W = np.exp(-squared_distance/sigma)
W_without_diag = W - np.diag(W.diagonal())
plt.imshow(W_without_diag, vmin=0, vmax=W_without_diag.max())
plt.colorbar()
from numpy.linalg import svd
D = np.diag(W.sum(axis=1))
L = D - W
U, Sigma, VT = svd(L)
print(Sigma[-10:])
plt.scatter(U[:, -2], U[:, -3], c=clusters)
plt.scatter(points[:, 0], points[:, 1], c=(U[:, -2]<0))