Visualization Techniques for Biological Data – tSNE vs

作者:禅与计算机程序设计艺术

1.简介

当今互联网时代给我们带来的最大信息冲击之一就是海量数据正在产生。特别是生物信息学领域的研究者们收集了大量的数据并进行了多方面的分析。如今在这个领域内越来越多的研究者开始从多个角度对这些数据进行可视化,用于了解数据的特性、发现结构性差异等。其中t-SNE(t-Distributed Stochastic Neighbor Embedding)和PCA(Principal Component Analysis)是两种常用的数据降维方法,用于在高维空间中展示数据集的两极分布。本文将详细阐述二者的相关概念及优缺点,以及如何进行两者的选择和使用。并基于实际例子和开源工具包(python实现)给出具体操作步骤,让读者直观感受到不同算法的效果。

2.基本概念术语

2.1 数据表示和特征提取

通常情况下,生物信息学数据往往是高维的,包括样本数量、标记基因数量等指标都在数百到上千个以上。这使得传统的矩阵运算方法在处理这样的数据时变得低效。为了降低数据维度,需要进行特征提取或降维。例如,利用聚类算法将多个样品分成不同类别,或者利用线性判别分析(LDA)等降维手段。特征选择或特征工程是确定最有价值的特征子集或子空间的过程。它是数据预处理阶段的一项重要工作。

2.2 数据降维

数据降维是在计算机领域的一个非常流行的分支。目的在于通过少量、无监督的方式将高维的数据转换为低维的表示形式,进而达到数据可视化的目的。简单来说,数据降维可以把复杂难懂的数据转换成易于理解的图形,从而让人更加容易地理解数据间的联系。数据降维有很多种方法,如主成分分析(PCA),独立成分分析(ICA),核主成分分析(KPCA),局部线性嵌入(LLE),谱嵌入(SE),变换编码(TCA),流形学习(Manifold Learning)等。常用的有t-SNE、PCA、MDS、Isomap等。

2.2.1 PCA

PCA是一种最古老且经典的方法。它是一个线性变换,旨在找到数据方差最大的方向作为新的坐标轴,然后将数据投影到该坐标轴上,以此来保持最大的方差。如下图所示: 假设存在一个一维的直线$y=x+1$,在数据点周围存在一条曲线。如果我们试图将所有的数据点尽可能投射到这条直线上,就可能会失去较长距离上的信息。相反,如果我们将数据点投射到一条曲线上,只会损失某些方差。而PCA正是通过寻找一条曲线,能够最大程度上保留原始数据的信息。PCA还有一些限制条件,比如具有零均值、协方差为单位阵等。因此,PCA通常被认为是一种非线性方法。

2.2.2 t-SNE

t-SNE是另一种流行的数据降维方法。它的基本思想是通过一种称为“概率近似”的分布函数映射高维空间中的数据点到低维空间中的二维位置。它最大的特点在于能够保持全局结构,同时对局部结构也不敏感。概率近似的想法是:对于每一个二维位置,我们都会有一个相应的高维数据点集。通过分析这些点集之间的关系,我们就可以找到一个映射关系,使得它们在低维空间中尽可能紧密分布。如下图所示: t-SNE方法可以看作是改善的PCA,不过它是建立在概率论基础上的。它采用的是多项式分布作为概率分布模型,同时还考虑到了两个高维数据点之间的相似性和距离分布。因此,它更适合于处理大规模数据。但是,它又比PCA更复杂,计算开销也更大。因此,t-SNE通常只用作高维数据的可视化。

2.3 可视化技术

数据可视化技术是利用图形表现形式呈现数据的一种手段。主要分为两种:一是静态图,二是动态图。静态图是以固定的视觉符号显示数据,而动态图则是通过动画、交互、拖放等方式显示变化的图像。通常情况下,静态图用来呈现高层次、抽象的数据,动态图则用来呈现细节、微观数据。静态图常见的有散点图、条形图、热力图、树状图、雷达图、小提琴图、玫瑰图、轮廓图等。动态图常见的有球体图、帕斯卡面图、流场图、轮廓图、迁移图等。

2.4 示例数据集

2.4.1 UCI Human Microarray Dataset

UCI Human Microarray Dataset(HMD)是美国国家科学基金委员会开发的一个用于人类显著性基因标记的数据集。其原始数据为66个显著性基因的表达数据,共计7653个样品,每个样品含有458个标记基因的表达数据。该数据集的目的是为了测试各种机器学习算法在人类基因表达数据上的性能。

2.4.2 Gene Expression Data of Breast Cancer Cells

Breast Cancer Cell Expression Dataset是由欧洲核医学组织和UCSD共同搜集的乳腺癌细胞表达数据集,包含205个样品,共计约145,000个RNA-Seq基因表达量测序数据。目标变量是癌症发生率。该数据集主要用于测试聚类、分类、回归和异常检测等算法。

