15 #ifndef __MLPACK_METHODS_MOG_PHI_HPP
16 #define __MLPACK_METHODS_MOG_PHI_HPP
38 inline double phi(
const double x,
const double mean,
const double var)
40 return exp(-1.0 * ((x - mean) * (x - mean) / (2 * var)))
41 / sqrt(2 *
M_PI * var);
60 inline double phi(
const arma::vec& x,
61 const arma::vec& mean,
64 arma::vec diff = mean - x;
67 arma::vec exponent = -0.5 * (trans(diff) * inv(cov) * diff);
70 return pow(2 *
M_PI, (
double) x.n_elem / -2.0) * pow(det(cov), -0.5) *
86 inline double phi(
const arma::vec& x,
87 const arma::vec& mean,
89 const std::vector<arma::mat>& d_cov,
95 arma::mat cinv = inv(cov);
97 arma::vec diff = mean - x;
99 arma::vec exponent = -0.5 * (trans(diff) * inv(cov) * diff);
101 long double f = pow(2 *
M_PI, (
double) x.n_elem / 2) * pow(det(cov), -0.5)
105 arma::vec invDiff = cinv * diff;
106 g_mean = f * invDiff;
109 for (
size_t i = 0; i < d_cov.size(); i++)
111 arma::mat inv_d = cinv * d_cov[i];
113 g_cov[i] = f * dot(d_cov[i] * invDiff, invDiff) +
114 accu(inv_d.diag()) / 2;
130 inline void phi(
const arma::mat& x,
131 const arma::vec& mean,
132 const arma::mat& cov,
133 arma::vec& probabilities)
136 arma::mat diffs = x - (mean * arma::ones<arma::rowvec>(x.n_cols));
142 arma::mat rhs = -0.5 * inv(cov) * diffs;
143 arma::vec exponents(diffs.n_cols);
144 for (
size_t i = 0; i < diffs.n_cols; i++)
145 exponents(i) = exp(accu(diffs.unsafe_col(i) % rhs.unsafe_col(i)));
147 probabilities = pow(2 *
M_PI, (
double) mean.n_elem / -2.0) *
148 pow(det(cov), -0.5) * exponents;
Linear algebra utility functions, generally performed on matrices or vectors.
double phi(const double x, const double mean, const double var)
Calculates the univariate Gaussian probability density function.