Source code for ngclearn.utils.viz.dim_reduce
import matplotlib #.pyplot as plt
matplotlib.use('Agg')
import matplotlib.pyplot as plt
cmap = plt.cm.jet
import numpy as np
from sklearn.decomposition import IncrementalPCA
from sklearn.manifold import TSNE
[docs]
def extract_pca_latents(vectors): ## PCA mapping routine
"""
Projects collection of K vectors (stored in a matrix) to a two-dimensional (2D)
visualization space via principal components analysis (PCA). Note that
if the input already has a 2D dimensionality, the original input is returned.
Args:
vectors: a matrix/codebook of (K x D) vectors to project
Returns:
a matrix (K x 2) of projected vectors (to 2D space)
"""
batch_size = 50
z_dim = vectors.shape[1]
z_2D = None
if z_dim != 2:
ipca = IncrementalPCA(n_components=2, batch_size=batch_size)
ipca.fit(vectors)
z_2D = ipca.transform(vectors)
else:
z_2D = vectors
return z_2D
[docs]
def extract_tsne_latents(vectors, perplexity=30, n_pca_comp=32): ## tSNE mapping routine
"""
Projects collection of K vectors (stored in a matrix) to a two-dimensional (2D)
visualization space via the t-distributed stochastic neighbor embedding
algorithm (t-SNE). This algorithm also uses PCA to produce an
intermediate project to speed up the t-SNE final mapping step. Note that
if the input already has a 2D dimensionality, the original input is returned.
Args:
vectors: a matrix/codebook of (K x D) vectors to project
perplexity: the perplexity control factor for t-SNE (Default: 30)
Returns:
a matrix (K x 2) of projected vectors (to 2D space)
"""
batch_size = 500 #50
z_dim = vectors.shape[1]
z_2D = None
if z_dim != 2:
print(" > Projecting latents via iPCA...")
n_comp = n_pca_comp #32 #10 #16 #50
if n_comp > batch_size:
batch_size = n_comp
if vectors.shape[1] < n_comp:
n_comp = vectors.shape[1] - 2 #z_top.shape[1]-2
n_comp = max(2, n_comp)
ipca = IncrementalPCA(n_components=n_comp, batch_size=batch_size)
ipca.fit(vectors)
z_2D = ipca.transform(vectors)
print(" PCA.lat.shape = ",z_2D.shape)
print(" > Finishing projection via t-SNE...")
z_2D = TSNE(n_components=2,perplexity=perplexity, verbose=1).fit_transform(z_2D)
else:
z_2D = vectors
return z_2D
[docs]
def plot_latents(code_vectors, labels, plot_fname="2Dcode_plot.jpg", alpha=1.):
"""
Produces a label-overlaid (label map to distinct colors) scatterplot for
visualizing two-dimensional latent codes (produced by either PCA or t-SNE).
Args:
code_vectors: a matrix of shape (K x 2) with vectors to plot/visualize
labels: label values, either of shape (K x 1) of integer values or of
shape (K x C) of binary one-hot encodings where C is the number of
classes.
plot_fname: /path/to/plot_fname.<suffix> for saving the plot to disk
"""
print(" > Plotting 2D latent encodings...")
lab = labels
if lab.shape[1] > 1: ## extract integer class labels from a one-hot matrix
lab = np.argmax(lab, 1)
plt.figure(figsize=(8, 6))
plt.scatter(code_vectors[:, 0], code_vectors[:, 1], c=lab, cmap=cmap, alpha=alpha)
plt.colorbar()
plt.grid()
plt.savefig("{0}".format(plot_fname), dpi=300)
plt.clf()