func Wishart_PDF(n int, V *m.DenseMatrix) func(W *m.DenseMatrix) float64 { p := V.Rows() Vdet := V.Det() Vinv, _ := V.Inverse() normalization := pow(2, -0.5*float64(n*p)) * pow(Vdet, -0.5*float64(n)) / Γ(0.5*float64(n)) return func(W *m.DenseMatrix) float64 { VinvW, _ := Vinv.Times(W) return normalization * pow(W.Det(), 0.5*float64(n-p-1)) * exp(-0.5*VinvW.Trace()) } }
func MatrixNormal_LnPDF(M, Omega, Sigma *mx.DenseMatrix) func(A *mx.DenseMatrix) float64 { checkMatrixNormal(M, Omega, Sigma) pf := float64(M.Rows()) mf := float64(M.Cols()) sinv, err := Sigma.Inverse() if err != nil { panic(err) } oinv, err := Omega.Inverse() if err != nil { panic(err) } norm := (2 * math.Pi) * (-0.5 * mf * pf) norm += Omega.Det() * (-0.5 * mf) norm += Sigma.Det() * (-0.5 * pf) return func(X *mx.DenseMatrix) (lp float64) { lp = norm diff, err := X.MinusDense(M) if err != nil { panic(err) } inner := oinv inner, err = inner.TimesDense(diff.Transpose()) if err != nil { panic(err) } inner, err = inner.TimesDense(sinv) if err != nil { panic(err) } inner, err = inner.TimesDense(diff) if err != nil { panic(err) } innerTrace := inner.Trace() lp += -0.5 * innerTrace return } }
func Wishart_LnPDF(n int, V *m.DenseMatrix) func(W *m.DenseMatrix) float64 { p := V.Rows() Vdet := V.Det() Vinv, _ := V.Inverse() normalization := log(2)*(-0.5*float64(n*p)) + log(Vdet)*(-0.5*float64(n)) - LnΓ(0.5*float64(n)) return func(W *m.DenseMatrix) float64 { VinvW, _ := Vinv.Times(W) return normalization + log(W.Det())*0.5*float64(n-p-1) - 0.5*VinvW.Trace() } }
/* M is the mean, Omega is the row covariance, Sigma is the column covariance. */ func MatrixNormal_PDF(M, Omega, Sigma *mx.DenseMatrix) func(A *mx.DenseMatrix) float64 { checkMatrixNormal(M, Omega, Sigma) pf := float64(M.Rows()) mf := float64(M.Cols()) norm := math.Pow(2*math.Pi, -0.5*mf*pf) norm *= math.Pow(Omega.Det(), -0.5*mf) norm *= math.Pow(Sigma.Det(), -0.5*pf) return func(X *mx.DenseMatrix) (p float64) { p = norm sinv, err := Sigma.Inverse() if err != nil { panic(err) } oinv, err := Omega.Inverse() if err != nil { panic(err) } diff, err := X.MinusDense(M) if err != nil { panic(err) } inner := oinv inner, err = inner.TimesDense(diff.Transpose()) if err != nil { panic(err) } inner, err = inner.TimesDense(sinv) if err != nil { panic(err) } inner, err = inner.TimesDense(diff) if err != nil { panic(err) } innerTrace := inner.Trace() p *= math.Exp(-0.5 * innerTrace) return } }
func MatrixTLnPDF(M, Omega, Sigma *mx.DenseMatrix, n int) func(T *mx.DenseMatrix) (ll float64) { checkMatrixT(M, Omega, Sigma, n) nf := float64(n) p := M.Rows() pf := float64(p) m := M.Cols() mf := float64(m) var norm float64 = 0 norm += logΓpr(p, 0.5*(nf+mf+pf-1), 0.5*(nf+pf-1)) norm += pow(π, -0.5*mf*pf) norm += pow(Omega.Det(), -0.5*mf) norm += pow(Sigma.Det(), -0.5*pf) SigmaInv, err := Sigma.Inverse() if err != nil { panic(err) } OmegaInv, err := Omega.Inverse() if err != nil { panic(err) } return func(T *mx.DenseMatrix) (ll float64) { ll = norm diff, err := T.MinusDense(M) if err != nil { panic(err) } inner := OmegaInv.Copy() inner, _ = inner.TimesDense(diff) inner, _ = inner.TimesDense(SigmaInv) inner, _ = inner.TimesDense(diff.Transpose()) ll += log(inner.Det()) * -0.5 * (nf + mf + pf - 1) return } }
func MatrixT_PDF(M, Omega, Sigma *mx.DenseMatrix, n int) func(T *mx.DenseMatrix) (l float64) { checkMatrixT(M, Omega, Sigma, n) nf := float64(n) p := M.Rows() pf := float64(p) m := M.Cols() mf := float64(m) var norm float64 = 1 norm *= GammaPRatio(p, 0.5*(nf+mf+pf-1), 0.5*(nf+pf-1)) norm *= math.Pow(math.Pi, -0.5*mf*pf) norm *= math.Pow(Omega.Det(), -0.5*mf) norm *= math.Pow(Sigma.Det(), -0.5*pf) SigmaInv, err := Sigma.Inverse() if err != nil { panic(err) } OmegaInv, err := Omega.Inverse() if err != nil { panic(err) } return func(T *mx.DenseMatrix) (l float64) { l = norm diff, err := T.MinusDense(M) if err != nil { panic(err) } inner := OmegaInv.Copy() inner, _ = inner.TimesDense(diff) inner, _ = inner.TimesDense(SigmaInv) inner, _ = inner.TimesDense(diff.Transpose()) l *= math.Pow(inner.Det(), -0.5*(nf+mf+pf-1)) return } }