-
Notifications
You must be signed in to change notification settings - Fork 0
/
loggausspdf.py
41 lines (32 loc) · 988 Bytes
/
loggausspdf.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# -*- coding: utf-8 -*-
"""
Created on Thu May 6 15:34:55 2021
@author: wanghaohui
"""
import numpy as np
_LOG_2PI = np.log(2 * np.pi)
# log of pdf for gaussian distributuion with full covariance matrix (cholesky factorization for stability)
def chol_loggausspdf(X, mu, cov):
D = X.shape[0]
X = X - mu # D x N
U = np.linalg.cholesky(cov).T # D x D
Q = np.linalg.solve(U.T,X)
q = np.sum(Q**2, axis=0)
c = D*_LOG_2PI + 2*np.sum(np.log(np.diag(U)))
y = -0.5 * (c + q)
return y
# # log of pdf for gaussian distributuion with diagonal covariance matrix
# def loggausspdf(X, mu, cov):
# if len(X.shape)==1:
# D=1
# else:
# D = X.shape[1]
# logDetCov = D*np.log(cov)
# dxM = X - mu
# L = np.sqrt(cov)
# xRinv = 1/L * dxM
# mahalaDx = np.sum(xRinv**2, axis=1)
# y = - 0.5 * (logDetCov + D*_LOG_2PI + mahalaDx)
# return y
# def gausspdf(X, mu, cov):
# return np.exp(loggausspdf(X, mu, cov))