Mam macierz liczb zmiennoprzecinkowych 336 x 256 (336 genomów bakteryjnych (kolumny) x 256 znormalizowanych częstotliwości tetranukleotydowych (wiersze), np. Każda kolumna daje 1).
Dobre wyniki uzyskuje się, gdy uruchamiam analizę przy użyciu analizy składników zasadniczych. Najpierw obliczam klastry kmeans na danych, a następnie uruchamiam PCA i koloruję punkty danych na podstawie początkowego klastra kmeans w 2D i 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)
Ale kiedy próbuję zamienić PCA metodą t-SNE, wyniki wyglądają bardzo nieoczekiwanie:
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)
Moje pytanie brzmi: dlaczego grupowanie kmeans jest tak różne od tego, co oblicza t-SNE. Spodziewałbym się jeszcze lepszej separacji między klastrami niż to, co robi PCA, ale wydaje mi się to prawie losowe. Czy wiesz dlaczego tak jest? Czy brakuje mi kroku skalowania lub jakiejś normalizacji?