35 votos

Producto de dos distribuciones gaussianas multivariantes

Dadas dos distribuciones gaussianas multivariantes, dadas por la media y la covarianza, $G_1(x; \mu_1,\Sigma_1)$ y $G_2(x; \mu_2,\Sigma_2)$ ¿Cuáles son las fórmulas para encontrar el producto, es decir $p_{G_1}(x) p_{G_2}(x)$ ?

Y si uno quisiera implementar esto en c++, ¿cuál sería una forma eficiente de hacerlo?

Ve con calma, soy principalmente un informático y no un matemático puro.

Se agradece cualquier ayuda.

26voto

rhashimoto Puntos 131

Una expresión alternativa de la PDF proporcional al producto es:

$\Sigma_3 = \Sigma_1(\Sigma_1 + \Sigma_2)^{-1}\Sigma_2$

$\mu_3 = \Sigma_2(\Sigma_1 + \Sigma_2)^{-1}\mu_1 + \Sigma_1(\Sigma_1 + \Sigma_2)^{-1}\mu_2$

La ventaja de esta forma de cálculo es que sólo requiere una matriz inversa.

20voto

Benno Puntos 577

Denotando el producto por $G_3 = (\mu_3, \Sigma_3)$ las fórmulas son:

$\Sigma_3 = (\Sigma_1^{-1}+\Sigma_2^{-1})^{-1} $

$\mu_3 = \Sigma_3\Sigma_1^{-1}\mu_1 + \Sigma_3\Sigma_2^{-1}\mu_2$

como se encuentra en el libro de recetas de Matrix (Sección 8.1.8):

http://compbio.fmph.uniba.sk/vyuka/ml/old/2008/handouts/matrix-cookbook.pdf

18voto

user187815 Puntos 46

Depende de la información que tengas y de las cantidades que quieras sacar.

  • Si tienes las propias matrices de covarianza, debes utilizar la fórmula $$ \Sigma_3 = \Sigma_1(\Sigma_1 + \Sigma_2)^{-1}\Sigma_2 $$ $$ \mu_3 = \Sigma_2(\Sigma_1 + \Sigma_2)^{-1}\mu_1 + \Sigma_1(\Sigma_1 + \Sigma_2)^{-1}\mu_2 $$ La forma computacionalmente eficiente y numéricamente estable de hacerlo sería tomar la descomposición Cholesky de $\Sigma_1 + \Sigma_2$ (la descomposición de Cholesky es probablemente una parte estándar de cualquier biblioteca de matrices que estés utilizando). $$ LL^T = \Sigma_1 + \Sigma_2 $$ A continuación, calcule $$ \begin{align*} \tilde \Sigma_1 &= L^{-1}\Sigma_1 & \tilde \Sigma_2 &= L^{-1}\Sigma_2\\ \tilde \mu_1 &= L^{-1}\mu_1 & \tilde \mu_2 &= L^{-1}\mu_2 \end{align*} $$ Lo cual es eficiente porque $L$ es triangular inferior (asegúrese de utilizar las funciones de resolución lineal incorporadas en su biblioteca de matrices). La solución completa es $$ \Sigma_3 = \tilde \Sigma_1^T \tilde\Sigma_2\\ \mu_3 = \tilde \Sigma_2^T \tilde \mu_1 + \tilde \Sigma_1^T \tilde \mu_2 $$

  • Sin embargo, si se dispone de las covarianzas inversas, ya que las distribuciones gaussianas se expresan en términos de la covarianza inversa, el cálculo puede ser aún más eficiente. En ese caso se debe calcular $$ \Sigma_3^{-1} = \Sigma_1^{-1} + \Sigma_2^{-1}\\ \mu_3 = \Sigma_3(\Sigma_1^{-1}\mu_1 + \Sigma_2^{-1}\mu_2) $$ Cuando calcule la expresión para la media, utilice una función de resolución lineal incorporada; puede ser más eficiente y numéricamente estable que calcular la inversa de $\Sigma_3^{-1}$ .

La implementación en C++ depende de ti :)

1voto

Declan Taylor Puntos 101

Dado que el autor de la pregunta se refería a c++, he aquí una respuesta basada en el código de un lenguaje con una sintaxis similar, a saber, c#:


public Tuple<Vector<double>, Matrix<double>> MultiVariateGaussianProduct(List<Tuple<Vector<double>, Matrix<double>>> vm)
{

    //v: Mean Vector
    //m: CoVariance Matrix

    // m-1
    var mSumInv = vm[0].Item2.Inverse();
    // v/m
    var mInvV = mSumInv*vm[0].Item1;

    for (int i = 1; i < vm.Count; i++)
    {
        // m-1 +
       var mInv= vm[i].Item2.Inverse();

        mSumInv += mInv;
        // v/m +
        mInvV += mInv * vm[i].Item1;

    }

    //(m-1)-1
    var combinedCoVariance = mSumInv.Inverse();
    // m*(v/m)
    var combinedMean =combinedCoVariance* mInvV;

    return new Tuple<Vector<double>, Matrix<double>>(combinedMean, combinedCoVariance); 

}

N.B.

  • Este método permite un número indeterminado de distribuciones.
  • He utilizado la implementación de MathNet de Matrices/Vectores.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X