5 votos

¿Por qué t-SNE no puede capturar una estructura de parábola simple?

Como un juguete ejemplo, he utilizado la t-SNE en una simple parábola para tener una representación de la misma en una dimensión.

library(tidyverse)
library(tsne)
theme_set(theme_minimal())

df_parabol <- tibble(x = seq(-5, 5, by = 0.5), y = x^2)
N <- nrow(df_parabol)
colors <- terrain.colors(N)

ggplot(df_parabol) +
  aes(x, y) +
  geom_point(color = colors) +
  geom_text(label = 1:N)

enter image description here

Como t-SNE uso distancias entre los puntos a reducir dimensiones, pensé que me va a terminar con los puntos en una línea con el fin de siguiente de la parábola (es decir, 1 -> 21).

Sin embargo, los puntos no están ordenadas en todos los...

df_tsne <- as.data.frame(tsne(df_parabol, k = 1))

ggplot(df_tsne) +
  aes(V1, 0) +
  geom_point(color = colors) +
  geom_text(label = 1:N)

enter image description here

También he intentado con varios valores de la perplejidad pero tengo los mismos resultados...

df_tsne_cross <- 
  tibble(p = c(2, 4, 10, 30, 50, 90)) %>% 
  mutate(lowdim = map(p, ~ tsne(X = df_parabol,
                                k = 1, perplexity = .)),
         lowdim = map(lowdim, as.data.frame),
         lowdim = map(lowdim, mutate, N = 1:N, col = colors)) %>% 
  unnest()

ggplot(df_tsne_cross) +
  aes(V1, 0) +
  geom_point(aes(color = col)) +
  geom_text(aes(label = N)) +
  scale_color_identity(guide = FALSE) +
  facet_wrap(~ p, scales = "free")

enter image description here

Como una comparación, PCA proyectos de los puntos en el eje y.

¿Tengo que explorar más el espacio de parámetros? No me esperaba mucho de t-SNE? ¿Tiene una explicación? ¿Cuál es la estructura capturado por t-SNE aquí?

10voto

zowens Puntos 1417

Tres observaciones generales:

  1. t-SNE es excelente en la preservación de la estructura de cluster, pero no es muy bueno en la preservación de continuo "colector de estructura". Un famoso juguete ejemplo es el brazo de gitano conjunto de datos, y es bien sabido que el t-SNE tiene problemas de "desenrollar". De hecho, uno puede usar t-SNE para desenrollarlo, pero uno tiene que ser muy cuidadoso con la elección de la optimización de los parámetros: https://jlmelville.github.io/smallvis/swisssne.html.

  2. El uso de 1-dimensional t-SNE en lugar de 2-dimensional es probable que agravar este problema, posiblemente por bastante. Unidimensional de la optimización es más difícil para los t-SNE porque los puntos no tienen las dos dimensiones de espacio de maniobra y tiene que pasar a través de cada uno de los otros durante el gradiente de la pendiente. Dado que todos los pares de puntos se sienten las fuerzas repulsivas en t-SNE, esto puede ser difícil, y puede quedar atrapado en una mala mínimo local.

  3. t-SNE no es muy buena con pequeños conjuntos de datos. A menudo es más fácil para conseguir un buen incrustación de dos millones de puntos que de los veinte puntos. Por defecto la optimización de los parámetros puede ser inapropiado para un pequeño tamaño de la muestra. Y por cierto, la perplejidad más grande que el tamaño de la muestra no hace sentido matemático (no estoy seguro de lo que su paquete de R que está haciendo cuando se establece la perplejidad de más de $N$).

Con todas estas precauciones en mente, si usted es muy cuidadoso con la optimización de los parámetros, se puede administrar para preservar el colector de la estructura del conjunto de datos. Pero esto no es realmente lo que t-SNE.

%matplotlib notebook

import numpy as np
import pylab as plt
import seaborn as sns; sns.set()
from sklearn.manifold import TSNE

x = np.arange(-5, 5.001, .5)[:,None]
y = x**2
X = np.concatenate((x,y),axis=1)

Z = TSNE(n_components=1, method='exact', perplexity=2, 
         early_exaggeration=2, learning_rate=1, 
         random_state=42).fit_transform(X)

plt.figure(figsize=(8,2))
plt.scatter(Z, Z*0, s=400)
for i in range(Z.shape[0]):
    plt.text(Z[i], Z[i]*0, str(i), va='center', ha='center', color='w')
plt.tight_layout()

enter image description here

Era fácil de hacer que funcione con n_components=2, pero como yo sospechaba, n_components=1 requiere algunos retoques con la optimización de los parámetros (early_exaggeration y learning_rate).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X