None
Deep CCA (DCCA)¶
In this example, we show how to used Deep CCA to uncover latent correlations between views.
[1]:
from mvlearn.embed import DCCA
from mvlearn.datasets import GaussianMixture
from mvlearn.plotting import crossviews_plot
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Polynomial-Transformed Latent Correlation¶
Latent variables are sampled from two multivariate Gaussians with equal prior probability. Then a polynomial transformation is applied and noise is added independently to both the transformed and untransformed latents.
[3]:
n_samples = 2000
centers = [[0,1], [0,-1]]
covariances = [np.eye(2), np.eye(2)]
GM = GaussianMixture(n_samples, centers, covariances, random_state=42,
shuffle=True, shuffle_random_state=42)
GM = GM.sample_views(transform='poly', n_noise=2)
The latent data is plotted against itself to reveal the underlying distribtution.
[4]:
crossviews_plot([GM.latent, GM.latent], labels=GM.y, title='Latent Variable', equal_axes=True)
The noisy latent variable (view 1) is plotted against the transformed latent variable (view 2), an example of a dataset with two views.
[5]:
# Split data into train and test segments
Xs_train = []
Xs_test = []
max_row = int(GM.Xs[0].shape[0] * .7)
Xs, y = GM.get_Xy(latents=False)
for X in Xs:
Xs_train.append(X[:max_row, :])
Xs_test.append(X[max_row:, :])
y_train = y[:max_row]
y_test = y[max_row:]
[6]:
crossviews_plot(Xs_test, labels=y_test, title='Testing Data View 1 vs. View 2 (Polynomial Transform + noise)', equal_axes=True)
Fit DCCA model to uncover latent distribution¶
The output dimensionality is still 4.
[7]:
# Define parameters and layers for deep model
features1 = Xs_train[0].shape[1] # Feature sizes
features2 = Xs_train[1].shape[1]
layers1 = [1024, 512, 4] # nodes in each hidden layer and the output size
layers2 = [1024, 512, 4]
dcca = DCCA(input_size1=features1, input_size2=features2, n_components=4,
layer_sizes1=layers1, layer_sizes2=layers2)
dcca.fit(Xs_train)
Xs_transformed = dcca.transform(Xs_test)
Visualize the transformed data¶
We can see that it has uncovered the latent correlation between views.
[8]:
crossviews_plot(Xs_transformed, labels=y_test, title='Transformed Testing Data View 1 vs. View 2 (Polynomial Transform + noise)', equal_axes=True)
Sinusoidal-Transformed Latent Correlation¶
Following the same procedure as above, latent variables are sampled from two multivariate Gaussians with equal prior probability. This time, a sinusoidal transformation is applied and noise is added independently to both the transformed and untransformed latents.
[9]:
n = 2000
mu = [[0,1], [0,-1]]
sigma = [np.eye(2), np.eye(2)]
class_probs = [0.5, 0.5]
GM = GaussianMixture(mu,sigma,n,class_probs=class_probs, random_state=42,
shuffle=True, shuffle_random_state=42)
GM = GM.sample_views(transform='sin', n_noise=2)
[10]:
# Split data into train and test segments
Xs_train = []
Xs_test = []
max_row = int(GM.Xs[0].shape[0] * .7)
for X in GM.Xs:
Xs_train.append(X[:max_row, :])
Xs_test.append(X[max_row:, :])
y_train = GM.y[:max_row]
y_test = GM.y[max_row:]
[11]:
crossviews_plot(Xs_test, labels=y_test, title='Testing Data View 1 vs. View 2 (Polynomial Transform + noise)', equal_axes=True)
Fit DCCA model to uncover latent distribution¶
The output dimensionality is still 4.
[12]:
# Define parameters and layers for deep model
features1 = Xs_train[0].shape[1] # Feature sizes
features2 = Xs_train[1].shape[1]
layers1 = [1024, 512, 4] # nodes in each hidden layer and the output size
layers2 = [1024, 512, 4]
dcca = DCCA(input_size1=features1, input_size2=features2, n_components=4,
layer_sizes1=layers1, layer_sizes2=layers2)
dcca.fit(Xs_train)
Xs_transformed = dcca.transform(Xs_test)
Visualize the transformed data¶
We can see that it has uncovered the latent correlation between views.
[13]:
crossviews_plot(Xs_transformed, labels=y_test, title='Transformed Testing Data View 1 vs. View 2 (Sinusoidal Transform + noise)', equal_axes=True)