StatQuest学习笔记16——t-SNE

前言

这一篇笔记是StatQuest系列视频的第46节,它的主要内容是t-SNE,t-SNE是一种对复杂数据的降维分类方法,我最初知道这种方法是在接触质谱流式细胞仪CytoTOF的时候,当时的很多文献对细胞的分类方法都是采用t-SNE,现在很多单细胞测序类文章也会使用t-SNE方法。

t-SNE的基本思想

我们首选看一个t-SNE的图,如下所示:

t-SNE是一种将复杂的高维数据进行降维,同时还保留大量原始数据信息的一种方法。我们先看一个非常简单的案例,在这个案例中,我们将会展示t-SNE如何将一个二维的图形转变为一维图形,如下所示:

通过这个最简单的案例,我们就会了解t-SNE最基本的思想,为处理以后更复杂的数据打下基础。

如果我们把这个二维图中的信息都投射到二维图中的坐标轴上,例如先投射到纵坐标上,那么我们就会得到一些比较杂乱的信息,如下所示:

尤其是纵坐标的上部分,它混合了蓝点与红点的信息,因此,纵坐标上没有保留原始聚类的信息,如下所示:

如果我们把这些聚类的点投射到横坐标上,也会得到一些混乱的信息,如下所示,它也没有很好地保留原始信息:

此时我们可以采用t-SNE来处理这些数据,我们可以把高维的图形(这里是二维图)转换成低维的图形(这里是一维图),从而在低维的图形中仍然保留高维图形中的信息,如下所示:

现在我们讲一下t-SNE是如何实现降维的,如下所示:

第一步,我们首先获得原始的二维散点图,然后把这些点随机地投射到一个数轴上(就是一维坐标),如下所示:

第二步,从这一步开始,t-SNE会移动这些投射到一维坐标上的点,但一次仅移动一个点,直到这些点聚集起来,如下所示:

第三步,在这一步我们可以看一下t-SNE是如何移动第1个点,如下所示:

由于第1个点是红点,它是某个聚类中的一个成员(就是二维图中红色的分类),因此第1个点移动的话,它会移向与它同类的这些点附近,也就是向右移动,如下所示:

与此同时,第1个点右边的2个黄点和1个蓝点(其实就是第1个红点与第2个红点之间的这3个点)在二维图中离得比较远,因此它们会被推回去,如下所示:

因此,在第一次移动的时候,第1个红点移向右边的那三个红点,第1个红点右侧的两个黄点与一个蓝色移到左边,如下所示:

在这个案例中,第1个红点被右侧的3个红点吸引,它的吸引力最强,因此移向右侧(我的理解就是,只看红点,如果把它们聚集起来,必定要移动,我们首先移动的是第1个红点,第2个红点右边是3个红点,因此第1个红点受到的吸引最大),如下所示:

红点移动后就是下面的这个样子(一次移动一个位置):

移动后,第1个点就变成了黄点,如果再次移动的话,黄点的移动就跟前面的红点移动过程一样了,它受到右边三个黄点的吸引,就会移动过去,移动后,红点就又被推了回去,跟前面的原理是一样的,如下所示:

此时,黄点移向右侧,与那三个黄点更加接近,如下所示:

移动后,就成了这个样子(部分叠加起来了),如下所示:

然后不断地重复上述过程,这些不同类型的点就会一点一点聚集起来,如下所示:

先是这样:

然后是这样:

再然后是这样:

最终就成了这个样子:

上面的整个动态过程建议看原视频,讲得很透彻。

t-SNE的原理

前面只是t-SNE的基本思想,我们以最简单的二维降一维的过程看了t-SNE是如何工作的,此时,我们进入t-SNE的具体原理,如下所示:

第一步:计算不同点之间的距离

t-SNE原理的第一步就是计算二维散点图中所有点的“相似性”(similarity),例如,我们先看第1个点(下图黑点)与剩余所有点的相似性,如下所示:

在计算相似性的时候,首先要计算两个点之间的距离,然后绘制出一个正态分布曲线,这个正态分布曲线是以当前的点为中心的(也就是前面的第1个点,黑点),最终,绘制出蓝点到正态分布曲线的距离(就是下图中黑色虚线部分),这个长度就叫非标度相似性(unscaled similarity)(审作者自己提出的这个术语,这样比较方便后续的理解),它的数值就是非标度相似性的值,如下所示:

接着,计算第1个点与下一个点的非标度相似性(unscaled similarity),如下所示:

还有另外的一个点的非标度相似性,如下所示:

在计算第1个点(黑点)与左下方黄点的距离时,通过将黄点投射到正态分布上,我们可以发现,这两个点相似性的数值极低,如下所示:

而在同一个分类中的点,它们的相似性却很高,如下所示:

最终,我们会计算出所有的点与第1个点(黑点)的距离,然后把它们都绘制到正态分布曲线上,随机测量这些点到正态分布曲线上的距离,从而得到非标度相似性得分(unscaled similarity scores),如下所示:

第二步:转换非标度相似性

在这一步中,我们将这些非标度相似性(unscaled similarities)进行缩放(scale),从而使它们加起来等于1,此时我们或许会问,为什么要使它们加起来等于1呢,后面我们会解释,如下所示:

