<jupyter_start><jupyter_text>Gausiana Multivariada Las funciones gausianas en N-dimensiones son muy útiles en estadística Bayesiana para definir probabilidades a priori.<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
plt.style.use(['ggplot', 'demo.mplstyle'])<jupyter_output><empty_output><jupyter_text>Primero definamos a mano una gausiana en 2D.<jupyter_code>def gaussiana_2d(x, y, pars):
    mu_x, mu_y, sigma_x, sigma_y, rho = pars
    exp = np.exp(-1/(2 * (1-rho**2)) * (  (x - mu_x)**2 / sigma_x**2 
                                        + (y - mu_y)**2 / sigma_y**2 
                                        - (2 * rho * (x - mu_x) * (y - mu_y) 
                                           / (sigma_x * sigma_y))))
    output = exp / (2 * np.pi * sigma_x * sigma_y * np.sqrt(1 - rho**2))
    return output<jupyter_output><empty_output><jupyter_text>A continuación definamos los parámetros de la gausiana 2D que vamos a evaluar.<jupyter_code>mu_x = 2.
mu_y = -1.
sigma_x = 0.5
sigma_y = 2.
rho = -0.5

pars = mu_x, mu_y, sigma_x, sigma_y, rho<jupyter_output><empty_output><jupyter_text>Ahora podemos evaluar la gausiana. Los resultados de la evaluación los guardamos en un arreglo que llamamos `prior`.<jupyter_code>x = np.arange(-1, 5, 0.1)
y = np.arange(-6, 4, 0.5)

prior = np.zeros((len(x), len(y)))

for i, x_i in enumerate(x):
    for j, y_j in enumerate(y):
        prior[i, j] = gaussiana_2d(x_i, y_j, pars)<jupyter_output><empty_output><jupyter_text>El gráfico a continuación, muestra en escala de colores las densidades de probabilidad asociadas a cada punto.La línea `ax.set_aspect('equal')` hace que el aspecto relativo del eje `x` y el eje `y` sean iguales. Esto es útil para una visualización apropiada.<jupyter_code>x_grid, y_grid = np.meshgrid(x, y, indexing='ij')

fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.set_aspect('equal')
plt.pcolormesh(x_grid, y_grid, prior)

plt.xlabel('x')
plt.ylabel('y');<jupyter_output><empty_output><jupyter_text>Lo que acabamos de hacer se puede extender a N dimensiones pero se vuelve un poco engorroso. Además, la densidad de probabilidad gausiana ya está incluída en el paquete `scipy.stats`. A continuación veremos cómo utilizarla.Para comparar directamente con nuestra implementación escrita a mano, vamos a re-implementar la misma gausiana 2D usando `scipy`.Lo más importante es entender que `multivariate_normal` es una clase, que implementa variables aleatorias en N dimensiones. Una instancia de esa variable aleatoria tendrá métodos como `pdf` que nos permitirán evaluar la densidad de probabilidad.<jupyter_code>from scipy.stats import multivariate_normal<jupyter_output><empty_output><jupyter_text>A continuación definimos los parámetros que vamos a utilizar para nuestra variable aleatoria gausiana en 2D e inicializamos una instancia que llamamos `gauss_2d_rv`.Si quisieramos que la gausiana fuera en más dimensiones, basta con darle las dimensiones correctas a los parámetros `mu` y `sigma`.<jupyter_code>rho =  -0.5
mu = [mu_x, mu_y]
sigma = [[sigma_x**2             , rho * sigma_x * sigma_y],
         [rho * sigma_x * sigma_y,              sigma_y**2]]

gauss_2d_rv = multivariate_normal(mu, sigma)<jupyter_output><empty_output><jupyter_text>La forma en que está implementada `multivariate_normal.pdf` requiere que se le entregue un set de posiciones en un formato específico. El ejemplo a continuación demuestra cómo hacerlo.<jupyter_code>x_grid, y_grid

posiciones = np.empty(x_grid.shape + (2,))
posiciones[:, :, 0] = x_grid
posiciones[:, :, 1] = y_grid

prior_scipy = gauss_2d_rv.pdf(posiciones)<jupyter_output><empty_output><jupyter_text>Finalmente podemos visualizar la gausiana que acabamos de calcular.<jupyter_code>fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.set_aspect('equal')
plt.pcolormesh(x_grid, y_grid, prior_scipy)

plt.xlabel('x')
plt.ylabel('y');<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10395277207392196, 'fraction_numerical': 0.013090349075975359, 'mean_word_length': 4.375172413793104, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 6, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '263650', 'license': 'MIT', 'n_tokens_mistral': 1494, 'n_tokens_neox': 1436, 'n_words': 393, 'path': 'prior-gausiano.ipynb', 'repo_name': 'uchileFI3104B-2019B/demo-bayes', 'size': '3896'}