{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# MANUAL DE LABORATORIO DE COMUNICACIONES DIGITALES: PYTHON\n", "F. Javier Payán Somet, Juan José Murillo-Fuentes, José Carlos Aradillas Jaramillo \\\n", "_Departamento de Teoría de la Señal y Comunicaciones_ \\\n", "_Escuela Técnica Superior de Ingeniería_ \\\n", "_Universidad de Sevilla_ \n", "\n", "# Tema 3. Test de Hipótesis\n", "\n", "**Este notebook contiene código del Tema 3**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<table align=\"left\">\n", " <td>\n", " <a target=\"_blank\" href=\"https://colab.research.google.com/github/gapsc-us/labcomdig/blob/main/Tema3.Test_de_Hipotesis.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n", " </td>\n", "</table>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inicialización" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Python ≥3.5 is required\n", "import sys\n", "assert sys.version_info >= (3, 5)\n", "\n", "# Numpy ≥1.16 is required\n", "import numpy as np\n", "assert np.__version__ >= \"1.16\"\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Probabilidad de error" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Probabilidad de error en el caso binario" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Código 3.2**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cálculo de la probabilidad de error con ruido gaussiano y caso binario\n", "Umbral MAP, g: -0.27\n", "P_e para el detector MAP: 1.92E-02\n", "Umbral ML, g: 0.00\n", "P_e para el detector ML: 2.28E-02\n" ] } ], "source": [ "# Rango de valores del vector de observación \n", "paso = 1e-6\n", "r = np.arange(-10,10,paso)\n", "\n", "# Probabilidades a priori\n", "P_0=1/4\n", "P_1=1-P_0\n", "\n", "# Valores de la variable aleatoria mensaje\n", "X_0 = -2\n", "X_1 = +2\n", "\n", "# Varianza del ruido aditivo en el canal\n", "vza = 1;\n", "\n", "# Funciones densidad de probabilidad condicionales\n", "f_0 = (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_0)**2)/(2*vza)) # Caso X=X_0 \n", "f_1 = (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_1)**2)/(2*vza)) # Caso X=X_1\n", "\"\"\"Alternativamente\n", "from labcomdig import fdpnormal\n", "f_0 = fdpnormal(r,X_0,vza)\n", "f_1 = fdpnormal(r,X_1,vza)\n", "\"\"\"\n", "\n", "# Encontrar la frontera de la región de decisión g con el detector MAP\n", "indexUmbral = np.where(P_1*f_1 > P_0*f_0)[0][0]\n", "g = r[indexUmbral]\n", "\"\"\" Alternativamente\n", "g = r[np.where(P_1*f_1 > P_0*f_0)][0] \n", "#Primer valor (índice [0]) en el que P1f1>P0f0\n", "\"\"\" \n", "print('Cálculo de la probabilidad de error con ruido gaussiano y caso binario')\n", "print('Umbral MAP, g: {:.2f}'.format(g))\n", "\n", "# Calcular las integrales de manera aproximada\n", "PC_0 = np.sum(f_0[:indexUmbral])*paso # Pb de detección correcta si se transmite un cero\n", "PC_1 = np.sum(f_1[indexUmbral:])*paso # Pb de detección correcta si se transmite un uno\n", "\"\"\"Alternativamente\n", "from scipy.integrate import quad\n", "F_0 = lambda r: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_0)**2)/(2*vza)) \n", "PC_0 = quad(F_0,y[0],g)[0]\n", "F_1 = lambda r: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_1)**2)/(2*vza)) \n", "PC_1 = quad(F_1,g,y[-1])[0]\n", "\"\"\"\n", "\n", "# La probabilidad correcta en el caso MAP\n", "PC = P_0*PC_0 + P_1*PC_1\n", "\n", "# La probabilidad de error en el caso MAP\n", "PE = 1 - PC\n", "print('P_e para el detector MAP: {:.2E}'.format(PE))\n", "\n", "# Encontrar la frontera de la región de decisión g con el detector ML\n", "indexUmbral = np.where(f_1 > f_0)[0][0]\n", "g = r[indexUmbral]\n", "\"\"\" Alternativamente\n", "g = y[np.where(P_1*f_1 > P_0*f_0)][0] \n", "Primer valor (índice [0]) en el que P1f1>P0f0\n", "\"\"\" \n", "print('Umbral ML, g: {:.2f}'.format(g))\n", "\n", "# Calcular las integrales de manera aproximada\n", "PC_0 = np.sum(f_0[:indexUmbral])*paso\n", "PC_1 = np.sum(f_1[indexUmbral:])*paso\n", "\"\"\"Alternativamente\n", "from scipy.integrate import quad\n", "F_0 = lambda y: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((y-X_0)**2)/(2*vza)) \n", "PC_0 = quad(F_0,y[0],g)[0]\n", "F_1 = lambda y: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((y-X_1)**2)/(2*vza)) \n", "PC_1 = quad(F_1,g,y[-1])[0]\n", "\"\"\"\n", "\n", "# La probabilidad correcta en el caso ML\n", "PC = P_0*PC_0 + P_1*PC_1\n", "\n", "# La probabilidad de error en el caso ML\n", "PE = 1 - PC\n", "print('P_e para el detector ML: {:.2E}'.format(PE))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Ejercicio propuesto" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En un problema de test de hipótesis como el mostrado en la Figura 3.10, la variable aleatoria $X$ toma los valores {1, -1} con probabilidades 1/4 y 3/4 respectivamente. Se tiene que la variable aleatoria $N$ viene dada por $N = N_1 + N_2$, con $N_1$ y $N_2$ dos variables aleatorias uniformemente distribuidas entre [−1,1].\n", "\n", " <img src=https://raw.githubusercontent.com/gapsc-us/labcomdig/main/figures/deteccionBinP3.png style=\"max-width:40%;width:auto;height:auto;\" align=\"center\">" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.** Generar $N_p=1e6$ muestras de la variable aleatoria $X$. Representar su función masa de probabilidad estimada." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.** Generar $N_p=1e6$ muestras de la variable aleatoria $N$. Representar su función densidad de probabilidad estimada" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3.** Representar las estimaciones de las funciones densidad de probabilidad condicional $f_{R|X=-1}(r|X =-1)$ y $f_{R|X=1}(r|X=1)$." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4.** Representar en una misma gráfica $qf_{R|X=-1}(r|X=-1)$ y $pf_{R|X=1}(r|X=1)$, siendo $p$ y $q$ las probabilidades a priori de la variable aleatoria $X$; esto es, $p = P(X=+1)$ y $q = P(X=-1)$." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**5.** Encontrar experimentalmente la frontera de la región de decisión cuando el detector utiliza una regla MAP y cuando utiliza una regla ML." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**6.** Calcular las probabilidades $P_e(-1|Tx)$ y $P_e(+1|Tx)$ para el caso MAP y el caso ML" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**7.** Calcular la probabilidad de error del detector cuando siga las reglas MAP y ML." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**8.** Proponer una estimación de estas probabilidades de forma experimental y comprobar su coincidencia (o no) con el cálculo teórico" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " a) A partir de las estimaciones de las funciones densidad de probabilidad." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ " b) A partir de conteo de muestras erróneas en el receptor" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 2 }