Création des données simulées
Dans un premier temps, j’ai créé des données simulées multivariées à deux dimensions, qui sont des réalisations d’un mélange de deux variables aléatoires Gaussiennes multivariées, de sorte à obtenir deux beaux groupes de 500 points. Les deux variables sont standardisées.
set.seed(1234) # Set random seed if you want the same data
n <- 1000
x <- tibble(
x1 = scale(c(rnorm(n/2, -1.5, 1.1), rnorm(n/2, 1.5, 0.8))),
x2 = scale(c(rnorm(n/2, 1.5, 1.1), rnorm(n/2, -1.5, 0.8))),
group = rep(c("group1", "group2"), each = n/2)
)
Ces deux groupes sont représentés, dans leur espace d’origine, sur le graphe ci-après.
ggplot(x, aes(x1, x2, color = group)) +
geom_point() +
coord_equal()
Application de t-SNE
La méthode t-SNE est ensuite appliquée sur les données en deux dimensions avec des paramètres classiques. On remarque que l’application de cette méthode est conditionnée au choix de (beaucoup de) paramètres :
- le paramètre de perplexité (qui contrôle le nombre de voisins considérés par la méthode lors de la construction des dimensions),
- le paramètre \(\theta\), qui permet d’accélérer la méthode au détriment de la “précision” du résultat,
- le paramètre \(\eta\), contrôlant le “taux d’apprentissage”,
- le facteur d’exagération, utilisé dans la première phase de l’algorithme,
- etc.
Même si la plupart de ces paramètres sont bornés, ce n’est pas facile de choisir des valeurs de travail sur des critères objectifs. Pour cet exemple, j’ai choisi des valeurs “classiquement utilisées”.
onlyx1x2 <- x %>%
select(x1, x2)
set.seed(567)
tsne_out <- Rtsne( # Run TSNE
onlyx1x2,
pca = FALSE,
perplexity = 75,
theta = 0,
exaggeration_factor = 20,
eta = 50)
Y <- data.frame(
Y = tsne_out$Y,
group = x$group)
Les deux dimensions t-SNE obtenues sont représentées ci-après, les points étant colorés en fonction du groupe d’origine du point. On remarque la forme biscornue (et complètement gratuite) d’un des deux groupes.
ggplot(Y, aes(Y.1, Y.2, color = group)) +
geom_point() +
coord_equal()
Comparaison des distances
On calcule dans un deuxième temps les distances entre toutes les paires de points dans l’espace d’origine et dans l’espace défini par les dimensions “t-SNE” et on représente l’une en fonction de l’autre sur le graphe suivant. On remarque qu’il existe une certaine relation entre les deux mais que cette relation n’a rien de déterministe et qu’elle n’est surtout pas linéaire.
dx <- dist(onlyx1x2, upper = TRUE)
dy <- dist(tsne_out$Y, upper = TRUE)
dat.dist <- tibble(dx = as.vector(dx), dy= as.vector(dy))
ggplot(dat.dist, aes(dx, dy)) +
geom_hex() +
scale_fill_distiller(palette = "Spectral") +
labs(x = "Distances dans l'espace d'origine",
y = "Distance dans l'espace t-SNE")
Calculer la “taille” des clusters
Enfin, pour calculer la “taille” des clusters, on se base sur la “surface” occupée par les nuages de points associés aux deux “clusters”. Pour cela, on suit le protocole suivant :
- Les dimensions t-SNE sont standardisées, pour pouvoir avoir des valeurs d’aires comparables entre l’espace d’origine et l’espace t-SNE,
- Un algorithme des \(k\)-moyennes (avec \(k = 2\)) est appliqué pour identifier les deux clusters,
- Un polygone non-convexe est estimé autour des deux clusters (à l’aide d’enveloppes \(\alpha\)).
Cette procédure est également appliquée sur les données d’origine. Le résultat de ces deux procédures est représenté ci-après.
Le rapport entre les aires dans l’espace d’origine et l’espace t-SNE est :
- 3.38 pour le premier cluster,
- 2.36 pour le second cluster;
et le rapport de la surface du premier cluster sur celle du second cluster est :
- 1.41 dans l’espace d’origine,
- 0.99 dans l’espace t-SNE.