详解 R 语言的PCA与TSNE的降维聚类

为了查看降维聚类的可视化效果,我们先用相似样本降维聚类,然后使用具有差异的样本查看聚类效果。

同时使用 PCA 与 TSNE 来观察两种不同方法的聚类效果。

一、相似样本的降维聚类

1、载入所需的包
rm(list=ls())
library(pheatmap)
library(Rtsne)
library(ggfortify)
library(mvtnorm)
2、构建两个相似样本数据集
# 生成数据(随机)================================
# 设置基因数和细胞数
gene_num=100
cell_num=50
# 设置两个正态分布的随机矩阵(100*50)  作为两个样本矩阵
sample1=rnorm(gene_num*cell_num);
# 生成 100 基因,50 细胞的表达矩阵
dim(sample1)=c(gene_num,cell_num)
# 生成第二个样本
sample2=rnorm(gene_num*cell_num);dim(sample2)=c(gene_num,cell_num)
# 将两个样本合并为一个表达矩阵
sample_all=cbind(sample1,sample2)
# 添加列名
colnames(sample_all)=c(paste0('sample1_cell_',1:cell_num),
               paste0('sample2_cell_',1:cell_num))
# 添加行名
rownames(sample_all)=paste('gene_',1:gene_num,sep = '')

image.png

3、绘制热图
pheatmap(sample_all)

可以看到,由于数据随机分布,绘制热图发现两种数据并没有明显分组。
image.png

4、绘制PCA
# 画pca===============================================
# 转置,让行为样本
sample_all=t(sample_all)
# 添加样本分组信息
df=cbind(as.data.frame(sample_all),group=c(rep('group1',20),rep('group2',20)))
# prcomp()主成分分析
pca_dat <- prcomp( df[,1:(ncol(df)-1)] )
autoplot(pca_dat, data=df,colour = 'group')+theme_bw()

image.png
同样可以看到,两组数据的随机分布,导致组间数据并不能有效的分为两群,而是你中有我,我中有你的状态。
image.png

5、绘制TSNE
set.seed(123123)
sample_all=t(sample_all)
tsne_out <- Rtsne(sample_all,pca=FALSE,perplexity=10,theta=0.0)
# 获取tSNE的坐标值
str(tsne_out)
# 其中在Y中存储了画图坐标
tsnes=tsne_out$Y
colnames(tsnes) <- c("tSNE1", "tSNE2") #为坐标添加列名
# 在此基础上添加颜色分组信息,首先还是将tsnes这个矩阵变成数据框,然后增加一列group信息,最后映射在geom_point中
tsnes=as.data.frame(tsnes)
group=c(rep('group1',cell_num),rep('group2',cell_num))
tsnes$group=group
ggplot(tsnes, aes(x = tSNE1, y = tSNE2))+ geom_point(aes(col=group))

TSNE 与 PCA 是同样的展示效果,也就是说如果分析数据的变量之间没有明显的区别,利用不用的聚类手段或可视化方法,我们也不能将其分为不同群体。

在机器学习中,我们可以利用一些特征挑选手段实现相似数据间的分类,今后再讨论这种情况。

image.png

二、差异样本的降维聚类

1、构建第三个具有差异的数据集

为了查看并比较数据间的差异,我们构建一个随机分布,为每个值加 2,也就是说,中轴线向X轴正方向移动 2 个单位,得到一个新的数据集。

# 第三个样本中表达量每个值加2
sample3=rnorm(gene_num*cell_num)+2;dim(sample3)=c(gene_num,cell_num)

sample_all=cbind(sample_all,sample3)
colnames(a3)=c(paste0('cell_01_',1:nc),paste0('cell_02_',1:nc))
rownames(a3)=paste('gene_',1:ng,sep = '')

image.png

2、绘制热图
pheatmap(sample_all)

绘制热图,可以明显发现第三个数据集区别与我们之间构建的那两个数据集。这种图应用于实际中就显示出该组数据的异质性。比如,左图是癌症患者的某些基因表达值,区别于右边两个患者的正常表达基因。
image.png

3、绘制PCA
sample_all=t(sample_all);
dim(sample_all)
df=cbind(as.data.frame(a3),group=c(rep('group1',20),rep('group2',20)))
autoplot(prcomp( df[,1:(ncol(df)-1)] ), data=df,colour = 'group')+theme_bw()

image.png
PCA 后我们可以看到,分组极其明显。与前两组相比,新构建的第三个数据集明显分在另一组。比如,该图用于查看测序数据组间是否有差异,样本是否有污染等。而且由于是根据距离公式计算,因此在图中,点之间的距离一定程度也展示了组内或组间不同样本的相似性或异质性。
image.png

4、绘制TSNE
set.seed(123123)
tsne_out <- Rtsne(sample_all,pca=FALSE,perplexity=10,theta=0.0)
tsnes=tsne_out$Y
colnames(tsnes) <- c("tSNE1", "tSNE2")
tsnes=as.data.frame(tsnes)
group=c(rep('group1',cell_num),rep('group2',cell_num),rep('group3',cell_num))
tsnes$group=group
ggplot(tsnes, aes(x = tSNE1, y = tSNE2))+ geom_point(aes(col=group))

TSNE 图与 PCA 图同样展示出三组样本间的差异。一般用于单细胞测序的细胞聚类,但是与 PCA 不同的是,TSNE 图一般是由三维空间映射到二维平面的成像,所以,组间的距离并不能真实反映样本数据间的差异性。
image.png

