手动计算多元正态分布的密度

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
}