【发布时间】:2016-09-09 17:24:03
【问题描述】:
我有一个逐个文档矩阵的示例(来自 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 矩阵的一些元素与svd() 函数中的U 矩阵有不同的符号:
AAT <- wxd %*% t(wxd)
U2 <- eigen(AAT)$vectors
所以我的问题是,为什么U 矩阵与我尝试从头开始计算时不同?
【问题讨论】:
标签: r svd decomposition singular