【问题标题】:Principal Component Rotation matrix with different dimension不同维度的主成分旋转矩阵
【发布时间】:2025-12-19 10:20:22
【问题描述】:

我无法理解为什么会这样。我有一个数据矩阵(64x6830)。当我执行以下操作时

pr.out=prcomp(data,scale=TRUE)
dim(pr.out$rotation)
# [1] 6830   64

我无法理解为什么旋转矩阵不是 6830x6830。当我采用这样的数据子集时:

data1=data[1:nrow(data),1:10]
pr.data=prcomp(data1,scale=TRUE)
dim(pr.data$rotation)
# [1] 10 10 

因此,对于来自相同数据的较小尺寸是正确的,但我不知道为什么在整个数据集上完成时它会给出不同的旋转矩阵。

【问题讨论】:

    标签: r pca


    【解决方案1】:

    函数prcomp是基于函数svd

    svd(x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)
    

    edit(stats:::prcomp.default),我们看到:

    s <- svd(x, nu = 0)
    

    这意味着不计算左奇异向量。因此,在prcomp的情况下,svd只返回"a vector containing the singular values of x, of length min(n, p)""a matrix whose columns contain the right singular vectors of x [...]. Dimension c(p, nv)"

    如果我们回到svd的调用,nv被定义为nv = min(n, p)np之间的最小值),其中n = row(x)p = ncol(x)

    1. 在“数据”的情况下,n = 64p = 6830。那么nv = 64pr.out$rotation 是一个 6830x64 (p x nv) 矩阵
    2. 在“data1”的情况下,n = 10p = 10。那么nv = 10pr.out$rotation 是一个 10x10 (p x nv) 矩阵

    【讨论】:

    • 我认为它给了我们减少的列或者基本上是矩阵的等级。这里 nv 将是排名或否。独立的cols。休息它正在丢弃
    • 如果您没有在prcomp 中指定容差tol,则不会计算排名。 rotation 的大小由svd 算法给出。