3.核心算法原理和具体操作步骤

3.1 PCA

PCA,即主成分分析。PCA是一种统计学技术,用于求解方差最大的方向作为新坐标轴。首先,将数据集的特征向量转换到一个新的空间,根据特征向量的长度排列,使得前几个特征向量的作用更大的特征占据更多的空间。然后,将数据投影到这个新坐标系下,得到新的一组数据点,这一组数据点与原来数据点处于同一位置,但具有不同的长度与方向。因此,我们可以把数据压缩到两个维度里,而且每一维的数据都可以反映数据的最大方差。PCA算法的具体操作步骤如下:

3.1.1 数据标准化

标准化是PCA的重要准备步骤,目的是保证数据的方差为1,也就是说,每个特征的方差都是一样的。具体方法是减去均值再除以标准差,即z=(x-μ)/σ。

扫描二维码关注公众号,回复: 17063985 查看本文章

3.1.2 计算协方差矩阵

协方差矩阵C,描述了两个随机变量X和Y的线性关系。C是一个nn的矩阵,其中n为数据集中的样本个数。如果两个变量之间是线性关系,那么对应的Cij就会很大,否则就会很小。 C(i,j)=E[(Xi-E[X])(Yj-E[Y])]

3.1.3 求解方差贡献率

方差贡献率(explained variance ratio)表示了各个特征向量的方差贡献度,我们希望方差贡献率最大的方向作为坐标轴。由于方差总和为1,所以每个特征向量的方差贡献率也是1/n。

3.1.4 对比不同维度下的方差贡献率

确定k维后,我们要做的是找到贡献率最大的k个特征向量,因为这k个特征向量构成了坐标轴。通过交叉验证,我们可以找到最佳的k值。最后,我们对原始数据进行投影,得到k维特征空间中的一组新的样本点。

3.2 t-SNE

t-SNE,即t-Distributed Stochastic Neighbor Embedding,是一种非线性降维技术。它的基本思路是:对于每个高维数据点xi,我们找到一个相邻的数据点xj,并且它们之间的距离(KL散度)服从高斯分布。因此,我们可以找到xi的k临近点yj,这k个yj构成了xi的高斯分布。t-SNE的具体操作步骤如下:

3.2.1 样本标准化

对数据进行标准化是为了防止过大的梯度导致训练困难。

3.2.2 计算KL散度

KL散度,即Kullback-Leibler divergence。它衡量了两个概率分布P和Q之间的差异性。定义为:Dkl(P||Q)=∑pilog(pi/qi)。

3.2.3 拟合高斯分布

拟合高斯分布可以得到数据样本之间的相似性,将样本的高斯分布作为概率分布模型,捕获到样本之间的概率关系。

3.2.4 将样本分布映射到高维空间

利用概率分布之间的关系进行映射,将样本分布映射到高维空间中。最终生成低维空间的数据点。

3.3 Python编程实例

我们可以用scikit-learn库中的t-SNE和PCA实现一下t-SNE和PCA的代码,并对比两种算法的效果。

3.3.1 安装依赖库

!pip install sklearn matplotlib pandas seaborn

3.3.2 使用scikit-learn实现t-SNE

from sklearn.manifold import TSNE
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

data = pd.read_csv('breast_cancer_expression.txt', sep='\t')   #读取数据

X = data[['Gene' + str(i) for i in range(1, 10)]]    #获取特征值

tsne = TSNE(random_state=42)   #实例化t-SNE对象

transformed_X = tsne.fit_transform(X)   #进行转换

plt.scatter(transformed_X[:, 0], transformed_X[:, 1], c=data['target'])   #绘制散点图

plt.xlabel("Dimension 1")
plt.ylabel("Dimension 2")

plt.show()  

运行结果:

可以看到,在这个例子中,t-SNE可以有效地将两类样本分离开来。但是,对于不同的数据集和参数设置,结果可能会有所不同。另外,为了让结果更加清晰,可以添加一些手工调整的参数,比如调整学习速率、初始化方式、迭代次数等。

3.3.3 使用scikit-learn实现PCA

from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

data = pd.read_csv('human_microarray_gene_expression.txt', sep='\t') 

X = data[['Gene' + str(i) for i in range(1, 459)]].values   #获取特征值

pca = PCA(n_components=2)   #实例化PCA对象

transformed_X = pca.fit_transform(X)   #进行转换

plt.scatter(transformed_X[:, 0], transformed_X[:, 1], alpha=.3)   #绘制散点图

plt.xlabel("Dimension 1")
plt.ylabel("Dimension 2")

plt.show() 

运行结果:

可以看到,PCA的结果很难直观地表示数据的结构,并且每一个点的大小代表了方差。另外,PCA也不是完全的非线性变换,所以可能无法很好地捕捉到数据的局部结构。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133566278