我目前正在参加基因组学在线课程,作为一名湿实验室医生,所以我的统计知识不是最好的。现在我们正在 R 中研究 PCA 和 SVD。我得到了一个大矩阵:
head(mat)
ALL_GSM330151.CEL ALL_GSM330153.CEL ALL_GSM330154.CEL ALL_GSM330157.CEL ALL_GSM330171.CEL ALL_GSM330174.CEL ALL_GSM330178.CEL ALL_GSM330182.CEL
ENSG00000224137 5.326553 3.512053 3.455480 3.472999 3.639132 3.391880 3.282522 3.682531
ENSG00000153253 6.436815 9.563955 7.186604 2.946697 6.949510 9.095092 3.795587 11.987291
ENSG00000096006 6.943404 8.840839 4.600026 4.735104 4.183136 3.049792 9.736803 3.338362
ENSG00000229807 3.322499 3.263655 3.406379 9.525888 3.595898 9.281170 8.946498 3.473750
ENSG00000138772 7.195113 8.741458 6.109578 5.631912 5.224844 3.260912 8.889246 3.052587
ENSG00000169575 7.853829 10.428492 10.512497 13.041571 10.836815 11.964498 10.786381 11.953912
这些只是前几列和行,它有 60 列和 1000 行。列是癌症样本,行是基因
任务是:
去除特征向量并使用SVD重建矩阵,然后我们需要计算重建误差作为原始矩阵和重建矩阵之间的差异。提示:您必须使用
函数并将要删除的组件的特征值等于 $0$。svd()
我已经在谷歌上到处搜索,但找不到解决这个任务的方法,这可能是因为我并没有真正理解这个问题本身。
所以我对矩阵 m 进行了 SVD:
d <- svd(mat)
这给了我 3 个矩阵(特征值、特征值和特征向量),我可以使用
d$u
等访问它们。
如何均衡特征值并最终计算误差?
它有助于创建一个处理奇异值的函数。
例如,将与最大奇异值相比太小的任何奇异值归零:
zap <- function(d, digits = 3) ifelse(d < 10^(-digits) * max(abs(d))), 0, d)
虽然在数学上所有奇异值都保证为非负,但浮点算法的数值问题可以并且确实会创建负奇异值,因此我预防性地将奇异值包装在对
abs
的调用中。
将此函数应用于矩阵
X
的 SVD 中的对角矩阵,并通过将分量相乘来重建矩阵:
X. <- with(svd(X), u %*% diag(zap(d)) %*% t(v))
评估重建误差的方法有很多。 一是差值的Frobenius范数,
sqrt(sum((X - X.)^2))
svd 分解将矩阵 mat 表示为 3 个矩阵的乘积
mat = d$u x diag(d$d) x t(d$v)
所以首先确认您能够进行矩阵乘法来返回
mat
一旦能够做到这一点,在进行矩阵乘法之前将 d$d 的最后几个元素设置为零