从我两个月前开始读博时,导师在聊PCA的时候就经常喜欢把它比作回归模型。有关PCA的教科书里也经常提到这一点,比如,I.T.Jolliffe的书中就提到:
之前对这一点理解不深,但随着时间的推移,在我渐渐熟悉了PCA中的各种性质与过程后,我对这一点也有了自己的理解。今天就用这篇文章来归纳一下PCA作为一种线性回归模型的特点。
首先,假如我们有一个秩为r的m*n矩阵X,我们可以对其进行如下SVD:
其中U为m*r矩阵,包含了r个left singular vectors,D为r*r矩阵,包含了所有的Singular values,V为n*r矩阵,包含了r个right singular vectors。
如果我们现在要找一个秩为k(k<r),最接近X的m*n矩阵M(rank-k approximation of X),我们可以使用truncated SVD:
其中Uk包含了U中的前k个left singular vectors,Dk包含了D中1到k行/列(就D[1:k, 1:k]),Vk包含了V中的前k个right singular vectors。得出的Xk即为X的best rank-k approximation,也就是说Xk保证了下式达到最小值:
Xk可以被拆解为两个部分:
其中Zk为m*k矩阵,它包含了将X降维至k个主成分后,这k个主成分的数据。由于
我们也可以将上式改写为:
进一步地,通过一些推导,我们可以得出:
上式即可理解为,我们通过Vk矩阵,将原来的X矩阵(位于Rm*n空间中)投影到了更低维度的空间中(也就是Zk位于的Rm*k空间中)。
上述是从truncated SVD的角度对PCA进行总结,我们可以重新将目光聚焦于它的表达式上:
我们前面提到,truncated SVD得到了最好的approximation,最小化了对应的差异平方和。我们其实可以将这个差异看作回归模型中的残差,所以假如我们现在知道矩阵X及其对应的主成分矩阵Zk,当我们将X关于Zk进行回归时(不带截距项),估计出来的回归模型的beta系数会逐一对应Vk中的数值。
现在,我们通过一个实例来验证如上的推论/性质。下面是代码,用到了我在高维课上用到的cheese数据集:
library(HDDAData) # for cheese dataset
data(cheese)
svd_cheese <- svd(cheese) # svd
U <- svd_cheese$u # extract U
D <- diag(svd_cheese$d) # extract D
V <- svd_cheese$v # extract V
k=3 # do truncated SVD with k=3
Z_k <- U[,1:k]%*%D[1:k,1:k] # calculate Z_k
V_k <- V[,1:k] # extract V_k
beta_mat <- vapply(1:ncol(cheese),
function(i) lm(cheese[,i]~Z_k-1)$coef,
numeric(k)) # estimate betas
下面是Vk矩阵:
下面是回归系数的矩阵:
回归系数的矩阵确实为Vk矩阵的转置,上述的推论也得到了印证!本篇文章的内容也到此结束!