Quanto se pode confiar num mapa de PCA (análise de componentes principais), t-SNE (t-distributed stochastic neighbor embedding) ou UMAP (uniform manifold approximation and projection), medido
transform.transform do UMAP; trustworthiness em todo kDos \(k\) vizinhos mais próximos de cada ponto no mapa, quantos eram vizinhos de verdade no espaço original? Os intrusos custam mais quanto mais longe estavam de fato. 1 = nenhum intruso.
A aposta: a distância euclidiana só é confiável localmente. MDS = escalonamento multidimensional; LLE = imersão localmente linear (locally linear embedding).
| método | ideia | situação hoje |
|---|---|---|
| Kernel PCA | PCA no espaço de um núcleo | escolher o núcleo; memória \(O(n^2)\) |
| MDS | manter todas as distâncias | base histórica; aglomeração |
| Isomap | MDS em distâncias no grafo (geodésicas) | atalhos entre camadas |
| LLE / laplaciano do grafo | reconstruções locais / laplaciano | ancestrais do UMAP |
| t-SNE | casar vizinhanças | padrão de visualização desde 2008 |
| UMAP | grafo difuso + layout otimizado | padrão atual em grande escala |
| Autoencoder | uma rede aprende o mapa e o inverso | reversível; ponte para o deep learning |
200 pontos de ruído uniforme em 10 colunas. Um agrupamento k-means avaliado pela silhueta (perto de 1 para grupos separados, perto de 0 quando não há grupos) diz quão "agrupado" parece um conjunto de pontos.
| melhor silhueta | trustworthiness | |
|---|---|---|
| o próprio ruído de 10 colunas | 0,09 | |
| o mapa t-SNE dele, perplexidade 30 | 0,38 | 0,86 |
| ruído de 4 colunas, mapa t-SNE | 0,43 | 0,97 |
A perda depende só das distâncias no mapa: girá-lo ou espelhá-lo não muda nada. Dígitos, inicialização aleatória, semente 0 contra as sementes 1, 2 e 3:
1,0; 0,0; 0,1
a semente 2 saiu girada de um quarto de volta
90%, 94%, 85%
no ruído: só 47%
init="pca" (o padrão) torna o mapa reprodutível, o que não é o mesmo que estável.Os dígitos: o UMAP ajustado em 80% das imagens e depois reducer.transform nos outros 20%.
hasattr(PCA(), "transform") # True
hasattr(TSNE(), "transform") # False
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=0).fit(X_tr)
E_te = reducer.transform(X_te) # 360 imagens novas, o mesmo mapa
sem transform: acrescentar pontos exige recalcular o mapa inteiro, o que mexe também nos pontos antigos
Trustworthiness nos dígitos, para vizinhanças de tamanho \(k\):
| k=5 | k=30 | k=100 | |
|---|---|---|---|
| PCA | 0,830 | 0,830 | 0,835 |
| t-SNE | 0,995 | 0,985 | 0,963 |
| UMAP | 0,989 | 0,983 | 0,961 |
O t-SNE parte os 1 em ilhas e corta o rocambole em pedaços. Não há vencedor até você dizer qual escala lhe interessa.
| para afirmar que... | meça |
|---|---|
| \(k\) componentes guardam quase tudo | a variância explicada acumulada; o erro de reconstrução |
| o mapa mantém os vizinhos de cada ponto | a trustworthiness, em mais de um \(k\) (aleatório ≈ 0,5) |
| os grupos do mapa existem | um agrupamento no espaço original; uma comparação nula |
| a figura é estável | a sobreposição de vizinhos entre sementes, perplexidades, amostras |
| o mapa funciona em dados novos | transform (PCA, UMAP), avaliado em linhas separadas |
X, y, X_new, maps, reducer dos passos 1 a 4.n_neighbors, min_dist, imagens novas · 8. testar uma afirmação proibida.Ritmo: passo 5 e a primeira simulação em 8 min; passo 6 em 5 min; passo 7 e a segunda simulação em 12 min; passo 8 em 5 min.