手动计算多元正态分布的密度
calculate density of multivariate normal distribution manually
我想手动计算多元正态分布的密度。作为我的函数的输入,我有 x
这是一个 n*p
数据点矩阵,一个向量 mu
具有 n
手段和一个协方差矩阵 sigma
昏暗 p*p
。
我为此编写了以下函数:
`dmnorm <- function(mu, sigma, x){
k <- ncol(sigma)
x <- t(x)
dmn <- exp((-1/2)*t(x-mu)%*%solve(sigma)%*%(x-
mu))/sqrt(((2*pi)^k)*det(sigma))
return(dmn)
}`
我自己的函数给了我一个n*n
的矩阵。但是,我应该得到一个长度为 n
的向量。
最后,我想要与使用 mvtnorm
包中的 dmvnorm()
函数得到的结果相同。我的代码有什么问题?
表达式 t(x-mu)%*%solve(sigma)%*%(x-
mu)
是 p x p,所以这就是您的结果是那个大小的原因。你想要那个矩阵的对角线,你可以使用
diag(t(x-mu)%*%solve(sigma)%*%(x-mu))
所以完整的功能应该是
dmnorm <- function(mu, sigma, x){
k <- ncol(sigma)
x <- t(x)
dmn <- exp((-1/2)*diag(t(x-mu)%*%solve(sigma)%*%(x-
mu)))/sqrt(((2*pi)^k)*det(sigma))
dmn
}
我想手动计算多元正态分布的密度。作为我的函数的输入,我有 x
这是一个 n*p
数据点矩阵,一个向量 mu
具有 n
手段和一个协方差矩阵 sigma
昏暗 p*p
。
我为此编写了以下函数:
`dmnorm <- function(mu, sigma, x){
k <- ncol(sigma)
x <- t(x)
dmn <- exp((-1/2)*t(x-mu)%*%solve(sigma)%*%(x-
mu))/sqrt(((2*pi)^k)*det(sigma))
return(dmn)
}`
我自己的函数给了我一个n*n
的矩阵。但是,我应该得到一个长度为 n
的向量。
最后,我想要与使用 mvtnorm
包中的 dmvnorm()
函数得到的结果相同。我的代码有什么问题?
表达式 t(x-mu)%*%solve(sigma)%*%(x-
mu)
是 p x p,所以这就是您的结果是那个大小的原因。你想要那个矩阵的对角线,你可以使用
diag(t(x-mu)%*%solve(sigma)%*%(x-mu))
所以完整的功能应该是
dmnorm <- function(mu, sigma, x){
k <- ncol(sigma)
x <- t(x)
dmn <- exp((-1/2)*diag(t(x-mu)%*%solve(sigma)%*%(x-
mu)))/sqrt(((2*pi)^k)*det(sigma))
dmn
}