t-SNE 与 PCA 使用 R 进行降维有什么问题?

机器算法验证 r 主成分分析 特纳
2022-02-15 10:27:18

我有一个 336x256 浮点数的矩阵(336 个细菌基因组(列)x 256 个归一化的四核苷酸频率(行),例如每列加起来为 1)。

当我使用主成分分析运行分析时,我得到了很好的结果。首先,我计算数据上的 kmeans 聚类,然后运行 ​​PCA 并根据 2D 和 3D 中的初始 kmeans 聚类对数据点进行着色:

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)

在此处输入图像描述

但是当我尝试用 t-SNE 方法交换 PCA 时,结果看起来非常出乎意料:

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)

在此处输入图像描述

我的问题是为什么 kmeans 聚类与 t-SNE 计算的结果如此不同。我本来期望集群之间的分离比 PCA 所做的更好,但它在我看来几乎是随机的。你知道这是为什么吗?我是否缺少缩放步骤或某种标准化?

4个回答

TSNE在使用它之前,您必须了解它的作用。

它首先在基于距离的特征向量之间 构建邻域图。

该图将节点(特征向量)连接到其n最近的节点(根据特征空间中的距离)。n称为perplexity参数。

构建此图的目的植根于 TSNE 依赖于构建其特征向量的新表示的采样类型。

random walk使用TSNE 特征图上的 生成 TSNE 模型构建序列。

根据我的经验……我的一些问题来自于对特征表示如何影响该图的构建的推理。我也玩弄这个perplexity参数,因为它会影响我的采样的集中度。

很难比较这些方法。

PCA 是无参数的。给定数据,您只需要查看主要组件即可。

另一方面,t-SNE 依赖于严格的参数:困惑度、早期夸大、学习率、迭代次数——尽管默认值通常会提供良好的结果。

因此,您不能只比较它们,您必须将 PCA 与您可以使用 t-SNE 获得的最佳结果(或您通过多次尝试 t-SNE 获得的最佳结果)进行比较。否则,就相当于问“为什么我的线性模型比我的(未调整的)梯度提升模型表现更好?”。

编辑在看到许多与这两种方法之间的差异相关的问题后,我写了这篇博文,总结了每种方法的优缺点。

我在一个数据集上运行 t-sne 来替换 PCA,并且(尽管 Rum Wei 注意到了这个错误)得到了更好的结果。在我的应用案例中,粗糙的 pca 效果很好,而粗糙的 t-sne 给了我随机的结果。这是由于 pca 中包含的缩放/居中步骤(默认情况下在大多数包中)但未在 t-sne 中使用。
我的观点是区域,如果没有先前的缩放,它们之间的距离几乎没有意义,它让我从“随机寻找”到“有意义”。

正如 RUser4512 所说,您可能还想测试您的参数。在他的网站上,作者推荐了 5 到 50 之间的困惑度(你的似乎很小),他还警告说,太大的困惑度会给你一个几乎同质的点球体(很高兴知道)。

Distill 有一篇非常好的文章,其中包含一些交互式可视化,确实有助于理解参数的影响。

tSNE 的 PCA 和 SVD 等方法之间的一个重要区别是 tSNE 使用的是非线性尺度。这通常会使绘图在视觉上更加平衡,但要小心地以与 PCA 相同的方式解释它们。这种差异可能解释了上面显示的图之间的差异。

有关解释 tSNE 非线性尺度的更多详细信息,请参阅以下文章:https ://distill.pub/2016/misread-tsne/ (Wattenberg 等人,“如何有效地使用 t-SNE”,Distill, 2016. http://doi.org/10.23915/distill.00002 )

tSNE 数据将混淆“集群”并不意外,因为它们在 PCA 数据中并没有那么明显。例如,集群 2 和 4 中的某些点与集群质心的距离比集群之间的差异更远。使用不同的 k 参数会得到非常不同的聚类结果。除非您有使用 5 个集群的特定生物学原理,否则我建议您使用基于图的或无监督的层次聚类方法。