Tengo una matriz de 336x256 números en coma flotante (336 genomas bacterianos (columnas) x 256 frecuencias normalizadas de tetranucleótidos (filas), es decir, cada columna suma 1).
Obtengo buenos resultados cuando realizo mi análisis utilizando el análisis de componentes principales. Primero calculo las agrupaciones de kmeans en los datos, luego ejecuto un ACP y coloreo los puntos de datos basándome en la agrupación inicial de kmeans en 2D y 3D:
library(tsne)
library(rgl)
library(FactoMineR)
library(vegan)
# read input data
mydata <-t(read.csv("freq.out", header = T, stringsAsFactors = F, sep = "\t", row.names = 1))
# Kmeans Cluster with 5 centers and iterations =10000
km <- kmeans(mydata,5,10000)
# run principle component analysis
pc<-prcomp(mydata)
# plot dots
plot(pc$x[,1], pc$x[,2],col=km$cluster,pch=16)
# plot spiderweb and connect outliners with dotted line
pc<-cbind(pc$x[,1], pc$x[,2])
ordispider(pc, factor(km$cluster), label = TRUE)
ordihull(pc, factor(km$cluster), lty = "dotted")
# plot the third dimension
pc3d<-cbind(pc$x[,1], pc$x[,2], pc$x[,3])
plot3d(pc3d, col = km$cluster,type="s",size=1,scale=0.2)
Pero cuando intento cambiar el PCA por el método t-SNE, los resultados son muy inesperados:
tsne_data <- tsne(mydata, k=3, max_iter=500, epoch=500)
plot(tsne_data[,1], tsne_data[,2], col=km$cluster, pch=16)
ordispider(tsne_data, factor(km$cluster), label = TRUE)
ordihull(tsne_data, factor(km$cluster), lty = "dotted")
plot3d(tsne_data, main="T-SNE", col = km$cluster,type="s",size=1,scale=0.2)
Mi pregunta aquí es por qué la agrupación kmeans es tan diferente de lo que calcula t-SNE. Habría esperado una separación aún mejor entre los conglomerados de lo que hace el PCA, pero a mí me parece casi aleatoria. ¿Sabéis a qué se debe? ¿Me falta un paso de escala o algún tipo de normalización?
4 votos
Tenga en cuenta que, también con el PCA, a menudo no obtendrá resultados tan "buenos" como los que ha obtenido. Agrupar muchas características y luego proyectar las agrupaciones en el subespacio de sólo unos pocos primeros PC puede mostrar una imagen como la que obtuvo aquí para t-SNE, a menos que esos PCS capturen casi toda la variabilidad. ¿Ha comparado qué parte de la variabilidad capturan sus 3 primeros PC y sus 3 primeras dimensiones t-SNE?
2 votos
Más trivialmente, ¿has probado con más iteraciones?
2 votos
He jugado con las iteraciones con hasta 2000 y también he jugado con varios ajustes de perplejidad, pero nunca he visto algo ni siquiera cercano al rendimiento que muestra el PCA.
1 votos
¿Has probado a ajustar la perplejidad?
0 votos
Debe intentar utilizar una perplejidad mayor que dé como resultado un menor número de conglomerados. Además, yo intentaría crear un mapa para los 256 atributos utilizando la tabla de datos transpuesta. Si el mapa de atributos es una nube aleatoria, el mapa PCA podría ser menos fiable. Otra forma de validar PCA o tSNE es crear un mapa para un subconjunto de sus datos, digamos un solo cluster creado con kmean. Ese mapa debería ser similar al fragmento del mapa creado para todo el conjunto de datos.
0 votos
El paquete R "tsne" contiene en realidad un pequeño error. Y puede solucionarlo con la función fix(tsne). ![introduzca aquí la descripción de la imagen](http://i.stack.imgur.com/rS0kM.jpg) \ Arréglalo así: ![introduzca aquí la descripción de la imagen](http://i.stack.imgur.com/QSYiM.jpg) \
1 votos
TSNE tiene una perplejidad teórica óptima que minimiza la divergencia KL entre sus datos en sus dimensiones original y proyectada. ¿Ha intentado primero hacer una búsqueda en cuadrícula para la perplejidad? Por ejemplo, 10,20,30,40,etc.
0 votos
Algunas personas de mi laboratorio ejecutan tsne sobre las cargas de las muestras en los primeros componentes principales. Parece funcionar muy bien. Así que para ti:
tsne_data <- tsne(pc$x[,1:3], k=3, max_iter=500, epoch=500)
para los 3 primeros PC