Tengo una matriz de números de punto flotante de 336x256 (336 genomas bacterianos (columnas) x 256 frecuencias tetranucleotídicas normalizadas (filas), por ejemplo, cada columna suma 1).
Obtengo buenos resultados cuando ejecuto mi análisis usando análisis de componentes principales. Primero calculo los clusters de kmeans en los datos, luego ejecuto un PCA y colorizo los puntos de datos basados en el clustering inicial de kmeans en 2D y 3D:
library(tsne)
library(rgl)
library(FactoMineR)
library(vegan)
# leer datos de entrada
mydata <-t(read.csv("freq.out", header = T, stringsAsFactors = F, sep = "\t", row.names = 1))
# Kmeans Cluster con 5 centros e iteraciones =10000
km <- kmeans(mydata,5,10000)
# ejecutar análisis de componentes principales
pc<-prcomp(mydata)
# plotear puntos
plot(pc$x[,1], pc$x[,2],col=km$cluster,pch=16)
# plotear tela de araña y conectar valores atípicos con línea punteada
pc<-cbind(pc$x[,1], pc$x[,2])
ordispider(pc, factor(km$cluster), label = TRUE)
ordihull(pc, factor(km$cluster), lty = "dotted")
# plotear la tercera dimensión
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 con 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é el clustering de kmeans es tan diferente de lo que calcula t-SNE. Habría esperado una separación aún mejor entre los clusters que lo que hace el PCA pero para mí parece casi aleatorio. ¿Sabes por qué es esto? ¿Me estoy perdiendo un paso de escalado o algún tipo de normalización?
4 votos
Tenga en cuenta que con PCA, también, a menudo no obtendrá resultados tan "buenos" como los que le sucedieron obtener. Agrupar en muchas características y luego proyectar los grupos en el subespacio de solo unos pocos primeros CP puede mostrar una imagen como la que obtuvo aquí para t-SNE, - a menos que esos CP capturen casi toda la variabilidad. ¿Comparaste - qué parte de la variabilidad es capturada por tus primeras 3 CP y tus primeras 3 dimensiones t-SNE?
2 votos
Más trivialmente, ¿has intentado más iteraciones?
2 votos
He jugado con las iteraciones hasta 2000 y también he jugado con varios ajustes de perplejidad, pero nunca he visto algo siquiera cercano al rendimiento que muestra el PCA.
1 votos
¿Has intentado ajustar la perplejidad?
0 votos
Deberías intentar usar una perplejidad más grande que resultará en menos número de clústeres. Además, intentaría crear un mapa para los 256 atributos usando la tabla de datos transpuesta. Si el mapa de atributos es un conjunto aleatorio, el mapa de PCA podría ser menos confiable. Otra forma de validar PCA o tSNE es crear un mapa para un subconjunto de tus datos, digamos un solo clúster creado con kmean. Ese mapa debería ser similar al fragmento en el mapa creado para todo el conjunto de datos.
0 votos
El paquete R "tsne" en realidad contiene un pequeño error. Y puedes solucionarlo con la función fix(tsne). ![Entrar imagen aquí](https://i.sstatic.net/rS0kM.jpg)\ Solucionalo de esta manera: ![Entrar imagen aquí](https://i.sstatic.net/QSYiM.jpg)\
1 votos
TSNE tiene un óptimo teórico de perplejidad que minimiza la divergencia KL entre tus datos en sus dimensiones originales y proyectadas. ¿Ya has intentado hacer una búsqueda en grilla para la perplejidad? Por ejemplo, 10, 20, 30, 40, etc.
0 votos
Algunas personas en mi laboratorio ejecutan tsne en las cargas de muestras en los primeros componentes principales. Parece funcionar muy bien. Entonces para ti:
tsne_data <- tsne(pc$x[,1:3], k=3, max_iter=500, epoch=500)
para los primeros 3 PC.