文書マトリックスごとの単語の例があります (Landauer and 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()
関数を使用してこの行列に対して特異値分解を実行でき、 3 つの行列U
、S
、およびがありV
ます。
SVD <- svd(wxd)
U <- SVD$u
S <- diag(SVD$d)
V <- SVD$v
これらの行列を乗算して、元の行列を返すことができます (わずかなマージンまたはエラーの範囲内で)。
U %*% S %*% t(V)
また、行列の最初の 2 列とU
、V
行列の最初の 2 列と行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
マトリックスを最初から計算しようとしたときとなぜ異なるのですか?