1

SVD 分解を使用して共分散行列を計算しようとしていますが、正しく機能していません。私は次の機能を構築しました。

誰でも私が犯した間違いを指摘するのを手伝ってもらえますか.

前もって感謝します

svdcov = function(x){
           svdmat = svd(x)


## d is the singular values sometimes denoted as s
## u is left singular
## v is right singular
dvec = matrix(data=NA,nrow=length(x),ncol=1)
dvec[,1] = svdmat$d
covmat = t(t(svdmat$v%*%dvec)%*%t(svdmat$u)%*%svdmat$u)%*%t(dvec)%*%svdmat$v   
        colnames(covmat) = colnames(x)
        rownames(covmat) = colnames(x)
        return(covmat)

}
4

1 に答える 1

3

特異値分解はX=UDV'です。を計算X'Xしたい場合、それは(UDV')'(UDV')、つまり 、 VDU'UDV'つまりV D^2 V'(Uは直交およびD対角) になります。

f <- function(x) { 
  s <- svd(x)
  v <- s$v
  d <- diag(s$d)  # It is a vector: transform it to a diagonal matrix
  v %*% d^2 %*% t(v)
}
x <- matrix( rnorm(200), nc=4 )
stopifnot( all( abs( f(x) - t(x) %*% x ) < 1e-12 ) )

分散行列を取得するには、すべての列の平均を引き、観測数で割る必要があります。

stopifnot( all( abs( 
    var(x) - 
    f(scale(x, scale=FALSE)) / (nrow(x)-1)
  ) < 1e-12
) )
于 2013-05-28T16:19:44.023 に答える