PCA原理及代码实现
0 PCA的过程
1. 数据准备与中心化
原始表达矩阵 A (n×p):n个样本,p个基因
对每个基因(特征)进行中心化:B = A - A.mean(axis=0)
中心化后矩阵 B:每列均值为0
2. 奇异值分解(SVD)
这里用的是紧凑型SVD,为零的奇异值直接省略了。
对中心化矩阵 B 进行SVD分解:B = UΣVᵀ
其中:
U:左奇异向量矩阵 (n×r)
Σ:奇异值对角矩阵 (r×r)
Vᵀ:右奇异向量矩阵转置 (r×p)
3. 主成分得分计算
主成分方向:V 的列向量(特征向量)
样本在主成分空间的坐标:scores = BV
等价计算:scores = UΣ
每个样本在PC1, PC2, …上的坐标即为PCA降维结果
4. 解释方差
各主成分解释方差比例:explained_variance_ratio = s² / sum(s²)
其中 s 为奇异值向量
1 一些问题
1 BV的意义是什么?
我们如果只考虑 bi*vi 的话,bi为p维空间中的一点(是一个p维的向量),vi是一个p维的特征向量。现在我们考虑吧一下两个向量点乘的几何意义:a·b = |a|·|b|·cosx,如果b为单位向量的话,a/b向量点乘的几何意义为a向量在b向量方向上的投影(坐标)。
所以BV可以理解成,样本点在PCi(特征向量)上的投影(坐标)。我们希望每一个样本点在PCi上的投影坐标的方差尽量大,考虑一个极端情况,如果所有的样本点在PC1上的坐标相差很大,实际上我们完全可以将PC1作为一个轴,并将样本散布在上面,也就是实现了降维。
2 为什么vi的方向是B投影坐标方差最大的方向?
下面来进行数学推导:
2 PCA的代码实现及其应用
手动PCA
1 | import pandas as pd |
手动PCA运行结果
1 |
|
sklearn PCA
1 | # 6. 使用sklearn的PCA进行对比 |
sklearn PCA 运行结果
1 | === sklearn PCA Comparison === |
3 写在最后
谁能想到在生物学中最经常使用的PCA分析涉及的知识会这么广泛,可能有人会说,PCA已经包装成函数了,没有必要去探究背后的数学原理,真的是这样吗?我对此也没有答案。不过我相信无用为大用,看似现在没用,未来可能有用,即使未来没用,我们也获得了探寻的快乐。PCA的核心知识就是线性代数中的奇异值分解,注意PCA是一种线性降维的方法,还有非线性降维的方法,这就触及到笔者的知识盲区了。不求进步多快,只要每天进步一点点,and happy everyday!
其他学习资料
瑞利商定理:
https://www.cnblogs.com/xinyy-HilbertSpace/articles/16013387.html