全部代码

rm(list=ls())
library(pheatmap)
library(Rtsne)
library(mvtnorm)

# 生成数据(随机)================================
# 设置基因数和细胞数
gene_num=100
cell_num=50
# 设置两个正态分布的随机矩阵(100*50)  作为两个样本矩阵
sample1=rnorm(gene_num*cell_num);
# 生成 100 基因,50 细胞的表达矩阵
dim(sample1)=c(gene_num,cell_num)
# 生成第二个样本
sample2=rnorm(gene_num*cell_num);dim(sample2)=c(gene_num,cell_num)
# 将两个样本合并为一个表达矩阵
sample_all=cbind(sample1,sample2)
# 添加列名
colnames(sample_all)=c(paste0('sample1_cell_',1:cell_num),
               paste0('sample2_cell_',1:cell_num))
# 添加行名
rownames(sample_all)=paste('gene_',1:gene_num,sep = '')

# 绘制热图==============================================
pheatmap(sample_all)

# 绘制pca===============================================
# 转置,让行为样本
sample_all=t(sample_all)
# 添加样本分组信息
df=cbind(as.data.frame(sample_all),group=c(rep('group1',cell_num),rep('group2',cell_num)))
# prcomp()主成分分析
pca_dat <- prcomp( df[,1:(ncol(df)-1)] )
autoplot(pca_dat, data=df,colour = 'group')+theme_bw()


# 绘制tsne=============================================
# 进行tSNE
set.seed(123123)
sample_all=t(sample_all)
tsne_out <- Rtsne(sample_all,pca=FALSE,perplexity=10,theta=0.0)
# 获取tSNE的坐标值
str(tsne_out)
# 其中在Y中存储了绘制图坐标
tsnes=tsne_out$Y
colnames(tsnes) <- c("tSNE1", "tSNE2") #为坐标添加列名
# 在此基础上添加颜色分组信息,首先还是将tsnes这个矩阵变成数据框,然后增加一列group信息,最后映射在geom_point中
tsnes=as.data.frame(tsnes)
group=c(rep('group1',cell_num),rep('group2',cell_num))
tsnes$group=group
ggplot(tsnes, aes(x = tSNE1, y = tSNE2))+ geom_point(aes(col=group))
dev.off()
dev.new()

# 构建随机数据集==================================================
# 第三个样本中表达量每个值加2
sample3=rnorm(gene_num*cell_num)+2;dim(sample3)=c(gene_num,cell_num)
colnames(sample3)=c(paste0('sample3_cell_',1:cell_num))
rownames(sample3)=paste('gene_',1:gene_num,sep = '')
sample_all=cbind(sample_all,sample3)
# 绘制热图 =========================================================
pheatmap(sample_all)

# 绘制PCA ==========================================================
sample_all=t(sample_all);
dim(sample_all)
df=cbind(as.data.frame(sample_all),group=c(rep('group1',cell_num),rep('group2',cell_num),rep('group3',cell_num)))
autoplot(prcomp( df[,1:(ncol(df)-1)] ), data=df,colour = 'group')+theme_bw()

# 绘制tSNE=========================================================
set.seed(123123)
tsne_out <- Rtsne(sample_all,pca=FALSE,perplexity=10,theta=0.0)
tsnes=tsne_out$Y
colnames(tsnes) <- c("tSNE1", "tSNE2")
tsnes=as.data.frame(tsnes)
group=c(rep('group1',cell_num),rep('group2',cell_num),rep('group3',cell_num))
tsnes$group=group
ggplot(tsnes, aes(x = tSNE1, y = tSNE2))+ geom_point(aes(col=group))
  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
降维聚类图是一种利用降维技术和聚类算法进行数据可视化的方法。Python提供了多种库和工具来实现降维聚类操作,例如scikit-learn和matplotlib等。 首先,我们需要使用适当的降维算法将高维数据转化为低维表示。常用的降维方法包括主成分分析(PCA)和线性判别分析(LDA)。通过对数据进行降维,可以减少不相关的维度,提取主要的特征信息。 接下来,我们可以使用聚类算法对降维后的数据进行聚类操作。常见的聚类算法包括K均值聚类和层次聚类等。这些算法可以根据数据的相似性将其划分为不同的群组或簇。 在Python中,我们可以使用scikit-learn库中的`PCA`类来进行降维操作,例如: ```python from sklearn.decomposition import PCA pca = PCA(n_components=2) # 指定降维后的特征维数为2 low_dim_data = pca.fit_transform(data) # 对数据进行降维 ``` 接着,我们可以使用scikit-learn库中的`KMeans`类来进行聚类操作,例如: ```python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3) # 指定聚类的簇数为3 kmeans.fit(low_dim_data) # 对降维后的数据进行聚类 labels = kmeans.labels_ # 获取每个样本的聚类结果 ``` 最后,我们可以使用matplotlib库来绘制降维聚类图,将不同聚类的样本在二维平面上进行可视化展示,例如: ```python import matplotlib.pyplot as plt plt.scatter(low_dim_data[:, 0], low_dim_data[:, 1], c=labels) # 绘制散点图,并使用不同的颜色表示不同聚类 plt.xlabel('Dimension 1') plt.ylabel('Dimension 2') plt.title('Dimension Reduction Clustering') plt.show() ``` 通过这样的处理过程,我们可以将原始的高维数据转化为低维表示,并将其聚类结果可视化,有助于我们分析和理解数据的结构和特征。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白墨石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值