我有一个逐个文档矩阵的示例单词(来自 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()
并具有三个矩阵U
、S
和V
:
SVD <- svd(wxd)
U <- SVD$u
S <- diag(SVD$d)
V <- SVD$v
我可以将这些矩阵相乘并返回我的原始矩阵(在一些小的余量或误差内):
U %*% S %*% t(V)
我还可以取和 矩阵的前两列U
和V
矩阵的前两列和行,S
以获得原始数据的最小二乘最佳近似值。这与我上面提到的论文中相同过程的结果相符:
U[ , 1:2] %*% S[1:2, 1:2] %*% t(V[ , 1:2])
我想确保我了解这个函数在做什么(尽我所能),并且我已经能够生成V
和S
矩阵以匹配来自svd()
函数的矩阵:
ATA <- t(wxd) %*% wxd
V2 <- eigen(ATA)$vectors
S2 <- sqrt(diag(eigen(ATA)$values))
但是,U
我生成的矩阵对于前 9 列具有相同的绝对值,然后再添加 3 列。该矩阵的某些元素与函数中的U
矩阵具有不同的符号:U
svd()
AAT <- wxd %*% t(wxd)
U2 <- eigen(AAT)$vectors
所以我的问题是,为什么U
矩阵与我尝试从头开始计算时不同?