此处解释为什么它们为要加起来等于1,为了更方便地说明这个问题,我们在原有的分类基础上再加上一个分类(原来有3个分类),第4个分类(紫色)的密度是其它分类密度的一半(我的理解就是这个密度是点与点之间的那种远近关系,从图上明显可以看出来,在紫色的分类中,它的4个点之间比较稀疏,而其他的三个分类内的点比较接近,也就是说密度比紫色的高),如下所示:

此时,我们再回到原来的第1个点(为了与后文进行区分,此处命名为黑点A)上来,我们在将黑点A与其它点的距离投射到正态分布曲线上时,正态分布曲线的宽度取决于黑点A与其附近的点的密度(其实可以理解为距离),我们再看一下第4个分类中的黑点(此处命名为黑点B),在将黑点B与其它点的距离投到正态分布曲线上时,我们就可以发现,黑点A所在的正态分布曲线比黑点B所在的正态分布曲线要瘦(也就是前者更窄,表示其密度更大),如下所示:

因此,如果黑点B的密度只有黑点A密度的一半,那么黑点A所有的正态分布曲线的宽度只有黑色点B正态分布曲线宽度的一半,然后对相似性分数(similarity scores)重新进行缩放(scale),就会让这两个分数的值相同,如下所示:

此处解释一下为什么缩放后它们的值为一样。

黑点A所在正态分布曲线(缩写为曲线A)的标准差为1,那么两个蓝点到曲线A的非标度相似性值分别就是0.24和0.05,而黑点B所在正态分布曲线(缩写为曲线B)的标准差为2(这两个紫色点到曲线B的非标度相似性的值就是0.12和0.024,如下所示:

对这些相似性得分(similarity scores)进行缩放(scale),从而使它们加起来1,计算公式与计算结果如下所示:

从上面的计算结果我们可以发现,这两个曲线的两个点结果是一样的。这就表明,在密度相对大的聚类和密度相对小的聚类中,它们的缩放(scale)后的得分是相同的,如下所示:

不过在实际运行中,情况更加复杂,但原理还是一样的。t-SNE有一个困惑度(perplexity)参数,它就相当于期望密度,当使用了这个参数时,对于某些点,这些聚类会比你认为的相似还要“相似”,如下所示:

此时,再回到原始数据,我们已经计算了第1个点(黑点)与其它点的相似性分数(similarity scores)了,如下所示:

接着,我们计算另外一个点与其它点的相似性分数,剩余的点都照此操作,如下所示:

最终我们使用这些全部的相似性分数(similarity scores)来处理这个二维图,如下所示:

由于投射的正态分布曲线的宽度主要取决于某个点与其周围点的密度,因此下图中的黑色点与黄色点的相似性分数和这个色点的分布与黑色点的分布不一样,如下所示:

这个是黑色点到黄色点的相似性分数:

这个是黄色点与原黑色点(现在是蓝色点)的相似性分数,如下所示:

因此,t-SNE会计算这两个点前后两次不同方向的相似性分数的平均值,如下所示:

第三步:相似性分数矩阵

最终,我们会得到一个相似性分数的矩阵,如下所示:

这个矩阵的行与列表示的是某个点(这个点在矩阵中用深色表示)与其它点的相似性分数,红色表示具有高度相似性,白色表示不明显的相似性,如下所示:

此时,我们就计算出了这个二维图的相似性分数,如下所示:

第四步:t分布曲线

现在,我们把这个二维图的点都投射到一个数轴上(一维图),并计算它们的相似性分数,如下所示:

这种计算方法跟前面的类似,还以第1个点为例,计算它与第2个点的距离,然后以这个点为中心画一个t分布曲线,把第2个点投射到这个t分布曲线上来,如下所示:

此处要提一下t分布,这是一种与正态分布类似的分布,它常用于小样本分布检测,t分布的中间要比正态分布低,但它的两侧要比正态分布高,如果样本足够大的时候,t分布就与正态分布非常接近了,t-SNE中的这个t指的就是t分布,如下所示:

因此,使用这个t分布,我们就能像前文提到的那样,计算出这些点的非标度分数,并对这些分数进行归一化处理,如下所示:

最终我们会得到一个相似性分数的矩阵,不过这个矩阵与前面我们使用的原始矩阵相比,它显得不是那么整齐,比较混乱,如下所示:

我们最终的目标就是想要把数轴中第1个点向右移动,移动的结果就像右侧的矩阵那样,如下所示:

t-SNE一次只移动一个位置,并且每次它会选择一个方向,从而使左侧的矩阵更像右侧的矩阵,如下所示:

t-SNE使用小步移动(small steps,我的理解就是一次移一个位置),就像下国际象棋一样,它不能一次就移动到位,如下所示:

最后,我们要讲一下,我为什么前面要使用t分布来计算相似分数,因为如果不使用t分布,这些聚类就会挤成一堆,很难观察这些聚类的效果(不是特别的懂,个人理解就是,如果你使用正态分布,这三个聚类的点最终就会挤成一个,你就无法直观地观察几个数据点的分布了,使用t分布就能避免这个问题,因为t分布毕竟比正态分布要松散一些),如下所示: