在 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()
函数对该矩阵执行奇异值分解,并具有三个矩阵 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
矩阵与我尝试从头开始计算时不同?
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
中相应的一个相除即可。您应该获得所有 1
s 或 -1
s:
的列
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
关联的特征值。从这个等式可以清楚地看出,如果 v
是 A
的特征向量,那么对于某个标量 k
的任何 k * v
也是 A
的特征向量特征值 lambda
.
我有一个文档矩阵的单词示例(来自 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
矩阵与我尝试从头开始计算时不同?
wxd
排名 9
。因此,你的AAT
只有9
个非零特征值(其余的都非常小~1e-16
)。对于那些零特征值,特征向量是任意的,只要它们跨越 subspace 正交于 R^12.
现在,默认情况下 svd
仅计算 nu=min(n,p)
左奇异向量(与右特征向量类似),其中 n
是行数,p
是行数输入中的列数(参见 ?svd
)。因此,您只能得到 9
个左奇异向量。要生成所有 12
,请调用 svd
:
svd(wxd,nu=nrow(wxd))
但是,那些额外的 3
左奇异向量将不再对应于 eigen(AAT)$vectors
中找到的奇异向量,因为这些特征向量是任意确定的,以跨越正交子 space。
至于为什么有些符号发生了变化,回想一下,特征向量仅根据比例因子确定。尽管这些特征向量已归一化,但它们可能相差 -1
倍。要检查,只需将 U
中的一个与 U2
中相应的一个相除即可。您应该获得所有 1
s 或 -1
s:
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
关联的特征值。从这个等式可以清楚地看出,如果 v
是 A
的特征向量,那么对于某个标量 k
的任何 k * v
也是 A
的特征向量特征值 lambda
.