Press "Enter" to skip to content

SVD is all you need (code repo)

本文是关于之前写的专栏

 

的复现代码,其实非常简单,代码已公开到github:

 

在使用的时候可能读者会对我所写的函数存在困惑,这里做统一解释

 

LSI <- function(data_list,var.names,reduct.dim,reduct.dim2,center=FALSE,method = "irlba")

 

其中data_list是放在list的RPCI对象,为了方便读者直接看到我所实现的结果和原来RPCI结果的一致性,所以就直接将我的输入和RPCI的输入保持一致。var.names代表所选择的高变基因,reduct.dim代表第一次做SVD需要的维度(所以这里用的是truncted SVD),reduct.dim代表第二次做SVD需要的维度,center代表是否对数据进行中心化,如果是FALSE就是Z-score标准化,如果是TRUE就是只做中心化不除以标准差,method代表要选择什幺样的truncted SVD算法,可选择的有两种包括rAPRACK以及irlba。

 

可以通过如下代码看是否我输出的结果和RPCI的结果是一致的

 

embed <- LSI(list(dat6, dat1, dat2, dat3, dat4, dat5, dat7, dat8),var0,18,50,center=TRUE)
cor <- NULL
for(i in 1:ncol(embed)) cor <- c(cor, abs(cor(embed[,i],[email protected]$cell.pls[,i]))) # data0 就是RPCI运行后的结果

可以看到,前18维是完全一致的,相关系数全部都是1,而18维以后就完全不一样。

 

原因在于如果第二次做SVD的时候,也就是Reduct.dim2选择Reduct.dim的时候,Reduct.dim以后的维度没有意义,理由是第二次做SVD时基于的相关性矩阵完全基于第一次做SVD的embedding的内积的结果,所以第一次做SVD所选择的维度本身就限制了新计算的相关性矩阵或者说内积矩阵的维度(在我们的case,小于等于18维),所以再高的维度分解的方向其实是随机的。

 

以上

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注