您发布的教程的第13-20页提供了非常直观的几何解释,说明了如何使用PCA进行降维。
您提到的13x13矩阵很可能是“加载”或“旋转”矩阵(我想您的原始数据有13个变量?),可以用以下两种(等效)方法之一来解释该矩阵:
加载矩阵的(的绝对值)描述每个变量按比例“贡献”给每个组件的量。
旋转矩阵将数据旋转到旋转矩阵定义的基础上。因此,如果您具有2-D数据并将数据乘以旋转矩阵,则新的X轴将是第一个主要成分,而新的Y轴将是第二个主要成分。
编辑:这个问题被问了很多,所以我将对使用PCA进行降维时发生的情况进行详细的视觉解释。
考虑从y = x +噪声生成的50个点的样本。如下所示,第一个主成分将沿着线y = x放置,第二个成分将沿着线y = -x放置。
长宽比将其弄乱了一点,但我相信组件是正交的。应用PCA将旋转我们的数据,使分量成为x和y轴:
转换前的数据为圆圈,转换后的数据为十字。在这个特定示例中,数据旋转的次数并没有太多,因为它沿y = -2x线翻转了,但是我们可以很容易地反转y轴使其真正旋转,而不会失去通用性,如此处所述。
方差的大部分(即数据中的信息)沿第一个主分量(在转换数据后由x轴表示)进行分布。第二个分量(现在为y轴)略有变化,但是我们可以完全删除该分量,而不会损失大量信息。因此,要将其从二维折叠为1,我们让数据在第一个主成分上的投影完全描述了我们的数据。
通过将其旋转(确定,投影)回原始轴上,我们可以部分恢复原始数据。
深蓝色点是“已恢复”的数据,而空点是原始数据。如您所见,我们已经从原始数据中丢失了一些信息,特别是第二个主要分量方向上的差异。但是出于许多目的,这种压缩的描述(使用沿第一个主要部分的投影)可能适合我们的需求。
这是我用来生成此示例的代码,以防您想自己复制它。如果减少第二行上的噪声分量的方差,由于数据将收敛到第一个主分量上,因此PCA转换丢失的数据量也将减少:
set.seed(123)
y2 = x + rnorm(n,0,.2)
mydata = cbind(x,y2)
m2 = colMeans(mydata)
p2 = prcomp(mydata, center=F, scale=F)
reduced2= cbind(p2$x[,1], rep(0, nrow(p2$x)))
recovered = reduced2 %*% p2$rotation
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data with principal component vectors')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data after PCA transformation')
points(p2$x, col='black', pch=3)
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=mean(p2$x[,1])
,y1=1
,col='blue'
)
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=-1.5
,y1=0
,col='red'
)
lines(x=c(-1,1), y=c(2,-2), lty=2)
plot(p2$x, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='PCA dimensionality reduction')
points(reduced2, pch=20, col="blue")
for(i in 1:n){
lines(rbind(reduced2[i,], p2$x[i,]), col='blue')
}
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Lossy data recovery after PCA transformation')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
for(i in 1:n){
lines(rbind(recovered[i,], mydata[i,]), col='blue')
}
points(recovered, col='blue', pch=20)