PH525x series - Principal Compon

2019-12-17  本文已影响0人  3between7

这一章,作者就是在数学原理方面又细讲了下主成分分析(PCA

例子:双胞胎身高

作者首先使用双胞胎身高的例子来说明与PCA非常相似的降维与旋转是怎么一回事

201912171008.png

数据Y是一个2 \times N的矩阵,假设我们的目标是寻找可以最大化(u_1^TY)(u_1^TY)^T的一个2 \times 1的向量u_1,且此向量满足条件u_1^Tu_1 = 1。这一过程可以看作是每一个样本或者说是Y的每一列向由u_1定义的子空间的投影,也就是说我们其实是在寻找可以使样本投影到子空间的坐标间变异度最大的矩阵变化方式。(我描述的可能有点绕,还是看例子去理解吧。)

我们先来看上图的那些点是如何投影到twin1身高也就是u_1 = (1,0)^T的那个维度的:

mypar(1,1)
plot(t(Y), xlim=thelim, ylim=thelim,
     main=paste("Sum of squares :",round(crossprod(Y[1,]),1)))
abline(h=0)
apply(Y,2,function(y) segments(y[1],0,y[1],y[2],lty=2))
points(Y[1,],rep(0,ncol(Y)),col=2,pch=16,cex=0.75)
201912171026.png

注意那个crossprod(Y[1,])计算的就是(u_1^TY)(u_1^TY)^T,也就是图片最上方展示的平方和

那如果将投影的方向调整到双胞胎身高差值的那个方向也就是u_1 = (1,-1)^T上会怎样?由于此时u_1^Tu_1不等于1,所以换u_1 = (1/\sqrt{2},-1/\sqrt{2})^T

u <- matrix(c(1,-1)/sqrt(2),ncol=1)
w=t(u)%*%Y
mypar(1,1)
#注意此时再求投影到子空间的平方和时就该用`tcrossprod()`了
plot(t(Y),
     main=paste("Sum of squares:",round(tcrossprod(w),1)),xlim=thelim,ylim=theli\
m)
abline(h=0,lty=2)
abline(v=0,lty=2)
abline(0,-1,col=2)
Z = u%*%w 
for(i in seq(along=w)) segments(Z[1,i],Z[2,i],Y[1,i],Y[2,i],lty=2)
points(t(Z), col=2, pch=16, cex=0.5)
201912171034.png

此时平方和仅为4.5,这么小也很正常,毕竟这个方向是与双胞胎身高差相关的。最后我们再试一下u_1 = (1/\sqrt{2},1/\sqrt{2})^T

u <- matrix(c(1,1)/sqrt(2),ncol=1)
w=t(u)%*%Y
mypar()
plot(t(Y), main=paste("Sum of squares:",round(tcrossprod(w),1)),
     xlim=thelim, ylim=thelim)
abline(h=0,lty=2)
abline(v=0,lty=2) abline(0,1,col=2)
points(u%*%w, col=2, pch=16, cex=1)
Z = u%*%w
for(i in seq(along=w))
  segments(Z[1,i], Z[2,i], Y[1,i], Y[2,i], lty=2)
points(t(Z),col=2,pch=16,cex=0.5)
201912171048.png

u_1 = (1/\sqrt{2},1/\sqrt{2})^T时,这个投影的方向其实就与双胞胎身高的平均值有关了,此时求得的坐标平方和为158.1,比之前两次尝试所得平方和都大。

在本例当中我们是一个一个u_1去试的,但实际上并不用我们这么费劲,之接用奇异值分解就行。

主成分

如果有正交向量u_1可使平方和:
(u_1^TY)(u_1^TY)^T
最大,那么u_1^TY便是第一主成分,被用来计算主成分的权重u在这里被称为负荷(loadings),也可以被称为第一主成分的方向(direction),也就是新坐标。

为了获得第二主成分,我们需重复上面的过程,但不同的是我们使用的是残差:

\mathbf{r} = \mathbf{Y} - u_1^TYu_1

那么第二主成分便是拥有如下性质:

u_2^Tu_2 = 1 u_2^Tu_1 = 0且可以使\mathbf{r}u_2(\mathbf{r}u_2)^T最大的向量。

\mathbf{Y}是一个N \times m的矩阵时,第3,第4等等主成分都是这么计算的。

prcomp

我们除了可以使用SVD的方法去计算主成分,还可以使用R语言提供的一个专用于计算主成分的函数prcomp()

pc <- prcomp(t(Y)) #注意,prcomp函数行是样本列是特征,所以在这里要先转置一下
s <- svd(Y - rowMeans(Y))
mypar(1,2)
for (i in 1:nrow(Y)){
  plot(pc$x[,1],s$d[i]*s$v[,1])
}
201912171124.png

其中,pc$rotation便是负荷,与s$u相同:

pc$rotation
##            PC1        PC2
## [1,] 0.7072304  0.7069831
## [2,] 0.7069831 -0.7072304

s$u
##            [,1]       [,2]
## [1,] -0.7072304 -0.7069831
## [2,] -0.7069831  0.7072304

而方差解释度为pc$sdev

pc$sdev
## [1] 1.2542672 0.2141882

阅读原文请戳

上一篇下一篇

猜你喜欢

热点阅读