0

マトリックスでSVDを実行した後、指定したn値ごとに縮小されたマトリックスを作成する関数を作成したいと思います(Rの関数はまだ得意ではありません)。

たとえば、これは私が今持っているものの R コードです。

scores = c(3,1,1,-1,3,1)
Mat = matrix(scores, nrow=2)
svd = svd(Mat)

ここで、行列の因数分解から元の行列に移動するには、ブルート フォースと無知を介して、次のように動作します。

score1 = svd$u[,1] %*% t(svd$v[,1]) * svd$d[1]
    score2 = svd$u[,2] %*% t(svd$v[,2]) * svd$d[2]

z = score1 + score2
z

    [,1] [,2] [,3]
[1,]    3    1    3
[2,]    1   -1    1

今後は、大きなマトリックスでこれを実行できるようにしたいと考えており、因子の数を指定できるようにしたいと考えています。したがって、スコアを 1:n で合計する代わりに、それを行う関数が必要です。

4

1 に答える 1

2

独自の小さな関数で行列演算をラップすることはできませんか?

recover_matrix_from_svd <- function(svd) {
    score <- 0
    for(i in 1:ncol(svd$u)) {
    score <- score + svd$u[,i] %*% t(svd$v[,i]) * svd$d[i]
    }
    score
}

あるいは、このdiag関数はこれに非常に役立ちます。これを使用すると、より明確な計算が得られます。

recover_matrix_from_svd <- function(svd) {
    svd$u %*% diag(svd$d) %*% t(svd$v)
}
于 2015-05-27T14:55:04.080 に答える