在 R 中重现奇异值分解

Reproducing Singular Value Decompition in R

我有一个文档矩阵的单词示例(来自 Landauer 和 Dumais,1997):

wxd <- matrix(c(1,1,1,0,0,0,0,0,0,0,0,0,
            0,0,1,1,1,1,1,0,1,0,0,0,
            0,1,0,1,1,0,0,1,0,0,0,0,
            1,0,0,0,2,0,0,1,0,0,0,0,
            0,0,0,1,0,1,1,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,1,0,0,
            0,0,0,0,0,0,0,0,0,1,1,0,
            0,0,0,0,0,0,0,0,0,1,1,1,
            0,0,0,0,0,0,0,0,1,0,1,1)
          ,12, 9)
rownames(wxd) <- c("human", "interface", "computer", "user", "system", 
               "response", "time", "EPS", "survey", "trees", "graph", "minors")
colnames(wxd) <- c(paste0("c", 1:5), paste0("m", 1:4))

我可以使用 svd() 函数对该矩阵执行奇异值分解,并具有三个矩阵 USV:

SVD <- svd(wxd)
U <- SVD$u
S <- diag(SVD$d)
V <- SVD$v

我可以将这些矩阵相乘并返回我的原始矩阵(在一些小的余量或误差范围内):

U %*% S %*% t(V)

我还可以取 UV 矩阵的前两列以及 S 矩阵的前两列和行以获得最小二乘法最佳近似值原始数据。这与我上面提到的论文中相同程序的结果相符:

U[ , 1:2] %*% S[1:2, 1:2] %*% t(V[ , 1:2])

我想确保我理解这个函数在做什么(尽我所能),并且我已经能够生成 VS 矩阵来匹配它们来自 svd() 函数:

ATA <- t(wxd) %*% wxd
V2 <- eigen(ATA)$vectors

S2 <- sqrt(diag(eigen(ATA)$values))

但是,我生成的 U 矩阵的前 9 列具有相同的绝对值,然后添加另外 3 列。此 U 矩阵的某些元素与 svd() 函数中的 U 矩阵的符号不同:

AAT <- wxd %*% t(wxd)
U2 <- eigen(AAT)$vectors

所以我的问题是,为什么 U 矩阵与我尝试从头开始计算时不同?

wxd 排名 9。因此,你的AAT只有9个非零特征值(其余的都非常小~1e-16)。对于那些零特征值,特征向量是任意的,只要它们跨越 subspace 正交于 R^12.

中其他特征向量所跨越的子space

现在,默认情况下 svd 仅计算 nu=min(n,p) 左奇异向量(与右特征向量类似),其中 n 是行数,p 是行数输入中的列数(参见 ?svd)。因此,您只能得到 9 个左奇异向量。要生成所有 12,请调用 svd

svd(wxd,nu=nrow(wxd))

但是,那些额外的 3 左奇异向量将不再对应于 eigen(AAT)$vectors 中找到的奇异向量,因为这些特征向量是任意确定的,以跨越正交子 space。

至于为什么有些符号发生了变化,回想一下,特征向量仅根据比例因子确定。尽管这些特征向量已归一化,但它们可能相差 -1 倍。要检查,只需将 U 中的一个与 U2 中相应的一个相除即可。您应该获得所有 1s 或 -1s:

的列
U[,1:9]/U2[,1:9]
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,]    1   -1    1   -1    1   -1    1    1    1
## [2,]    1   -1    1   -1    1   -1    1    1    1
## [3,]    1   -1    1   -1    1   -1    1    1    1
## [4,]    1   -1    1   -1    1   -1    1    1    1
## [5,]    1   -1    1   -1    1   -1    1    1    1
## [6,]    1   -1    1   -1    1   -1    1    1    1
## [7,]    1   -1    1   -1    1   -1    1    1    1
## [8,]    1   -1    1   -1    1   -1    1    1    1
## [9,]    1   -1    1   -1    1   -1    1    1    1
##[10,]    1   -1    1   -1    1   -1    1    1    1
##[11,]    1   -1    1   -1    1   -1    1    1    1
##[12,]    1   -1    1   -1    1   -1    1    1    1

更新以解释为什么仅根据比例因子确定特征向量

这一点从特征向量的定义就可以看出。来自 Wikipedia

In linear algebra, an eigenvector or characteristic vector of a linear transformation is a non-zero vector that does not change its direction when that linear transformation is applied to it.

在有限维向量space中,线性变换是将向量乘以方阵A,因此定义是(这是我希望SO支持LaTeX的地方markdown 因为这不是代码中的等式;即 * 在这里是矩阵乘法):

A * v = lambda * v

称为矩阵 A 特征值方程 ,其中 lambda 是与特征向量 v 关联的特征值。从这个等式可以清楚地看出,如果 vA 的特征向量,那么对于某个标量 k 的任何 k * v 也是 A 的特征向量特征值 lambda.