23 #ifndef __MLPACK_METHODS_MOG_PHI_HPP
24 #define __MLPACK_METHODS_MOG_PHI_HPP
46 inline double phi(
const double x,
const double mean,
const double var)
48 return exp(-1.0 * ((x - mean) * (x - mean) / (2 * var)))
49 / sqrt(2 *
M_PI * var);
68 inline double phi(
const arma::vec& x,
69 const arma::vec& mean,
72 arma::vec diff = mean - x;
75 arma::vec exponent = -0.5 * (trans(diff) * inv(cov) * diff);
78 return pow(2 *
M_PI, (
double) x.n_elem / -2.0) * pow(det(cov), -0.5) *
94 inline double phi(
const arma::vec& x,
95 const arma::vec& mean,
97 const std::vector<arma::mat>& d_cov,
103 arma::mat cinv = inv(cov);
105 arma::vec diff = mean - x;
107 arma::vec exponent = -0.5 * (trans(diff) * inv(cov) * diff);
109 long double f = pow(2 *
M_PI, (
double) x.n_elem / 2) * pow(det(cov), -0.5)
113 arma::vec invDiff = cinv * diff;
114 g_mean = f * invDiff;
117 for (
size_t i = 0; i < d_cov.size(); i++)
119 arma::mat inv_d = cinv * d_cov[i];
121 g_cov[i] = f * dot(d_cov[i] * invDiff, invDiff) +
122 accu(inv_d.diag()) / 2;
138 inline void phi(
const arma::mat& x,
139 const arma::vec& mean,
140 const arma::mat& cov,
141 arma::vec& probabilities)
144 arma::mat diffs = x - (mean * arma::ones<arma::rowvec>(x.n_cols));
150 arma::mat rhs = -0.5 * inv(cov) * diffs;
151 arma::vec exponents(diffs.n_cols);
152 for (
size_t i = 0; i < diffs.n_cols; i++)
153 exponents(i) = exp(accu(diffs.unsafe_col(i) % rhs.unsafe_col(i)));
155 probabilities = pow(2 *
M_PI, (
double) mean.n_elem / -2.0) *
156 pow(det(cov), -0.5) * exponents;