t-SNE (Incorporação Estocástica de Vizinhos Distribuída em t - t-distributed Stochastic Neighbor Embedding)
Visão geral
t-SNE (incorporação estocástica de vizinhos com distribuição t (t-distributed Stochastic Neighbor Embedding)) é um método de redução de dimensionalidade (dimensionality reduction) não linear usado principalmente para visualizar dados de alta dimensionalidade (por exemplo, 50–10.000+ dimensões) em 2D ou 3D. Seu objetivo definidor é preservar a estrutura de vizinhança local (local neighborhood structure): pontos que estão próximos no espaço original devem permanecer próximos na incorporação (embedding).
t-SNE é amplamente usado para explorar representações de sistemas modernos de aprendizado de máquina (machine learning) (por exemplo, estados ocultos (hidden states) de Redes Neurais (Neural Networks), incorporações de modelos de linguagem (language models), características (features) de modelos de visão (vision models)). Ele é menos adequado para tarefas que exigem fidelidade geométrica global (global geometric fidelity) (por exemplo, preservar distâncias ou ângulos em grande escala).
Na caixa de ferramentas de redução de dimensionalidade, t-SNE é mais frequentemente combinado ou comparado com:
- Análise de Componentes Principais (PCA) (Principal Component Analysis): linear, mais rápida, frequentemente usada como pré-processamento (preprocessing).
- UMAP (Aproximação e Projeção de Variedades Uniformes (Uniform Manifold Approximation and Projection)): não linear, muitas vezes mais rápida e melhor em preservar mais estrutura global.
- PCA com kernel (Kernel PCA): não linear via kernels; mais focada em variância no espaço de características do que em visualização de vizinhança.
Para que t-SNE é (e não é) usado
Usos comuns
- Visualização exploratória de clusters/subpopulações em conjuntos de dados de alta dimensionalidade:
- Imagens (por exemplo, dígitos, rostos)
- Genômica de célula única (células × genes)
- Incorporações de documentos/frases
- Análise de representação de modelos (por exemplo, características da última camada)
- Depuração de espaços de características (feature spaces):
- Verificar se rótulos/classes se separam em incorporações aprendidas
- Detectar efeitos de batch (batch effects) ou mudanças de domínio (domain shifts)
- Comunicar intuições sobre representações aprendidas (com ressalvas cuidadosas)
Não é ideal para
- Afirmações quantitativas sobre tamanhos de cluster, densidades ou distâncias globais
- Comparar distâncias entre grupos muito separados (“o cluster A está duas vezes mais longe de B do que de C” não é algo significativo)
- Reutilização direta como uma incorporação de uso geral para tarefas posteriores (downstream tasks) (a menos que se usem variantes paramétricas)
Intuição central: “casar vizinhanças, não coordenadas”
t-SNE converte distâncias em probabilidades de ser vizinho. Em seguida, encontra um arranjo de baixa dimensionalidade cujas probabilidades de vizinhança sejam semelhantes.
Um modelo mental útil:
- Em alta dimensionalidade, para cada ponto, t-SNE pergunta:
“Quais pontos são meus vizinhos mais próximos, e com que intensidade eu os prefiro?” - Em 2D/3D, ele organiza os pontos para que essas preferências sejam respeitadas o máximo possível.
Como foca em quem está perto de quem, t-SNE pode revelar estrutura local de clusters mesmo quando a geometria global é difícil de preservar.
Fundamentos teóricos (SNE → t-SNE)
t-SNE é um refinamento da Incorporação Estocástica de Vizinhos (Stochastic Neighbor Embedding, SNE). As etapas principais:
1) Construir probabilidades de vizinhança no espaço de alta dimensionalidade
Dado pontos de alta dimensionalidade (x_1, \dots, x_n), definem-se probabilidades condicionais de que (x_j) seja vizinho de (x_i):
[ p_{j|i} = \frac{\exp\left(-|x_i - x_j|^2 / 2\sigma_i^2\right)}{\sum_{k \neq i} \exp\left(-|x_i - x_k|^2 / 2\sigma_i^2\right)} ]
Cada ponto (i) tem sua própria largura de banda (\sigma_i). Isso é crucial: ela se adapta a variações de densidade local.
Em seguida, t-SNE simetriza isso em uma distribuição conjunta:
[ p_{ij} = \frac{p_{j|i} + p_{i|j}}{2n} ]
Interpretação: (p_{ij}) é alto se (i) e (j) são vizinhos próximos no espaço original.
2) Definir probabilidades de vizinhança na incorporação de baixa dimensionalidade
Sejam (y_1, \dots, y_n) a incorporação em 2D/3D. t-SNE define:
[ q_{ij} = \frac{\left(1 + |y_i - y_j|^2\right)^{-1}}{\sum_{k \neq l} \left(1 + |y_k - y_l|^2\right)^{-1}} ]
Isso usa uma distribuição t de Student (Student’s t-distribution) com 1 grau de liberdade (degree of freedom) (equivalente a uma distribuição de Cauchy (Cauchy distribution)) em vez de uma Gaussiana.
Por que a distribuição “t” importa (o problema de aglomeração (crowding problem))
Se você usasse Gaussianas em 2D, pontos moderadamente distantes ainda exerceriam “atração”, dificultando separar clusters: muitos pontos precisam caber em uma área pequena (“aglomeração”).
As caudas pesadas da distribuição t significam:
- Pontos próximos ainda podem ficar muito próximos (alta atração).
- Pontos distantes são empurrados para longe de forma mais eficaz, permitindo separação mais clara.
3) Otimizar via divergência KL
t-SNE minimiza a discrepância entre distribuições de vizinhança usando o objetivo de Kullback–Leibler (Kullback–Leibler):
[ \mathrm{KL}(P | Q) = \sum_{i \neq j} p_{ij} \log \frac{p_{ij}}{q_{ij}} ]
Isso é otimizado usando variantes de Descida do Gradiente (Gradient Descent).
Assimetria importante: KL(P‖Q) penaliza fortemente o caso em que vizinhos no espaço de alta dimensionalidade não são vizinhos no espaço de baixa dimensionalidade. Ele se importa menos se não-vizinhos ficarem relativamente próximos. Esse viés é uma das razões pelas quais t-SNE tende a formar clusters visualmente separados.
Hiperparâmetros-chave e o que eles fazem
Implementações diferentes expõem controles um pouco diferentes, mas estes são os mais importantes na prática.
Perplexidade (mais importante)
A perplexidade (perplexity) controla o número efetivo de vizinhos que cada ponto considera “local”.
- Faixa típica: 5–50
- Padrões comuns: 30
- Regra prática: a perplexidade deve ser menor do que o número de pontos (muitas vezes bem menor), e normalmente você quer (n \gg 3 \times \text{perplexity}).
Intuição:
- Perplexidade baixa (por exemplo, 5–15): enfatiza estrutura muito local; pode fragmentar em muitas pequenas ilhas.
- Perplexidade alta (por exemplo, 30–100): considera vizinhanças mais amplas; pode mesclar clusters pequenos e suavizar a estrutura.
Dica prática: experimente alguns valores (por exemplo, 10, 30, 50) e procure padrões qualitativos estáveis.
Taxa de aprendizado
A taxa de aprendizado (learning rate) controla o tamanho do passo durante a otimização.
- Muito baixa: os pontos se movem lentamente e podem ficar presos em arranjos ruins.
- Muito alta: atualizações instáveis, incorporações “explodidas” ou arranjos ruidosos.
Regras práticas (dependentes da implementação):
- No scikit-learn, uma orientação comum é learning_rate em [100, 1000] para muitos conjuntos de dados, às vezes proporcional a (n).
- Algumas bibliotecas oferecem heurísticas de taxa de aprendizado auto.
Se seu resultado se parece com:
- uma bola apertada: a taxa de aprendizado pode estar baixa demais
- um anel / dispersão explodida: a taxa de aprendizado pode estar alta demais
Número de iterações / épocas
t-SNE é iterativo. Poucas iterações podem produzir separação incompleta; muitas iterações geralmente estabilizam, mas custam tempo.
- Típico: 1000–5000 iterações (depende do tamanho do conjunto de dados e da implementação)
- Sempre verifique diagnósticos de convergência, se disponíveis.
Exagero inicial
A maioria das implementações inclui uma fase de exagero inicial (early exaggeration) em que (p_{ij}) é temporariamente amplificado para ajudar a formar separação grosseira de clusters cedo.
- Exagero mais alto pode aumentar a separação, mas também pode incentivar lacunas artificiais.
- Padrões geralmente são razoáveis; ajuste apenas se você souber o que está fazendo.
Inicialização (aleatória vs PCA)
Como t-SNE é não convexo (non-convex), a inicialização (initialization) importa.
- Inicialização por PCA (PCA init) frequentemente produz orientação global mais estável e reprodutível e pode convergir mais rápido.
- Inicialização aleatória (random init) pode variar mais entre sementes.
Mesmo com inicialização por PCA, múltiplas execuções podem diferir.
Métrica de distância
t-SNE padrão usa distância Euclidiana nos seus vetores de entrada, mas muitos fluxos de trabalho se beneficiam de alternativas dependendo do tipo de dado:
- distância cosseno (cosine distance) para vetores de incorporação (texto, incorporações semânticas)
- distância de correlação (correlation distance) para perfis de expressão gênica
O suporte depende da biblioteca que você usa.
Dicas práticas de fluxo de trabalho (o que funciona bem em projetos reais)
1) Faça pré-processamento e reduza ruído primeiro
t-SNE frequentemente funciona melhor quando você primeiro:
- Padroniza as características (quando fizer sentido)
- Aplica PCA para ~30–100 dimensões antes de t-SNE
Por que PCA primeiro?
- Remove ruído de dados de alta dimensionalidade
- Remove dimensões redundantes
- Torna t-SNE mais rápido e muitas vezes mais estável
Este é um dos “segredos” mais comuns na prática.
2) Execute múltiplas sementes e verifique estabilidade
Um único gráfico de t-SNE pode ser enganoso. Recomendado:
- Rodar 3–10 sementes
- Comparar se as vizinhanças/clusters são consistentes
Se a história muda drasticamente entre execuções, você deve ser cauteloso ao interpretá-la.
3) Use rótulos apenas para avaliação/anotação, não para “validar” estrutura
Tudo bem colorir pontos por rótulos conhecidos, mas evite:
- Afirmar demais sobre clusters “naturais” quando você já coloriu por classe
- Assumir que ilhas não rotuladas correspondem a classes reais sem evidência adicional
4) Considere UMAP para maior velocidade ou mais estrutura global
Se você quer:
- tempos de execução mais rápidos em conjuntos de dados grandes
- um layout global mais significativo
- uma incorporação que às vezes se comporta melhor para tarefas posteriores
…então UMAP (Aproximação e Projeção de Variedades Uniformes) costuma ser uma alternativa forte.
5) Para conjuntos de dados grandes, use implementações aproximadas ou modernas
O t-SNE “vanilla” é (O(n^2)) em memória/tempo se feito de forma ingênua. Implementações práticas usam aproximações:
- t-SNE de Barnes–Hut (Barnes–Hut t-SNE) (comum; escala aproximadamente (O(n \log n)) em 2D)
- t-SNE acelerado por FFT / baseado em interpolação (FFT-accelerated / interpolation-based t-SNE) (por exemplo, métodos no estilo FIt-SNE)
Se você rotineiramente incorpora >100k pontos, escolha uma biblioteca construída para escalar.
Exemplo prático (scikit-learn)
Exemplo: visualizar características de alta dimensionalidade com PCA → t-SNE.
import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
# Data: 1797 samples, 64 features (8x8 images)
X, y = load_digits(return_X_y=True)
# 1) Optional scaling (often helpful for many datasets)
X_scaled = StandardScaler().fit_transform(X)
# 2) PCA pre-reduction (common best practice)
X_pca = PCA(n_components=50, random_state=0).fit_transform(X_scaled)
# 3) t-SNE
tsne = TSNE(
n_components=2,
perplexity=30,
learning_rate="auto", # sklearn heuristic
init="pca",
random_state=0,
)
X_2d = tsne.fit_transform(X_pca)
print(X_2d.shape) # (1797, 2)
Em seguida, você faria um gráfico de dispersão de X_2d colorido por y. Se as classes formarem ilhas separáveis, isso sugere que o espaço de características tem vizinhanças locais por classe.
Guia de interpretação: o que você pode e não pode concluir
Interpretações seguras
- Vizinhanças locais: se A e B estão próximos no gráfico de t-SNE, eles frequentemente estão próximos no espaço original (não é garantido, mas esse é o objetivo da otimização).
- Existência de clusters (qualitativa): ilhas persistentes e estáveis entre sementes/perplexidades muitas vezes indicam agrupamento local significativo.
- Outliers (às vezes): pontos consistentemente isolados podem ser atípicos, estar rotulados incorretamente ou vir de uma subpopulação diferente.
Armadilhas comuns (modos de falha)
1) “Distâncias entre clusters significam algo”
Geralmente não. t-SNE não tenta preservar distâncias globais. Dois clusters parecerem muito distantes não significa necessariamente que sejam muito diferentes — apenas que a incorporação achou conveniente separá-los para satisfazer restrições locais.
2) “Tamanho do cluster equivale ao tamanho/densidade do cluster no espaço original”
t-SNE frequentemente distorce densidades. Um grande “blob” não significa necessariamente alta variância ou muitas amostras; pode refletir a dinâmica de otimização e a distribuição de baixa dimensionalidade de caudas pesadas.
3) Clusters aparentes podem ser artefatos
t-SNE pode produzir ilhas visualmente limpas mesmo quando a estrutura real é mais contínua, especialmente com:
- perplexidade pequena
- exagero inicial forte
- distâncias ruidosas em alta dimensionalidade
Sempre faça checagem cruzada com ferramentas quantitativas (por exemplo, consistência de vizinhos mais próximos no espaço original) ou incorporações alternativas.
4) Execuções diferentes podem gerar layouts diferentes
Como o objetivo é não convexo:
- rotações/espelhamentos são esperados (não têm significado)
- o arranjo de clusters pode mudar
- ocasionalmente, atribuições de vizinhança mudam
Por isso executar múltiplas sementes importa.
5) Efeitos de batch e confundidores
t-SNE separará os dados de acordo com qualquer fonte dominante de variação:
- diferenças de batch / domínio / instrumentação
- artefatos de pré-processamento
- covariáveis de incômodo
Se você observar separação, verifique qual variável está dirigindo isso.
6) Sobreposição de pontos esconde estrutura
Em conjuntos de dados grandes, regiões densas saturam e podem parecer blobs sólidos. Use:
- transparência (alpha)
- marcadores menores
- gráficos de densidade / hexbin
- subamostragem e checagem de preservação de vizinhança
Como ajustar t-SNE na prática
Um ciclo pragmático de ajuste:
- Comece com PCA para 50 dims (ou 30–100 dependendo dos dados).
- Use perplexidade = 30, inicialização por PCA e uma taxa de aprendizado razoável (auto, se disponível).
- Plote e avalie:
- As vizinhanças locais são coerentes?
- Os resultados são estáveis em 2–3 sementes?
- Varra a perplexidade:
- Se parecer muito fragmentado: aumente a perplexidade.
- Se mesclar grupos distintos: diminua a perplexidade.
- Se a incorporação parecer instável ou “explodida”, ajuste a taxa de aprendizado.
Uma checagem de sanidade útil: escolha alguns pontos e calcule seus k vizinhos mais próximos no espaço original, então veja se esses vizinhos aparecem próximos no gráfico de t-SNE.
Variantes e extensões
t-SNE paramétrico
O t-SNE paramétrico (Parametric t-SNE) treina uma rede neural para mapear (x \to y), possibilitando:
- incorporação fora da amostra (out-of-sample) de novos pontos
- inferência potencialmente mais rápida uma vez treinado
Isso é menos comum do que o t-SNE padrão, mas útil em cenários semelhantes a produção.
Diferentes métricas e vizinhos aproximados
Pipelines modernos de t-SNE frequentemente dependem de busca aproximada de vizinhos mais próximos (approximate nearest neighbor search) e métricas de distância alternativas para escalar e combinar melhor com a semântica do domínio (por exemplo, distância cosseno para incorporações).
Relação com PCA e UMAP
t-SNE vs PCA
- PCA preserva estrutura global de variância de forma linear; é rápida e determinística.
- t-SNE preserva vizinhanças locais de forma não linear; é mais lenta e estocástica.
- Prática comum: PCA → t-SNE.
Veja: Análise de Componentes Principais (PCA)
t-SNE vs UMAP
- Ambos são não lineares e baseados em vizinhança.
- UMAP frequentemente preserva mais estrutura global/topológica e escala bem.
- t-SNE pode produzir separação local de clusters muito clara, mas pode ser mais frágil e mais difícil de interpretar globalmente.
Veja: UMAP (Aproximação e Projeção de Variedades Uniformes)
Resumo: checklist de boas práticas
- Faça uso de t-SNE para exploração visual de representações de alta dimensionalidade.
- Faça pré-processamento: escale quando apropriado e então PCA para ~30–100 dims.
- Faça ajuste de perplexidade e execute múltiplas sementes.
- Faça interpretação de vizinhanças locais, não de distâncias globais.
- Não superinterprete espaçamento entre clusters, tamanhos relativos de clusters ou densidade.
- Não trate um único gráfico de t-SNE como prova de clusters discretos — faça checagem cruzada com outras análises.
Quando usado com essas restrições em mente, t-SNE é uma das ferramentas mais eficazes para transformar espaços de características de alta dimensionalidade em uma imagem interpretável — especialmente para entender o que uma representação aprendida por um modelo está fazendo localmente.