clase:iabd:pia:1eval:tema04
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Revisión previa | |||
| — | clase:iabd:pia:1eval:tema04 [2025/11/12 16:01] (actual) – [Mini-proyecto] Lorenzo | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | ====== 4. Gráficos ====== | ||
| + | En este tema vamos a ver como crear gráficos en Python. | ||
| + | |||
| + | Para hacer gráficas hay varias librerías: | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | |||
| + | Mas información: | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * Guía | ||
| + | * {{ : | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * Colores: | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | Antes de empezar mira estas 2 gráficas (Shelly y Tuya) y dime si se parecen: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Obviamente no se parecen | ||
| + | |||
| + | Y ahora mira esta otra gráfica y dime si ahora se parecen (Shelly y Tuya): | ||
| + | |||
| + | {{: | ||
| + | |||
| + | En esta se parecen más. | ||
| + | |||
| + | Realmente la primera gráfica es el final de la segunda gráfica pero ambas gráficas están en una escala distinta. | ||
| + | |||
| + | El ejemplo está puesto para que se vea como se interpreta de una forma u otra una gráfica según la escala a la que esté. La primera gráfica está en la escala [ 650 W - 1050 W ] mientras que la segunda gráfica su escala es [0 W - 2500 W] | ||
| + | |||
| + | Por lo tanto, intenta que siempre las gráficas empiecen los ejes en 0. | ||
| + | |||
| + | Otro ejemplo lo tenemos en el siguiente video de Yotube: [[https:// | ||
| + | ===== Instalación e importación===== | ||
| + | |||
| + | ==== Instalación ==== | ||
| + | |||
| + | * Instalación con conda | ||
| + | |||
| + | <sxh shell> | ||
| + | conda install matplotlib | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | |||
| + | ==== Importación ==== | ||
| + | |||
| + | |||
| + | * Importar matplotlib | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Introducción ===== | ||
| + | La base de los gráficos en Python es Matplotlib. Con esta librería hay una serie de conceptos que debemos conocer. Los nombres de los conceptos los vamos a decir en inglés para que se parezcan mas a los métodos, clases o argumentos de las librerías. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | <note warning> | ||
| + | No confundir '' | ||
| + | </ | ||
| + | |||
| + | * Crear la primera figura con su gráfica | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot() | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Hemos creado una figura con '' | ||
| + | |||
| + | < | ||
| + | ¿Porqué se llama el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | print(type(axes)) | ||
| + | </ | ||
| + | |||
| + | <sxh base> | ||
| + | <class ' | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | ===== Organizar Axes ===== | ||
| + | Veamos ahora como podemos organizar varias '' | ||
| + | |||
| + | El método '' | ||
| + | |||
| + | * Crea una rejilla de 2 filas , 2 columnas y añadir 3 gráficos en la posición ,en la posición 2 y en la posición 4 (la posición 3 se deja vacía) | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot(2, | ||
| + | axes = figure.add_subplot(2, | ||
| + | axes = figure.add_subplot(2, | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Crea una rejilla de 2 filas , 1 columna y añadir 2 gráficos en la posición 1 y la posición 2. | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes1 = figure.add_subplot(2, | ||
| + | axes2 = figure.add_subplot(2, | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | * Crea una rejilla de 1 fila , 2 columnas y añadir 2 gráficos en la posición 1 y la posición 2. | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes1 = figure.add_subplot(1, | ||
| + | axes2 = figure.add_subplot(1, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | * Mezclar 2 organizaciones para figuras que no sean iguales. | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot(2, | ||
| + | axes = figure.add_subplot(2, | ||
| + | axes = figure.add_subplot(1, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Mezclar 2 organizaciones para figuras que no sean iguales. | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes1 = figure.add_subplot(2, | ||
| + | axes2 = figure.add_subplot(2, | ||
| + | axes3 = figure.add_subplot(2, | ||
| + | </ | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | * Mezclar 2 organizaciones para figuras que no sean iguales. | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes1 = figure.add_subplot(3, | ||
| + | axes2 = figure.add_subplot(3, | ||
| + | axes3 = figure.add_subplot(3, | ||
| + | axes4 = figure.add_subplot(2, | ||
| + | axes5 = figure.add_subplot(2, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Mas información: | ||
| + | * [[https:// | ||
| + | |||
| + | ===== Figura ===== | ||
| + | Acabamos de ver como colocar cada gráfica dentro de la figura. Ahora veremos unas cosas mas sobre ella. | ||
| + | |||
| + | |||
| + | * Para hacer la figura mas grande solo hay que indicar el tamaño con el argumento '' | ||
| + | |||
| + | <sxh python> | ||
| + | figure=plt.figure(figsize=(15, | ||
| + | </ | ||
| + | |||
| + | El tamaño es el ancho y el alto en **pulgadas**. | ||
| + | |||
| + | |||
| + | * Para indicar el título , el color y el tamaño de letra se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | figure.suptitle(" | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Por último podemos grabar la figura entera con '' | ||
| + | |||
| + | <sxh python> | ||
| + | figure.savefig(" | ||
| + | </ | ||
| + | |||
| + | El argumento '' | ||
| + | |||
| + | |||
| + | |||
| + | ==== Subfiguras ==== | ||
| + | Además de '' | ||
| + | |||
| + | Para ello se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | subfigure_a, | ||
| + | </ | ||
| + | |||
| + | Veamos un ejemplo: | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure(figsize=(8, | ||
| + | figure.suptitle(" | ||
| + | |||
| + | subfigures = figure.subfigures(nrows=2, | ||
| + | subfigure_a=subfigures[0] | ||
| + | subfigure_b=subfigures[1] | ||
| + | |||
| + | subfigure_a.suptitle(" | ||
| + | axes_1 = subfigure_a.add_subplot(1, | ||
| + | axes_1.set_title(" | ||
| + | axes_2 = subfigure_a.add_subplot(1, | ||
| + | axes_2.set_title(" | ||
| + | |||
| + | subfigure_b.suptitle(" | ||
| + | axes_3 = subfigure_b.add_subplot(1, | ||
| + | axes_3.set_title(" | ||
| + | axes_4 = subfigure_b.add_subplot(1, | ||
| + | axes_4.set_title(" | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Proyecciones ==== | ||
| + | Indicar como es la proyección de los ejes. | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | figure=plt.figure(figsize=(15, | ||
| + | figure.suptitle(" | ||
| + | |||
| + | |||
| + | |||
| + | axes1 = figure.add_subplot(1, | ||
| + | axes1.set_title(" | ||
| + | |||
| + | axes2 = figure.add_subplot(1, | ||
| + | axes2.set_title(" | ||
| + | |||
| + | axes3 = figure.add_subplot(1, | ||
| + | axes3.set_title(" | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Clase Figura ==== | ||
| + | La siguiente clase permite simplificar la creación de '' | ||
| + | <sxh python> | ||
| + | class Figura: | ||
| + | def __init__(self, | ||
| + | self.ncols=ncols | ||
| + | self.num_axes=naxes | ||
| + | self.nrows=math.ceil(naxes/ | ||
| + | if axes_height_inches==None: | ||
| + | axes_height_inches=axes_width_inches*0.86 | ||
| + | |||
| + | self.figure, | ||
| + | layout=" | ||
| + | |||
| + | if isinstance(self.arr_axes, | ||
| + | self.arr_axes=np.array([[self.arr_axes]]) | ||
| + | |||
| + | def get_axes(self): | ||
| + | return np.array(self.arr_axes).reshape(-1) | ||
| + | </ | ||
| + | |||
| + | |||
| + | El uso de la clase es la siguiente. | ||
| + | |||
| + | Imagina que quieres mostrar 12 '' | ||
| + | |||
| + | <sxh python> | ||
| + | figura=Figura(ncols=3, | ||
| + | |||
| + | for axes in figura.get_axes(): | ||
| + | axes.plot() | ||
| + | </ | ||
| + | |||
| + | |||
| + | La ventaja de esta clase es que no te tienes que preocupar del número de filas que va a haber. Que en este caso serán 4 | ||
| + | ===== Dibujando en 2D ===== | ||
| + | Ahora veamos una serie de métodos para dibujar en un '' | ||
| + | |||
| + | * Para dibujar una serie de puntos se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=np.array([0, | ||
| + | y=np.array([0, | ||
| + | |||
| + | axes.scatter(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Para dibujar una línea siguiendo una serie de puntos se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=np.array([0, | ||
| + | y=np.array([0, | ||
| + | |||
| + | axes.plot(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Para dibujar una diagrama de barras en base a una serie de puntos se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=np.array([0, | ||
| + | y=np.array([0, | ||
| + | |||
| + | axes.bar(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * En un mismo '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x1=np.array([0, | ||
| + | y1=np.array([0, | ||
| + | |||
| + | x2=np.array([0, | ||
| + | y2=np.array([-1, | ||
| + | |||
| + | axes.plot(x1, | ||
| + | axes.scatter(x2, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Dibujando en 3D ===== | ||
| + | Ahora veamos una serie de métodos para dibujar en un '' | ||
| + | |||
| + | * Para dibujar una serie de puntos se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot(projection=' | ||
| + | |||
| + | x=np.array([0, | ||
| + | y=np.array([0, | ||
| + | z=np.array([0, | ||
| + | |||
| + | axes.scatter(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | * Para dibujar una línea siguiendo una serie de puntos se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot(projection=' | ||
| + | |||
| + | x=np.array([0, | ||
| + | y=np.array([0, | ||
| + | z=np.array([0, | ||
| + | |||
| + | axes.plot(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | * Para dibujar una superficie en 3D se usa '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure(figsize=(8, | ||
| + | axes = figure.add_subplot(projection=' | ||
| + | |||
| + | x=np.linspace(-3, | ||
| + | y=np.linspace(-3, | ||
| + | x, | ||
| + | z = 3*(1 - x)**2 * np.exp(-x**2 - (y + 1)**2) | ||
| + | |||
| + | axes.plot_surface(x, | ||
| + | </ | ||
| + | |||
| + | $$z=3(1-x)^2e^{-x^2-(y+1)^2}-10(\frac{x}{5}-x^3-y^5)e^{-x^2-y^2}-\frac{1}{3}e^{-(x+1)^2-y^2}$$ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | <note tip> | ||
| + | Si queremos interaccionar con el gráfico en 3D para poder rotarlo y así verlo mejor , debemos hacer lo siguiente: | ||
| + | |||
| + | Añadir lo siguiente antes de los imports | ||
| + | <sxh python> | ||
| + | %matplotlib widget | ||
| + | </ | ||
| + | |||
| + | o | ||
| + | |||
| + | <sxh python> | ||
| + | %matplotlib ipympl | ||
| + | </ | ||
| + | |||
| + | y previamente haber instalado '' | ||
| + | |||
| + | <sxh base> | ||
| + | conda install -c conda-forge ipympl | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | Si queremos variar la posición de la cámara lo podemos hacer con: | ||
| + | <sxh python> | ||
| + | axes.view_init(45, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | * Tambien podemos dibujar la superficie si solo tenemos unos pocos puntos y que interpole el resto. Para interpolar los puntos usamos '' | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | import numpy as np | ||
| + | import matplotlib.pyplot as plt | ||
| + | from scipy.interpolate import griddata | ||
| + | |||
| + | def get_points_surface(x, | ||
| + | xi = np.linspace(min(x), | ||
| + | yi = np.linspace(min(y), | ||
| + | meshgrid_x, meshgrid_y = np.meshgrid(xi, | ||
| + | |||
| + | # Interpola los valores z en la malla | ||
| + | meshgrid_z= griddata((x, | ||
| + | |||
| + | return meshgrid_x, | ||
| + | |||
| + | # Tenemos solo 50 puntos | ||
| + | x = np.array([ 0.30478742, | ||
| + | 2.37775853, -2.24648814, | ||
| + | | ||
| + | 0.5451769 , -2.85610871, | ||
| + | | ||
| + | 1.68188859, -1.16181881, | ||
| + | 2.85597253, | ||
| + | | ||
| + | | ||
| + | 2.16320348, | ||
| + | y = np.array([-1.76753793, | ||
| + | | ||
| + | | ||
| + | | ||
| + | 1.14886507, | ||
| + | | ||
| + | | ||
| + | 0.24611804, | ||
| + | 1.35791699, -0.11856026, | ||
| + | 2.4838516 , 0.80199338, -0.80435649, | ||
| + | z = 3*(1 - x)**2 * np.exp(-x**2 - (y + 1)**2) | ||
| + | |||
| + | |||
| + | meshgrid_x, | ||
| + | |||
| + | |||
| + | figure = plt.figure(figsize=(10, | ||
| + | axes = figure.add_subplot(projection=' | ||
| + | axes.plot_surface(meshgrid_x, | ||
| + | |||
| + | # Añadimos los puntos originales | ||
| + | axes.scatter(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | * Otra forma de dibujar superficies en 3D es mostrar el eje Z como colores similar a las curvas de nivel en los mapas topográficos, | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure(figsize=(8, | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=np.linspace(-3, | ||
| + | y=np.linspace(-3, | ||
| + | x, | ||
| + | z = 3*(1 - x)**2 * np.exp(-x**2 - (y + 1)**2) | ||
| + | |||
| + | axes.contourf(x, | ||
| + | </ | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ===== Dibujando en 4D ===== | ||
| + | Dibujar en 4D no es posible pero si lo que queremos es representar 2 variables en función de otras 2 variables , si que es posible mediante las siguientes técnicas: | ||
| + | * Variar el tamaño del punto en función de una variable | ||
| + | * Variar el color del punto en función de otra variable | ||
| + | |||
| + | Las 4 variables se mostrarían como: | ||
| + | * Eje X | ||
| + | * Eje Y | ||
| + | * Color | ||
| + | * Tamaño | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | | ||
| + | figure=plt.figure(figsize = (10, 7)) | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | random_state = np.random.RandomState(0) | ||
| + | x = random_state.randn(100) | ||
| + | y = random_state.randn(100) | ||
| + | color = random_state.randn(100) | ||
| + | size = 500 * random_state.randn(100) | ||
| + | |||
| + | |||
| + | scatter=axes.scatter(x, | ||
| + | figure.colorbar(scatter, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Usamos el parámetro '' | ||
| + | |||
| + | ===== Dibujando en 5D ===== | ||
| + | La técnica anterior se puede aplicar a una gráfica en 3D con lo que conseguimos representar hasta 5 variables distintas. | ||
| + | |||
| + | Las 5 variables se mostrarían como: | ||
| + | * Eje X | ||
| + | * Eje Y | ||
| + | * Eje Z | ||
| + | * Color | ||
| + | * Tamaño | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure(figsize = (16, 9)) | ||
| + | axes = figure.add_subplot(projection =" | ||
| + | |||
| + | random_state = np.random.RandomState(0) | ||
| + | x = random_state.randn(100) | ||
| + | y = random_state.randn(100) | ||
| + | z = random_state.randn(100) | ||
| + | color = random_state.randn(100) | ||
| + | size = 500 * random_state.randn(100) | ||
| + | |||
| + | |||
| + | scatter=axes.scatter(x, | ||
| + | figure.colorbar(scatter, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ===== Histogramas ===== | ||
| + | Los histogramas consisten el mostrar la frecuencia con la que aparecen los valores en una secuencia unidimensional de datos. Podríamos pensar que son como diagramas de barras pero la información que muestran es de naturaleza distinta. En un diagrama de barras el origen de los datos es pares de números '' | ||
| + | |||
| + | Para hacer histogramas no vamos a usar la librería '' | ||
| + | |||
| + | * Para dibujar un histograma se usa el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import numpy as np | ||
| + | import matplotlib.pyplot as plt | ||
| + | import seaborn as sns | ||
| + | |||
| + | figure=plt.figure(figsize = (6, 6)) | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=[0, | ||
| + | |||
| + | sns.histplot(x=x, | ||
| + | </ | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | <note tip> | ||
| + | * Es necesaior importar la librería de seaborn con: | ||
| + | <sxh python> | ||
| + | import seaborn as sns | ||
| + | </ | ||
| + | |||
| + | * El método '' | ||
| + | <sxh python> | ||
| + | sns.histplot(x=x, | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | * Para dibujar el //Kernel density estimation// | ||
| + | <sxh python> | ||
| + | import numpy as np | ||
| + | import matplotlib.pyplot as plt | ||
| + | import seaborn as sns | ||
| + | |||
| + | figure=plt.figure(figsize = (6, 6)) | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=[0, | ||
| + | |||
| + | sns.kdeplot(x=x, | ||
| + | </ | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | <note tip>Si nos fijamos la escala del eje Y ya no es la frecuencia absoluta sino relativa</ | ||
| + | |||
| + | * Si queremos mostrar tanto el histograma como el KDE se usa el método '' | ||
| + | <sxh python> | ||
| + | import numpy as np | ||
| + | import matplotlib.pyplot as plt | ||
| + | import seaborn as sns | ||
| + | |||
| + | figure=plt.figure(figsize = (6, 6)) | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=[0, | ||
| + | |||
| + | sns.histplot(x=x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | < | ||
| + | Vemos que las curvas KDE de '' | ||
| + | |||
| + | <sxh python> | ||
| + | sns.histplot(x=x, | ||
| + | sns.kdeplot(x=x, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | * Para dibujar el KDE pero para comparar 2 distribuciones, | ||
| + | |||
| + | <sxh python> | ||
| + | import numpy as np | ||
| + | import matplotlib.pyplot as plt | ||
| + | import seaborn as sns | ||
| + | |||
| + | figure=plt.figure(figsize = (6, 6)) | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x | ||
| + | tipo=[0, | ||
| + | |||
| + | sns.kdeplot(x=x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ===== Dibujando imágenes ===== | ||
| + | Vamos ahora a tratar imágenes | ||
| + | |||
| + | * Se pueden dibujar imágenes, simplemente indicando los colores de cada pixel como un tensor de colores. | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | imagen=np.array([[[255, | ||
| + | |||
| + | axes.xaxis.set_ticks([0, | ||
| + | axes.yaxis.set_ticks([0, | ||
| + | axes.imshow(imagen) | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ===== Personalización ===== | ||
| + | Veamos ahora una serie de métodos y parámetros para personalizar los '' | ||
| + | |||
| + | ==== Datos ==== | ||
| + | |||
| + | |||
| + | * Leyendas de los datos. En los métodos de '' | ||
| + | |||
| + | <sxh python> | ||
| + | axes.plot(x1, | ||
| + | axes.scatter(x2, | ||
| + | axes.legend(fontsize=15, | ||
| + | </ | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | También es posible mostrar la leyenda poniendo los nombres directamente en el módulo '' | ||
| + | |||
| + | <sxh python> | ||
| + | axes.plot(x1, | ||
| + | axes.scatter(x2, | ||
| + | axes.legend(fontsize=15, | ||
| + | </ | ||
| + | |||
| + | |||
| + | * Leyendas para colores: Podemos usar leyendas para cada tipo de color si mostramos los puntos con colores distintos. Para ello en el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure(figsize = (10, 7)) | ||
| + | axes = figure.add_subplot() | ||
| + | | ||
| + | random_state = np.random.RandomState(0) | ||
| + | x = random_state.randn(100) | ||
| + | y = random_state.randn(100) | ||
| + | tipo = random_state.randint(5, | ||
| + | labels_tipos=[" | ||
| + | | ||
| + | | ||
| + | scatter=axes.scatter(x, | ||
| + | legends=axes.legend(handles=scatter.legend_elements()[0], | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Si queremos saber el color que ha usado en cada tipo para poder reusar ese color para otra cosa, lo podemos hacer con: | ||
| + | |||
| + | <sxh python> | ||
| + | index=0 | ||
| + | color=legends.get_lines()[index].get_color() | ||
| + | </ | ||
| + | |||
| + | Siendo '' | ||
| + | |||
| + | * Colores de los datos. Solo hay que indicar el argumento de '' | ||
| + | |||
| + | <sxh python> | ||
| + | axes.plot(x1, | ||
| + | axes.scatter(x2, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | También podemos obtener el siguiente color que vamos a usar con: | ||
| + | <sxh python> | ||
| + | #Versiones nuevas | ||
| + | color=axes._get_lines.get_next_color() | ||
| + | #Versiones antiguas | ||
| + | color=next(axes._get_lines.prop_cycler)[' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | Destacar que al obtener el siguiente color ya no se usará ya que ese color se ha " | ||
| + | Aunque obviamente se podría usar el color ya que tenemos el color en la variable '' | ||
| + | </ | ||
| + | |||
| + | * Con el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | import matplotlib.pyplot as plt | ||
| + | import numpy as np | ||
| + | |||
| + | figure=plt.figure() | ||
| + | axes = figure.add_subplot() | ||
| + | |||
| + | x=np.array([0, | ||
| + | y=np.array([0, | ||
| + | labels=[" | ||
| + | |||
| + | axes.scatter(x, | ||
| + | |||
| + | for index,label in enumerate(labels): | ||
| + | axes.annotate(label, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Al usar '' | ||
| + | |||
| + | <sxh python> | ||
| + | axes.plot(x1, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Títulos ==== | ||
| + | Establecer el título de cada eje '' | ||
| + | |||
| + | <sxh python> | ||
| + | axes.set_xlabel(' | ||
| + | axes.set_ylabel(' | ||
| + | axes.set_title(" | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <note tip> | ||
| + | No confundir el título del '' | ||
| + | </ | ||
| + | |||
| + | <note warning> | ||
| + | Cuando ponemos varios '' | ||
| + | |||
| + | <sxh python> | ||
| + | figure.tight_layout() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Color del Fondo ==== | ||
| + | |||
| + | * Establecer el color del fondo con '' | ||
| + | |||
| + | <sxh python> | ||
| + | axes.set_facecolor("# | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Ejes ==== | ||
| + | |||
| + | * Datos a mostrar en los ejes junto con el color , tamaño de fuente y el min/max | ||
| + | |||
| + | <sxh python> | ||
| + | axes.xaxis.set_ticks([0, | ||
| + | axes.yaxis.set_ticks([0, | ||
| + | |||
| + | axes.tick_params(axis=' | ||
| + | axes.tick_params(axis=' | ||
| + | |||
| + | axes.set_xlim(xmin=0, | ||
| + | axes.set_ylim(ymin=0, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * guías interiores (grid) | ||
| + | |||
| + | <sxh python> | ||
| + | axes.grid(visible=True, | ||
| + | axes.set_axisbelow(True) | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <note tip> | ||
| + | Incluir '' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | se pueden añadir también las guías interiores con: | ||
| + | <sxh python> | ||
| + | axes.minorticks_on() | ||
| + | axes.grid(b=True, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | Se puede hacer que automáticamente se creen los " | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Siendo los '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | * Que se importan como: | ||
| + | <sxh python> | ||
| + | from matplotlib.ticker import NullLocator | ||
| + | from matplotlib.ticker import MultipleLocator | ||
| + | from matplotlib.ticker import FixedLocator | ||
| + | from matplotlib.ticker import LinearLocator | ||
| + | from matplotlib.ticker import IndexLocator | ||
| + | from matplotlib.ticker import AutoLocator | ||
| + | from matplotlib.ticker import MaxNLocator | ||
| + | from matplotlib.ticker import LogLocator | ||
| + | </ | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Mas información: | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | </ | ||
| + | |||
| + | * Hacer que los valores de los ejes siempre sean número enteros y no con decimales | ||
| + | |||
| + | <sxh python> | ||
| + | from matplotlib.ticker import MaxNLocator | ||
| + | |||
| + | axes.xaxis.set_major_locator(MaxNLocator(integer=True)) | ||
| + | </ | ||
| + | |||
| + | * Configurar las líneas de los ejes. Se pueden hacer invisibles o cambiar el color | ||
| + | |||
| + | <sxh python> | ||
| + | axes.spines[' | ||
| + | axes.spines[' | ||
| + | axes.spines[' | ||
| + | axes.spines[' | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Superficies ==== | ||
| + | |||
| + | * Al dibujar una superficie en 3D, podemos cambiar los colores en función del valor de '' | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | axes.plot_surface(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | axes.contourf(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <note tip> | ||
| + | El '' | ||
| + | |||
| + | <sxh python> | ||
| + | axes.plot_surface(x, | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | * Podemos añadir una barra con los colores con el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | surface=axes.plot_surface(x, | ||
| + | figure.colorbar(surface, | ||
| + | </ | ||
| + | |||
| + | Otra forma de hacerlo es la siguiente: | ||
| + | <sxh python> | ||
| + | figure.colorbar(plt.cm.ScalarMappable(cmap=plt.cm.turbo), | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Se pueden añadir sombreado a la imagen para que quede mas realista. | ||
| + | |||
| + | <sxh python> | ||
| + | from matplotlib.colors import LightSource | ||
| + | |||
| + | light_source = LightSource() | ||
| + | facecolors = light_source.shade(z, | ||
| + | |||
| + | axes.plot_surface(x, | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== Estableciendo el estilo ==== | ||
| + | Es posible establecer el estilo general que usan los gráficos en mathplotlib. Es decir que tengan ya un aspecto predefinido. | ||
| + | |||
| + | Simplemente con la línea '' | ||
| + | |||
| + | Haciendo que los gráficos pasen de tener este estilo por defecto: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | a tener este otro estilo: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Para saber los posibles estilos que hay , solo tenemos que ejecutar: | ||
| + | <sxh python> | ||
| + | print(plt.style.available) | ||
| + | </ | ||
| + | |||
| + | <sxh python> | ||
| + | [ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ] | ||
| + | </ | ||
| + | |||
| + | Como podemos ver hay muchos estilos relacionados con [[https:// | ||
| + | |||
| + | |||
| + | ==== Mostrar perdida por época ==== | ||
| + | Una gráfica que siempre es necesaria es mostrar el " | ||
| + | |||
| + | Es similar a la siguiente gráfica: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Pero ahora asignado un valor de " | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | Sin embargo no se hace nunca como algo animado sino simplemente se muestra la última gráfica: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Definir el propio estilo ==== | ||
| + | Normalmente queremos que todas nuestras gráficas tengan un mismo estilo , por ello es bueno crear una serie de funciones estándar que siempre usaremos. | ||
| + | |||
| + | * La primera función que usamos se llama '' | ||
| + | |||
| + | <sxh python> | ||
| + | def axes_configure_labels(axes, | ||
| + | color="# | ||
| + | facecolor="# | ||
| + | gridcolor="# | ||
| + | tickcolor="# | ||
| + | fontsize_label=13 | ||
| + | |||
| + | axes.set_xlabel(xlabel, | ||
| + | axes.set_ylabel(ylabel, | ||
| + | axes.set_title(title, | ||
| + | |||
| + | axes.set_facecolor(facecolor) | ||
| + | axes.spines[' | ||
| + | axes.spines[' | ||
| + | axes.spines[' | ||
| + | axes.spines[' | ||
| + | axes.tick_params(axis=' | ||
| + | |||
| + | axes.grid(visible=True, | ||
| + | axes.set_axisbelow(True) | ||
| + | |||
| + | handles, labels = axes.get_legend_handles_labels() | ||
| + | if labels: | ||
| + | axes.legend(fontsize=fontsize_label-2, | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | * La siguiente función es '' | ||
| + | |||
| + | <sxh python> | ||
| + | def axes_configure_axis_for_metrics(axes): | ||
| + | axes.set_xlim(xmin=0, | ||
| + | axes.set_ylim(ymin=0, | ||
| + | |||
| + | axes.xaxis.set_major_locator(MultipleLocator(0.1)) | ||
| + | axes.yaxis.set_major_locator(MultipleLocator(0.1)) | ||
| + | </ | ||
| + | |||
| + | |||
| + | * Para mostrar las gráficas de la pérdida en función de las épocas se usarán las funciones '' | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | def axes_configure_axis_for_epochs(axes, | ||
| + | axes.xaxis.set_major_locator(MaxNLocator(10, | ||
| + | axes.yaxis.set_major_locator(LinearLocator(10)) | ||
| + | axes.set_ylim(ymin=0, | ||
| + | </ | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | def plot_history_metric(axes, | ||
| + | |||
| + | if (label==None): | ||
| + | label=metric_name | ||
| + | |||
| + | axes.plot(history[metric_name], | ||
| + | axes.plot(history[' | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Usándose así: | ||
| + | |||
| + | <sxh python> | ||
| + | figure=plt.figure(figsize=(6, | ||
| + | axes=figure.add_subplot(1, | ||
| + | |||
| + | plot_history_metric(axes, | ||
| + | axes_configure_labels(axes," | ||
| + | axes_configure_axis_for_epochs(axes, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Ejercicios ===== | ||
| + | |||
| + | ==== Ejercicio 1: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 2: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 3: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 4: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 5: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | |||
| + | ==== Ejercicio 6: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 7: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 8: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | |||
| + | ==== Ejercicio 9: Layout ==== | ||
| + | Crea una figura con los siguientes subplots: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 10: tipos de gráficos 2D ==== | ||
| + | Dado las variables '' | ||
| + | <sxh python> | ||
| + | x=[-3. | ||
| + | y=[0.00443185, | ||
| + | </ | ||
| + | |||
| + | * Dibuja en una figura '' | ||
| + | * Dibuja en una figura '' | ||
| + | * Dibuja en una figura '' | ||
| + | * Dibuja en una figura '' | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | |||
| + | ==== Ejercicio 11: Layouts ==== | ||
| + | Repite el ejercicio anterior pero ahora en una única figura como 4 subplots. Cada subplot deberá tener su título y la figura otro título | ||
| + | |||
| + | ==== Ejercicio 12: numpy, linspace y gráficas ==== | ||
| + | * Crea una variable llamada '' | ||
| + | * Crea una variable llamada '' | ||
| + | * Crea una figura en la que se muestre una línea de '' | ||
| + | |||
| + | Además: | ||
| + | * Añade un título a la figura | ||
| + | * Guarda la figura a disco | ||
| + | * El nombre del eje " | ||
| + | * El nombre del eje " | ||
| + | |||
| + | ==== Ejercicio 13: numpy, linspace y gráficas ==== | ||
| + | * Crea una variable llamada '' | ||
| + | * Crea una variable llamada '' | ||
| + | * Crea una figura en la que se muestre una línea de '' | ||
| + | * El nombre del eje " | ||
| + | * El nombre del eje " | ||
| + | * | ||
| + | ==== Ejercicio 14: numpy, linspace y gráficas ==== | ||
| + | * Crea una variable llamada '' | ||
| + | * Crea una variable llamada '' | ||
| + | * Crea una variable llamada '' | ||
| + | * Crea una figura en la que se muestre: | ||
| + | * Una línea de '' | ||
| + | * Una línea de '' | ||
| + | * Establece un título en la figura | ||
| + | * Muestra una leyenda de forma que cada línea se llame " | ||
| + | |||
| + | ==== Ejercicio 15.A ==== | ||
| + | Vamos a hacer un ejemplo sobre eficacia de la vacunación del COVID. | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | La siguiente función de python retorna 3 variables llamadas '' | ||
| + | |||
| + | <sxh python> | ||
| + | def get_data(): | ||
| + | size=150 | ||
| + | num_tipos=10 | ||
| + | pendiente_base=-8 | ||
| + | np.random.seed(6) | ||
| + | |||
| + | x=np.array([]) | ||
| + | y=np.array([]) | ||
| + | z=np.array([]) | ||
| + | x_ini=0 | ||
| + | y_ini=50 | ||
| + | z_ini=0 | ||
| + | x_ancho=8 | ||
| + | y_ancho=60 | ||
| + | x_inc=2 | ||
| + | y_inc=y_ancho-3 | ||
| + | z_int=10 | ||
| + | |||
| + | for i in range(0, | ||
| + | pendiente=np.random.uniform(pendiente_base-0.4, | ||
| + | x_tipo=np.random.uniform(x_ini, | ||
| + | y_tipo=np.random.uniform(y_ini, | ||
| + | z_tipo=np.full(size, | ||
| + | |||
| + | x=np.concatenate((x, | ||
| + | y=np.concatenate((y, | ||
| + | z=np.concatenate((z, | ||
| + | |||
| + | x_ini=x_ini+x_inc | ||
| + | y_ini=y_ini+y_inc | ||
| + | z_ini=z_ini+z_int | ||
| + | |||
| + | return x,y,z | ||
| + | </ | ||
| + | |||
| + | * La variable '' | ||
| + | * La variable '' | ||
| + | * La variable '' | ||
| + | |||
| + | Ahora haz lo siguiente: | ||
| + | * Muestra un gráfico mostrando | ||
| + | * En el eje X la cantidad de vacuna inyectada | ||
| + | * En el eje Y la cantidad de pacientes que se han enfermado con COVID cada 100.000 habitantes. | ||
| + | * Muestra nombre de los ejes | ||
| + | |||
| + | |||
| + | ==== Ejercicio 15.B ==== | ||
| + | Muestra ahora el mismo gráfico pero añadiendo: | ||
| + | * Haz una regresión lineal con los datos y añade esa recta a la gráfica. El color de la recta debe ser negra. | ||
| + | |||
| + | Para hacer la regresión usa la siguiente función: | ||
| + | <sxh python> | ||
| + | from sklearn.linear_model import LinearRegression | ||
| + | |||
| + | def get_recta_regresion(x, | ||
| + | model = LinearRegression() | ||
| + | model.fit(x.reshape(-1, | ||
| + | x_init=x.min() | ||
| + | y_init=model.predict([[x_init]])[0, | ||
| + | x_fin=x.max() | ||
| + | y_fin=model.predict([[x_fin]])[0, | ||
| + | |||
| + | return [x_init, | ||
| + | </ | ||
| + | |||
| + | Esta función retorna los puntos iniciales y finales de la recta de la regresión pero lo primero que retorna son las // | ||
| + | Se ha hecho así para que sea fácil de dibujar la recta con la función '' | ||
| + | |||
| + | // | ||
| + | // | ||
| + | |||
| + | Explica la relación entre mayor dosis de vacuna y la cantidad de pacientes que se han infectado con COVID. | ||
| + | |||
| + | ==== Ejercicio 15.C ==== | ||
| + | Muestra ahora el mismo gráfico pero añadiendo: | ||
| + | * Que se muestre cada punto de un color distinto según el rango de edad (La variable '' | ||
| + | * Muestra una leyenda para cada uno de los " | ||
| + | * Quita el ajuste lineal que habías hecho. | ||
| + | |||
| + | |||
| + | ==== Ejercicio 15.D ==== | ||
| + | Muestra ahora el mismo gráfico pero añadiendo: | ||
| + | * Añade ahora una regresión lineal pero ahora haz una regresión distinta para cada rango de edad. | ||
| + | |||
| + | |||
| + | Vuelve a explicar la relación entre mayor dosis de vacuna y la cantidad de pacientes que se han infectado con COVID pero teniendo en cuenta la edad. | ||
| + | |||
| + | Lo que acabas de observar se llama la paradoja de Simpson. [[https:// | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== Ejercicio 15.E ==== | ||
| + | Vuelve a explicar los datos anteriores si: | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Ahora vuelve a explicar los datos si: | ||
| + | * '' | ||
| + | |||
| + | |||
| + | <note important> | ||
| + | El ejemplo es totalmente inventado y no pretende tener relación con la realidad. | ||
| + | </ | ||
| + | |||
| + | ==== Ejercicio 16: plot_surface ==== | ||
| + | Dibuja una superficie en 3D , sabiendo que: | ||
| + | |||
| + | |||
| + | $$x \in [-15,15]$$ | ||
| + | |||
| + | $$y \in [-15,15]$$ | ||
| + | |||
| + | $$z =\frac {sin(\sqrt {x^2+y^2+4})}{\sqrt {x^2+y^2+4}}$$ | ||
| + | |||
| + | |||
| + | Haz que se muestre: | ||
| + | * En cada eje su nombre X, Y , Z. | ||
| + | * Con Sombreado | ||
| + | * Cambiando el color map para que sea el llamado '' | ||
| + | * Muestra el colorbar | ||
| + | |||
| + | ==== Ejercicio 17:contourf ==== | ||
| + | |||
| + | Dibuja una superficie en 3D pero como curvas de nivel de distintos colores (debes usar '' | ||
| + | |||
| + | $$x \in [-15,15]$$ | ||
| + | |||
| + | $$y \in [-15,15]$$ | ||
| + | |||
| + | $$z =\frac {sin(\sqrt {x^2+y^2+4})}{\sqrt {x^2+y^2+4}}$$ | ||
| + | |||
| + | Además: | ||
| + | * En cada eje su nombre X, Y. | ||
| + | * Cambia el color map por el llamado '' | ||
| + | * Muestra el colorbar | ||
| + | |||
| + | |||
| + | ==== Ejercicio 18: sns.kdeplot ==== | ||
| + | Muestra el //Kernel density estimation (KDE)// ( es como el histograma pero como una línea continua) de diversas alturas de hombre y de mujeres | ||
| + | |||
| + | <sxh python> | ||
| + | altura_hombres=[182.74607218, | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | altura_mujeres=[159.31722861, | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | |||
| + | Muestra los datos: | ||
| + | * En el mismo subplot | ||
| + | * Que las etiquetas sean " | ||
| + | * Titulo de la figura | ||
| + | * La etiqueta del eje X sea " | ||
| + | * La etiqueta del eje Y sea " | ||
| + | |||
| + | ==== Ejercicio 19: sns.histplot ==== | ||
| + | Repite el ejercicio anterior | ||
| + | |||
| + | |||
| + | ==== Ejercicio 20 ==== | ||
| + | Busca las cosas //raras// que hay en el siguiente código y explica como las harías tu. | ||
| + | |||
| + | <sxh python> | ||
| + | import pandas as pd | ||
| + | df = pd.read_csv(" | ||
| + | plt.figure(figsize=(10, | ||
| + | |||
| + | ax = sns.scatterplot(x =' | ||
| + | y = df[' | ||
| + | hue = " | ||
| + | data = df, | ||
| + | | ||
| + | | ||
| + | alpha = 0.4 | ||
| + | ) | ||
| + | |||
| + | max_wage_eur = df.groupby(" | ||
| + | #Making a line plot of max wages | ||
| + | sns.lineplot(data = max_wage_eur, | ||
| + | ax = ax.axes, | ||
| + | color=" | ||
| + | ax.tick_params(axis= " | ||
| + | plt.xlabel(" | ||
| + | plt.ylabel(" | ||
| + | plt.title(" | ||
| + | plt.show() | ||
| + | </ | ||
| + | |||
| + | |||
| + | El código está sacado de la página: [[https:// | ||
| + | |||
| + | ==== Ejercicio 21: imshow ==== | ||
| + | El fichero '' | ||
| + | |||
| + | Carga ese array y sabiendo que contiene una imagen de tamaño 41x31 y que cada color son 3 números, haz con matplotlib que se muestre la imagen de Mario Bros. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Fíjate que en la imagen no debe salir ninguno de los ejes. | ||
| + | |||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | |||
| + | ==== Ejercicio 22.A ==== | ||
| + | Para la red de las flores, muestra para todos los tipos de flores una gráfica de puntos de forma que: | ||
| + | * El eje X será el largo del sépalo y pon eso como etiqueta del eje | ||
| + | * El eje Y será el largo del pétalo y pon eso como etiqueta del eje | ||
| + | * Que cada tipo de flor sea de un color distinto. | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== Ejercicio 22.B ==== | ||
| + | Repita el ejercicio anterior pero ahora la creación del gráfico se hará en la función llamada '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | Esa función deberá hacer la misma gráfica del ejercicio anterior. | ||
| + | ==== Ejercicio 22.C ==== | ||
| + | Usando la función '' | ||
| + | |||
| + | La gráfica debe quedar como la siguiente: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== Ejercicio 22.D ==== | ||
| + | Muestra un gráfico KDE con la distribución de cada tipo de flor en función del largo del sépalo | ||
| + | |||
| + | * La etiqueta del eje X sea "largo sépalo" | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== Ejercicio 22.E ==== | ||
| + | Repita el ejercicio anterior pero ahora la creación del gráfico se hará en la función llamada '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ==== Ejercicio 22.F ==== | ||
| + | Usando la función '' | ||
| + | |||
| + | La gráfica debe quedar como la siguiente: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ==== Ejercicio 22.G ==== | ||
| + | Ejecuta el siguiente código en Python: | ||
| + | |||
| + | <sxh python> | ||
| + | import numpy as np | ||
| + | import pandas as pd | ||
| + | import seaborn as sns | ||
| + | from sklearn.datasets import load_iris | ||
| + | |||
| + | iris=load_iris() | ||
| + | |||
| + | #Obtener los datos | ||
| + | data=iris.data | ||
| + | target=iris.target | ||
| + | |||
| + | feature_names=[' | ||
| + | target_names=[' | ||
| + | target_unique=[0, | ||
| + | |||
| + | #Crear el DataFrame con los datos | ||
| + | df=pd.DataFrame(data, | ||
| + | df[' | ||
| + | df[' | ||
| + | |||
| + | |||
| + | #Crear el gráfico | ||
| + | sns.pairplot(df, | ||
| + | </ | ||
| + | |||
| + | ¿Que sorpresa te has llevado? | ||
| + | |||
| + | ==== Ejercicio 23.A ==== | ||
| + | De la primera red neuronal de las flores que hemos usado en el tema 1, muestra una gráfica en la que se muestre: | ||
| + | * Eje X: Nº de época | ||
| + | * Eje Y: Valor de la función de pérdida. Recuerda que los datos están en '' | ||
| + | * Personaliza el gráfico de la forma siguiente: | ||
| + | * El tamaño de la figura será de (7 y 5) | ||
| + | * Eje X: | ||
| + | * El //label// será "Nº Épocas", | ||
| + | * Los números que parecerán serán siempre | ||
| + | * Eje Y: | ||
| + | * El //label// será " | ||
| + | * Se verá del 0 al 1.1 | ||
| + | * Los números a salir los números del eje Y serán | ||
| + | * El título del subplot será " | ||
| + | * El color del fondo es ''# | ||
| + | * Que se vea el grid de los ejes de color blanco con ancho de las líneas de 2 píxeles. | ||
| + | * Para que la línea salga punteada para ello usa '' | ||
| + | * El número que se muestra en la leyenda es "loss entrenamiento:" | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | **Para el entrenamiento se usarán 40 épocas** | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ==== Ejercicio 23.B ==== | ||
| + | Crea una función de Python llamada '' | ||
| + | |||
| + | A la función la debes llamar de usa forma similar a la siguiente: | ||
| + | |||
| + | <sxh python> | ||
| + | history=model.fit(x, | ||
| + | |||
| + | figure=plt.figure(figsize=(7, | ||
| + | axes = figure.add_subplot(1, | ||
| + | |||
| + | plot_metrics(axes, | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== Ejercicio 23.C ==== | ||
| + | Usando la función '' | ||
| + | |||
| + | ^ Nº Neuronas en cada capa ^ | ||
| + | | 4, 8, 4, 2, 1 | | ||
| + | | 8, 16, 8, 4, 1 | | ||
| + | | 16, 32, 16, 8, 1 | | ||
| + | | 32, 64, 32, 8, 1 | | ||
| + | | 64, 128, 64, 8, 1 | | ||
| + | |||
| + | Además: | ||
| + | * Deberás mostrar los 5 subplots en la disposición de 2 filas y 3 columnas | ||
| + | * El título de la figura será "Redes flores" | ||
| + | * El Nº de épocas será 40. | ||
| + | |||
| + | Indica para cada red, a partir de que época ya no habría sido necesario seguir entrenando dicha red y cuales son las mejores redes | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== Ejercicio 23.D ==== | ||
| + | Repite el ejercicio anterior pero ahora divide los datos en entrenamiento y validación. | ||
| + | |||
| + | Para ello usa la función '' | ||
| + | |||
| + | <sxh python> | ||
| + | from sklearn.model_selection import train_test_split | ||
| + | |||
| + | x_train, x_test, y_train, y_test = train_test_split(x, | ||
| + | |||
| + | </ | ||
| + | |||
| + | El parámetro '' | ||
| + | |||
| + | Ahora deberás indicar en el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | history=model.fit(x_train, | ||
| + | </ | ||
| + | |||
| + | Para acabar ahora están las métricas de: | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Al mostrar la gráfica, muestra tanto '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ===== Mini-proyecto ===== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ==== Paso 1 === | ||
| + | |||
| + | De varios paises tenemos los siguientes datos del gatos en educación y su PIB que nos retorna la función '' | ||
| + | <sxh python> | ||
| + | def get_datos(): | ||
| + | datos= | ||
| + | [[ 2.01666708 , 56.18031474], | ||
| + | [ 14.92688637 , 59.10244323], | ||
| + | [ 25.3139145 | ||
| + | [ 46.63551059 , 98.93395801], | ||
| + | [ 54.68810274 , 150.09622546], | ||
| + | [ 69.51252436 , 128.72247348], | ||
| + | [ 87.09879038 , 217.28932067], | ||
| + | [ 94.1944751 | ||
| + | |||
| + | return datos | ||
| + | </ | ||
| + | |||
| + | Crea la siguiente gráfica: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== Paso 2 ==== | ||
| + | Resulta que la ecuación correcta que rige ese modelo es una recta: | ||
| + | |||
| + | $$ | ||
| + | y=a \cdot x + b | ||
| + | $$ | ||
| + | |||
| + | $$ | ||
| + | pib=a \cdot gastos \; en \; educacion + b | ||
| + | $$ | ||
| + | |||
| + | y sabiendo | ||
| + | |||
| + | $$ | ||
| + | a=1.6 | ||
| + | \\ | ||
| + | b=30 | ||
| + | $$ | ||
| + | |||
| + | $$ | ||
| + | pib=1.6 \cdot gastos \; en \; educacion + 30 | ||
| + | $$ | ||
| + | |||
| + | Muestra ahora esa ecuación sobre el gráfico anterior. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== Paso 3 ==== | ||
| + | Ahora usando la siguiente red neuronal: | ||
| + | |||
| + | <sxh python> | ||
| + | def compile_fit(x, | ||
| + | np.random.seed(5) | ||
| + | tf.random.set_seed(5) | ||
| + | random.seed(5) | ||
| + | | ||
| + | model=Sequential() | ||
| + | model.add(Dense(1, | ||
| + | model.compile(loss=' | ||
| + | | ||
| + | | ||
| + | history=model.fit(x, | ||
| + | |||
| + | return model, | ||
| + | </ | ||
| + | |||
| + | |||
| + | * Entrena la red neuronal durante 200 épocas | ||
| + | * Muestra el resultado de la red neuronal sobre la gráfica anterior usando el método '' | ||
| + | * Muestra el valor de $a$ y $b$ del modelo con las siguientes líneas | ||
| + | |||
| + | <sxh python> | ||
| + | a_pred=model.layers[0].get_weights()[0][0, | ||
| + | b_pred=model.layers[0].get_weights()[1][0] | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ==== Paso 4 ==== | ||
| + | Vuelve a entrenar ahora el modelo ahora con 27500 épocas y comprueba ahora da mejores resultados. | ||
| + | |||
| + | Para ello: | ||
| + | * Vuelve a recrear la gráfica anterior | ||
| + | * Muestra los valores de $a$ y $b$ | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== Paso 5 ==== | ||
| + | Ahora vamos a calcular como de " | ||
| + | |||
| + | La formula que vamos a usar es **Mean Squared Error** (MSE) | ||
| + | |||
| + | $$ | ||
| + | loss=Perdida=error \: medio=\frac{1}{N} \sum_{i=1}^{N} |y_{true}-y_{score}|^{2}=\frac{1}{N} \sum_{i=1}^{N} |pib_{true}-pib_{predicho}|^{2} | ||
| + | $$ | ||
| + | |||
| + | Imprime el resultado | ||
| + | |||
| + | === Paso 6 === | ||
| + | Si nos fijamos cuando hemos definido la red neuronal , el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | model.compile(loss=' | ||
| + | </ | ||
| + | |||
| + | Es decir que le estamos diciendo a la red neuronal que para entrenarse use el **Mean Squared Error** como función de pérdida. | ||
| + | |||
| + | Así que resulta que no hace falta que nosotros calculemos el **Mean Squared Error** porque ya lo hace keras por nosotros. | ||
| + | La forma de acceder a ese valor es la siguiente, el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | history=model.fit(x, | ||
| + | </ | ||
| + | |||
| + | <sxh python> | ||
| + | loss=history.history[' | ||
| + | </ | ||
| + | |||
| + | En este caso '' | ||
| + | |||
| + | === Paso 7 === | ||
| + | Ahora muestra una gráfica con todos los valores de //loss// para que veas como va evolucionando la pérdida a medida que se va entrenando la red en cada época | ||
| + | Y muestra la última perdida | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Paso 8 === | ||
| + | Muestra en una figura las 2 gráficas anteriores | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Paso 9 === | ||
| + | Ahora vamos a crear una red neuronal muchísimo más compleja para hacer que el error sea aun menor. | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | La red es la siguiente: | ||
| + | |||
| + | <sxh python> | ||
| + | def compile_fit(x, | ||
| + | np.random.seed(5) | ||
| + | tf.random.set_seed(5) | ||
| + | random.seed(5) | ||
| + | | ||
| + | model=Sequential() | ||
| + | model.add(Dense(1, | ||
| + | model.add(Dense(10, | ||
| + | model.add(Dense(100, | ||
| + | model.add(Dense(300, | ||
| + | model.add(Dense(600, | ||
| + | model.add(Dense(900, | ||
| + | model.add(Dense(1800, | ||
| + | model.add(Dense(900, | ||
| + | model.add(Dense(600, | ||
| + | model.add(Dense(300, | ||
| + | model.add(Dense(200, | ||
| + | model.add(Dense(100, | ||
| + | model.add(Dense(10, | ||
| + | model.add(Dense(1, | ||
| + | model.compile(loss=' | ||
| + | | ||
| + | | ||
| + | history=model.fit(x, | ||
| + | |||
| + | return model, | ||
| + | </ | ||
| + | |||
| + | Entranala durante 10000 épocas y muestra las 2 gráficas | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Paso 10 === | ||
| + | Ahora usando los siguientes datos, calcula manualmente la pérdida //loss// y comparala con la pérdida anterior | ||
| + | |||
| + | <sxh python> | ||
| + | def get_datos_validacion(): | ||
| + | datos_validacion=np.array( | ||
| + | [[ 1.22140488 , 59.35315077] , [ 2.42834632 , 3.50613409] , [ 4.27529991 , 70.39938914] , | ||
| + | [ 14.44651349 , 50.0606769 ] , [ 16.10795855 , 81.08562061] , [ 16.75024181 , 33.95365822] , | ||
| + | [ 26.80487149 , 47.1495392 ] , [ 28.81517859 , | ||
| + | [ 52.08015067 , | ||
| + | [ 60.39615207 , 97.77483743] , [ 73.52487026 , 92.30645543] , [ 76.2771471 | ||
| + | [ 84.56808303 , | ||
| + | [ 93.53406333 , | ||
| + | ) | ||
| + | return datos_validacion | ||
| + | </ | ||
| + | |||
| + | Añade a la gráfica los datos de validación | ||
| + | |||
| + | ¿Que ha ocurrido? Se llama Sobreajuste | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | === Paso 11 === | ||
| + | Estos nuevos datos se pueden incluir también en el método '' | ||
| + | |||
| + | <sxh python> | ||
| + | history=model.fit(x, | ||
| + | </ | ||
| + | |||
| + | Para acceder desde '' | ||
| + | |||
| + | <sxh python> | ||
| + | val_loss=history.history[' | ||
| + | </ | ||
| + | |||
| + | Muestra ahora una nueva figura con la perdida tanto en entrenamiento como en validación y los datos. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Paso 12 === | ||
| + | Muestra la gráfica con los datos originales pero que el resultado de la red sea hasta 200 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | === Paso 13 === | ||
| + | Ahora vamos a hacer predicciones en el modelo y comprobar si hay algún problema a lo largo del tiempo. | ||
| + | Para ello vamos a realizar 300 predicciones semanales y obtener la media y la desviación estándar de todas las predicciones de una semana. | ||
| + | Y eso lo vamos a realizar durante 600 semanas. | ||
| + | |||
| + | Para obtener las 300 predicciones semanales vamos a usar la siguiente función '' | ||
| + | <sxh python> | ||
| + | np.random.seed(8) | ||
| + | def get_gastos_educacion(semana): | ||
| + | num_predicciones_semanales=300 | ||
| + | gastos_educacion=np.random.uniform((semana/ | ||
| + | gastos_educacion=gastos_educacion[gastos_educacion> | ||
| + | |||
| + | return gastos_educacion | ||
| + | </ | ||
| + | |||
| + | Y mostraremos para cada un de las 600 semanas la media y la desviación estandard. | ||
| + | |||
| + | ¿Ves algo raro? | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | === Paso 14 === | ||
| + | Siguiendo con el DataSet de los precios de viviendas en la ciudad de Boston, vamos a mostrar las gráficas con | ||
| + | las pérdidas y la métrica del Coeficiente de determinación o R² de todas las redes neuronales que se entrenaron en el tema anterior (entrenamiento y validación) | ||
| + | |||
| + | Para poder mostrar el Coeficiente de determinación o R² deberemos modificar el método '' | ||
| + | <sxh python> | ||
| + | model.compile(loss=' | ||
| + | </ | ||
| + | |||
| + | Se usa de la siguiente forma: | ||
| + | * Obtener el R² para cada época en el entrenamiento | ||
| + | <sxh python> | ||
| + | r2_score=history.history[' | ||
| + | </ | ||
| + | |||
| + | * Obtener el R² para cada época en validación | ||
| + | <sxh python> | ||
| + | r2_score_validacion=history.history[' | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | redes_neuronales=[ | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | [[20, | ||
| + | ] | ||
| + | |||
| + | epochs=300 | ||
| + | </ | ||
| + | |||
| + | <sxh base> | ||
| + | Nombre | ||
| + | | ||
| + | -------- | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | 10 [20, 40, 80, 40, 20, 1] 300 relu | ||
| + | 11 [20, 40, 80, 40, 20, 1] 300 selu | ||
| + | 12 [20, 40, 80, 40, 20, 1] 300 tanh | ||
| + | 13 [20, 40, 80, 160, 80, 40, 20, 1] | ||
| + | 14 [20, 40, 80, 160, 80, 40, 20, 1] | ||
| + | 15 [20, 40, 80, 160, 80, 40, 20, 1] | ||
| + | |||
| + | </ | ||
| + | |||
| + | Para cada una de las redes indica: | ||
| + | * Si tiene unas buenas métricas en la última época | ||
| + | * Si es buena o mala red , es decir si la elegirías. Explica el motivo | ||
| + | * Compara los resultados con los del tema anterior ¿Porque hay esas variaciones? | ||
| + | |||
| + | Apara añadir los datos de validación se hace lo siguiente: | ||
| + | |||
| + | * Separar los datos en entrenamiento y validación | ||
| + | <sxh python> | ||
| + | from sklearn.model_selection import train_test_split | ||
| + | |||
| + | x_train, x_test, y_train, y_test = train_test_split(x, | ||
| + | </ | ||
| + | |||
| + | * Entrenar con los datos de entrenamiento y validación | ||
| + | <sxh python> | ||
| + | history=model.fit(x_train, | ||
| + | </ | ||
| + | |||
| + | * Obtener la pérdida en entrenamineto | ||
| + | <sxh python> | ||
| + | history.history[' | ||
| + | </ | ||
| + | |||
| + | === Paso 15 === | ||
| + | Repite el ejercicio anterior pero ahora solo para 10 épocas y muestra solo la pérdida en entrenamiento y validación. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Para cada una de las redes indicas si podrías " | ||
| + | |||
