a

2999a commited on
Commit
a7bc3d5
·
verified ·
1 Parent(s): 7a4a84e

Upload via hfc (batch)

Browse files

Uploaded using hfc tool

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +10 -0
  2. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/03-Lecturas recomendadas.txt +1 -0
  3. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/03-Resumen.html +0 -0
  4. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_1_b0e1960a-22ac-4538-9176-d5a3fa4985cf.png +0 -0
  5. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_2_bd69c9e5-5605-4412-8699-45404d217793.png +0 -0
  6. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_t1_7cac34b7-de41-4d65-b7e7-ccd879cccc8d.png +0 -0
  7. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_t2_65ab2094-1926-4062-aeb1-217d5ee6a35f.png +0 -0
  8. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/03-funciones_lineales_8bea0ee9-b343-42cc-89c3-8f2f43b6ce40.ipynb +603 -0
  9. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Funciones Afines Propiedades y Ejercicios Prácticos.mp4 +3 -0
  10. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Funciones Afines Propiedades y Ejercicios Prácticos.vtt +502 -0
  11. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Lecturas recomendadas.txt +1 -0
  12. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Resumen.html +0 -0
  13. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_1_791b9934-e2e7-4a79-9088-20b778cea79a.png +0 -0
  14. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_2_688205df-74d5-46e1-8388-33e306c7158c.png +0 -0
  15. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_t1_7578434d-8348-453c-a733-4a2ac8a759c2.png +0 -0
  16. a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_t2_18bf8950-e77a-4a67-bbaa-37fbebb0ecfe.png +0 -0
  17. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-funciones_lineales_edd8fc32-9519-46dc-88dd-8718820a615d.ipynb +603 -0
  18. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Aproximaciones de Taylor Modelos Lineales de Funciones No Lineales.mp4 +3 -0
  19. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Aproximaciones de Taylor Modelos Lineales de Funciones No Lineales.vtt +433 -0
  20. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Lecturas recomendadas.txt +2 -0
  21. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Resumen.html +0 -0
  22. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-aproximacion_taylor_6d013e46-3c9a-49a9-ad07-99eb13e84e1f.ipynb +481 -0
  23. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Aproximaciones de Taylor y análisis de error en Python.mp4 +3 -0
  24. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Aproximaciones de Taylor y análisis de error en Python.vtt +706 -0
  25. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Lecturas recomendadas.txt +4 -0
  26. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Resumen.html +0 -0
  27. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-aproximacion_taylor_ce137460-6fd8-44ff-8cd4-d5d1cde0972c.ipynb +481 -0
  28. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Lecturas recomendadas.txt +4 -0
  29. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Regresión Lineal con Datos Geográficos y Socioeconómicos.mp4 +3 -0
  30. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Regresión Lineal con Datos Geográficos y Socioeconómicos.vtt +1084 -0
  31. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Resumen.html +0 -0
  32. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-definitions_7d274da2-c190-43fe-9c19-8f10487943ee.pdf +3 -0
  33. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-income_db_gorg_283cf1bb-74a9-4cf5-9255-da690e2b3e64.csv +0 -0
  34. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-income_methodology_f503f6ab-8d26-417d-946f-a4c86f70bc87.pdf +3 -0
  35. a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-regresion_lineal_306f23ad-b398-409f-a70f-32fc99b2cb56.ipynb +487 -0
  36. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Lecturas recomendadas.txt +1 -0
  37. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Propiedades y Cálculo de la Norma de Vectores.mp4 +3 -0
  38. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Propiedades y Cálculo de la Norma de Vectores.vtt +763 -0
  39. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Resumen.html +0 -0
  40. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-distancias_9e4fe5f7-c830-455a-8f38-ca9850246cef.ipynb +534 -0
  41. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Cálculo de Distancias entre Vectores usando Normas Euclidianas y LP.mp4 +3 -0
  42. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Cálculo de Distancias entre Vectores usando Normas Euclidianas y LP.vtt +1198 -0
  43. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Lecturas recomendadas.txt +2 -0
  44. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Resumen.html +0 -0
  45. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-distancias_8e763fc2-5ce3-498b-91f8-711debd9e867.ipynb +534 -0
  46. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Lecturas recomendadas.txt +1 -0
  47. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Optimización de Visitas para Arrendar Departamentos.mp4 +3 -0
  48. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Optimización de Visitas para Arrendar Departamentos.vtt +595 -0
  49. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Resumen.html +0 -0
  50. a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-distancias_7eb83b35-ba4b-431d-9a1a-bd49eeaaf232.ipynb +534 -0
.gitattributes CHANGED
@@ -583,3 +583,13 @@ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:s
583
  a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/01-Funciones[[:space:]]Lineales[[:space:]]Transformación[[:space:]]de[[:space:]]Vectores[[:space:]]en[[:space:]]Escalares.mp4 filter=lfs diff=lfs merge=lfs -text
584
  a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/02-Funciones[[:space:]]Lineales[[:space:]]y[[:space:]]Propiedades[[:space:]]de[[:space:]]Superposición.mp4 filter=lfs diff=lfs merge=lfs -text
585
  a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/03-Teoremas[[:space:]]y[[:space:]]Corolarios[[:space:]]en[[:space:]]Funciones[[:space:]]Lineales.mp4 filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
583
  a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/01-Funciones[[:space:]]Lineales[[:space:]]Transformación[[:space:]]de[[:space:]]Vectores[[:space:]]en[[:space:]]Escalares.mp4 filter=lfs diff=lfs merge=lfs -text
584
  a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/02-Funciones[[:space:]]Lineales[[:space:]]y[[:space:]]Propiedades[[:space:]]de[[:space:]]Superposición.mp4 filter=lfs diff=lfs merge=lfs -text
585
  a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/03-Teoremas[[:space:]]y[[:space:]]Corolarios[[:space:]]en[[:space:]]Funciones[[:space:]]Lineales.mp4 filter=lfs diff=lfs merge=lfs -text
586
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/04-Funciones[[:space:]]Afines[[:space:]]Propiedades[[:space:]]y[[:space:]]Ejercicios[[:space:]]Prácticos.mp4 filter=lfs diff=lfs merge=lfs -text
587
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/05-Aproximaciones[[:space:]]de[[:space:]]Taylor[[:space:]]Modelos[[:space:]]Lineales[[:space:]]de[[:space:]]Funciones[[:space:]]No[[:space:]]Lineales.mp4 filter=lfs diff=lfs merge=lfs -text
588
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/06-Aproximaciones[[:space:]]de[[:space:]]Taylor[[:space:]]y[[:space:]]análisis[[:space:]]de[[:space:]]error[[:space:]]en[[:space:]]Python.mp4 filter=lfs diff=lfs merge=lfs -text
589
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/07-Regresión[[:space:]]Lineal[[:space:]]con[[:space:]]Datos[[:space:]]Geográficos[[:space:]]y[[:space:]]Socioeconómicos.mp4 filter=lfs diff=lfs merge=lfs -text
590
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/07-definitions_7d274da2-c190-43fe-9c19-8f10487943ee.pdf filter=lfs diff=lfs merge=lfs -text
591
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/03-Funciones[[:space:]]lineales/07-income_methodology_f503f6ab-8d26-417d-946f-a4c86f70bc87.pdf filter=lfs diff=lfs merge=lfs -text
592
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/04-Norma[[:space:]]y[[:space:]]distancia/01-Propiedades[[:space:]]y[[:space:]]Cálculo[[:space:]]de[[:space:]]la[[:space:]]Norma[[:space:]]de[[:space:]]Vectores.mp4 filter=lfs diff=lfs merge=lfs -text
593
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/04-Norma[[:space:]]y[[:space:]]distancia/02-Cálculo[[:space:]]de[[:space:]]Distancias[[:space:]]entre[[:space:]]Vectores[[:space:]]usando[[:space:]]Normas[[:space:]]Euclidianas[[:space:]]y[[:space:]]LP.mp4 filter=lfs diff=lfs merge=lfs -text
594
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/04-Norma[[:space:]]y[[:space:]]distancia/03-Optimización[[:space:]]de[[:space:]]Visitas[[:space:]]para[[:space:]]Arrendar[[:space:]]Departamentos.mp4 filter=lfs diff=lfs merge=lfs -text
595
+ a/Curso[[:space:]]de[[:space:]]Introducción[[:space:]]al[[:space:]]Álgebra[[:space:]]Lineal[[:space:]]Vectores/04-Norma[[:space:]]y[[:space:]]distancia/04-Cálculo[[:space:]]de[[:space:]]Desviación[[:space:]]Estándar[[:space:]]en[[:space:]]Series[[:space:]]de[[:space:]]Tiempo[[:space:]]con[[:space:]]NumPy.mp4 filter=lfs diff=lfs merge=lfs -text
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/03-Lecturas recomendadas.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ https://colab.research.google.com/drive/1uHLHnGyq5fgP917lwwh3JDNhNtr3EZhw?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/03-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_1_b0e1960a-22ac-4538-9176-d5a3fa4985cf.png ADDED
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_2_bd69c9e5-5605-4412-8699-45404d217793.png ADDED
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_t1_7cac34b7-de41-4d65-b7e7-ccd879cccc8d.png ADDED
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/03-fl_t2_65ab2094-1926-4062-aeb1-217d5ee6a35f.png ADDED
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/03-funciones_lineales_8bea0ee9-b343-42cc-89c3-8f2f43b6ce40.ipynb ADDED
@@ -0,0 +1,603 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 5. Funciones Lineales"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "La notación $f: \\mathbb{R}^{n}\\to \\mathbb{R}$ significa que $f$ es una función con **dominio** en $\\mathbb{R}^{n}$ e imagen en $\\mathbb{R}$, es decir, que toma un $n$-vector y lo convierte en un escalar. \n",
15
+ "La función puede denotarse como $f\\left(\\mathbf{x}\\right)= f\\left(x_{0},x_{1},\\dots,x_{n-1}\\right)$ donde $\\mathbf{x}\\in \\mathbb{R}^{n}$ y $x_{i}$ son las entradas del vector. \n",
16
+ "\n",
17
+ "Es necesario enfatizar que $f(\\mathbf{x})$ es un escalar. "
18
+ ]
19
+ },
20
+ {
21
+ "cell_type": "markdown",
22
+ "metadata": {},
23
+ "source": [
24
+ "Para describir una función $f: \\mathbb{R}^{n} \\to \\mathbb{R}$ tenemos que especificar el cual es el valor para cualquier vector $\\mathbf{x}\\in\\mathbb{R}^{n}$. Por ejemplo, sea $f: \\mathbb{R}^{4} \\to \\mathbb{R}$ definida por\n",
25
+ "$$\n",
26
+ "f(\\mathbf{x}) = x_{0} + x_{1} + x_{2} + x_{3}\n",
27
+ "$$"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "Así pues el valor de cualquier $4$-vector queda bien definido, por ejemplo:\n",
35
+ "\n",
36
+ "* $f(\\mathbf{0}) = 0 + 0+ 0+0 = 0$\n",
37
+ "\n",
38
+ "* $f([1\\; 0\\; 0\\; 0]) = 1+0+0+0 = 1$\n",
39
+ "\n",
40
+ "* $f([1\\; 1\\; 1\\; 1]) = 1+1+1+1 = 4$"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type": "code",
45
+ "execution_count": 15,
46
+ "metadata": {},
47
+ "outputs": [],
48
+ "source": [
49
+ "import numpy as np"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": 16,
55
+ "metadata": {},
56
+ "outputs": [],
57
+ "source": [
58
+ "def f(x):\n",
59
+ " return np.sum(x)"
60
+ ]
61
+ },
62
+ {
63
+ "cell_type": "code",
64
+ "execution_count": 17,
65
+ "metadata": {},
66
+ "outputs": [
67
+ {
68
+ "name": "stdout",
69
+ "output_type": "stream",
70
+ "text": [
71
+ "f(0) = 0\n"
72
+ ]
73
+ }
74
+ ],
75
+ "source": [
76
+ "print('f(0) = ',f(np.array([0,0,0,0])))"
77
+ ]
78
+ },
79
+ {
80
+ "cell_type": "code",
81
+ "execution_count": 18,
82
+ "metadata": {},
83
+ "outputs": [
84
+ {
85
+ "name": "stdout",
86
+ "output_type": "stream",
87
+ "text": [
88
+ "f([1,0,0,0]) = 1\n"
89
+ ]
90
+ }
91
+ ],
92
+ "source": [
93
+ "print('f([1,0,0,0]) = ',f(np.array([1,0,0,0])))"
94
+ ]
95
+ },
96
+ {
97
+ "cell_type": "code",
98
+ "execution_count": 19,
99
+ "metadata": {},
100
+ "outputs": [
101
+ {
102
+ "name": "stdout",
103
+ "output_type": "stream",
104
+ "text": [
105
+ "f([1,1,1,1]) = 4\n"
106
+ ]
107
+ }
108
+ ],
109
+ "source": [
110
+ "print('f([1,1,1,1]) = ',f(np.array([1,1,1,1])))"
111
+ ]
112
+ },
113
+ {
114
+ "cell_type": "markdown",
115
+ "metadata": {},
116
+ "source": [
117
+ "Como otro ejemplo, sea $g: \\mathbb{R}^{3} \\to \\mathbb{R}$ definida por \n",
118
+ "$$\n",
119
+ "g(\\mathbf{x}) = x_{0}\n",
120
+ "$$"
121
+ ]
122
+ },
123
+ {
124
+ "cell_type": "markdown",
125
+ "metadata": {},
126
+ "source": [
127
+ "Tenemos entonces:\n",
128
+ "\n",
129
+ "* $g(\\mathbf{0}) = 0$ \n",
130
+ "\n",
131
+ "* $g([0\\; 0\\; 1]) = 0$\n",
132
+ "\n",
133
+ "* $g([1\\; 0\\; 4]) = 1$"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "code",
138
+ "execution_count": 20,
139
+ "metadata": {},
140
+ "outputs": [],
141
+ "source": [
142
+ "def g(x):\n",
143
+ " return x[0]"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "code",
148
+ "execution_count": 21,
149
+ "metadata": {},
150
+ "outputs": [
151
+ {
152
+ "name": "stdout",
153
+ "output_type": "stream",
154
+ "text": [
155
+ "g(0) = 0\n"
156
+ ]
157
+ }
158
+ ],
159
+ "source": [
160
+ "print('g(0) = ',g(np.array([0,0,0])))"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 22,
166
+ "metadata": {},
167
+ "outputs": [
168
+ {
169
+ "name": "stdout",
170
+ "output_type": "stream",
171
+ "text": [
172
+ "g([0,0,1]) = 0\n"
173
+ ]
174
+ }
175
+ ],
176
+ "source": [
177
+ "print('g([0,0,1]) = ',g(np.array([0,0,1])))"
178
+ ]
179
+ },
180
+ {
181
+ "cell_type": "code",
182
+ "execution_count": 23,
183
+ "metadata": {},
184
+ "outputs": [
185
+ {
186
+ "name": "stdout",
187
+ "output_type": "stream",
188
+ "text": [
189
+ "g([1,0,4]) = 1\n"
190
+ ]
191
+ }
192
+ ],
193
+ "source": [
194
+ "print('g([1,0,4]) = ',g(np.array([1,0,4])))"
195
+ ]
196
+ },
197
+ {
198
+ "cell_type": "markdown",
199
+ "metadata": {},
200
+ "source": [
201
+ "Podemos notar que en este caso $f(\\mathbf{x})$ corresponde a la _función suma_ y $g(\\mathbf{x})$ a proyección sobre $x_{0}$."
202
+ ]
203
+ },
204
+ {
205
+ "cell_type": "markdown",
206
+ "metadata": {},
207
+ "source": [
208
+ "## 5.1 Algunas funciones"
209
+ ]
210
+ },
211
+ {
212
+ "cell_type": "markdown",
213
+ "metadata": {},
214
+ "source": [
215
+ "**Función producto interno**. Si una función tiene como aurgmentos dos $n$-vectores el dominio de la función se expresará como $\\mathbb{R}^{n}\\times\\mathbb{R}^{n}$. Por ejemplo, sea $f:\\mathbb{R}^{n}\\times\\mathbb{R}^{n} \\to \\mathbb{R}$ definida por:\n",
216
+ "\n",
217
+ "$$\n",
218
+ "f(\\mathbf{a},\\mathbf{b}) = a_{0}b_{0} + a_{1}b_{1} + \\cdots + a_{n-1}b_{n-1}\n",
219
+ "$$"
220
+ ]
221
+ },
222
+ {
223
+ "cell_type": "markdown",
224
+ "metadata": {},
225
+ "source": [
226
+ "Notemos que podemos expresar lo anterior como\n",
227
+ "\n",
228
+ "$$\n",
229
+ "f(\\mathbf{a},\\mathbf{b}) = \\mathbf{a}^{T}\\mathbf{b}\n",
230
+ "$$\n",
231
+ "\n",
232
+ "Esta función recibe el nombre de función producto interno. Si quisieramos dejar fijo un vector, digamos el vector $\\mathbf{a}$ podemos recurrir a la siguiente notación:\n",
233
+ "\n",
234
+ "$$\n",
235
+ "f_{\\mathbf{a}}(\\mathbf{b}) = \\mathbf{a}^{T}\\mathbf{b}\n",
236
+ "$$\n",
237
+ "\n",
238
+ "Esto significará que $\\mathbf{a}$ estará fijo mientras que $\\mathbf{b}$ será el que variará. "
239
+ ]
240
+ },
241
+ {
242
+ "cell_type": "markdown",
243
+ "metadata": {},
244
+ "source": [
245
+ "**Superposición y linealidad.** La función producto interno satisface la siguiente propiedad:\n",
246
+ "\n",
247
+ "$$\n",
248
+ "\\begin{eqnarray}\n",
249
+ "f_\\mathbf{x}(\\alpha\\mathbf{a}+\\beta\\mathbf{b}) &=& \\mathbf{x}^{T}(\\alpha\\mathbf{a}+\\beta\\mathbf{b}) \\\\\n",
250
+ " &=& \\mathbf{x}^{T}(\\alpha\\mathbf{a})+\\mathbf{x}^{T}(\\beta\\mathbf{b}) \\\\\n",
251
+ " &=& \\alpha(\\mathbf{x}^{T}\\mathbf{a}) + \\beta(\\mathbf{x}^{T}\\mathbf{b}) \\\\\n",
252
+ " &=& \\alpha f_{\\mathbf{x}}(\\mathbf{a}) + \\beta f_{\\mathbf{x}}(\\mathbf{b})\n",
253
+ "\\end{eqnarray}\n",
254
+ "$$\n",
255
+ "\n",
256
+ "Si la función $g$ cumple que $g(\\alpha\\mathbf{x}+\\beta\\mathbf{y}) = \\alpha g(\\mathbf{x})+\\beta g(\\mathbf{y})$ decimos que la función $g$ es una **función lineal.** "
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "markdown",
261
+ "metadata": {},
262
+ "source": [
263
+ "Si $f$ es una función lineal la _linearidad_ se extiende a cualquier combinación lineal y no solamente a una combinación de dos vectores, tenemos \n",
264
+ "\n",
265
+ "$$\n",
266
+ "f(\\alpha_{0}\\mathbf{x_{0}} + \\alpha_{1}\\mathbf{x_{1}} + \\alpha_{2}\\mathbf{x_{2}} + \\cdots \n",
267
+ " + \\alpha_{n-1}\\mathbf{x_{n-1}}) = \\alpha_{0}f(\\mathbf{x_{0}}) + \\alpha_{1}f(\\mathbf{x_{1}}) + \\alpha_{2}f(\\mathbf{x_{2}}) + \\cdots + \\alpha_{n-1}f(\\mathbf{x_{n-1}})\n",
268
+ "$$\n"
269
+ ]
270
+ },
271
+ {
272
+ "cell_type": "markdown",
273
+ "metadata": {},
274
+ "source": [
275
+ "Si una función $g:\\mathbf{R}^{n} \\to \\mathbf{R}$ es lineal sabemo que cumple $g(\\alpha\\mathbf{x}+\\beta\\mathbf{y}) = \\alpha g(\\mathbf{x})+\\beta g(\\mathbf{y})$, propiedad que llamaremos _superposición_. Ahora, la superposición puede ser separada en dos propiedades:\n",
276
+ "\n",
277
+ "* _Homogeneidad_. Para cualquier $n$-vector $\\mathbf{x}$ y cualquier escalar $\\alpha$ tenemos que $g(\\alpha \\mathbf{x}) = \\alpha g(\\mathbf{x})$\n",
278
+ "\n",
279
+ "* _Aditividad_. Para cualquier $n$-vector $\\mathbf{x}$ y $\\mathbf{y}$ tenemos que $g(\\mathbf{x}+\\mathbf{y}) = g(\\mathbf{x})+g(\\mathbf{y})$\n",
280
+ "\n",
281
+ "La homogeneidad nos dice que escalar el argumento es igual que escalar el valor de la función; la aditividad nos indica que sumar los argumentos es igual que sumar los valores de la función. "
282
+ ]
283
+ },
284
+ {
285
+ "cell_type": "code",
286
+ "execution_count": 24,
287
+ "metadata": {},
288
+ "outputs": [],
289
+ "source": [
290
+ "a = np.array([1,1,1,1])\n",
291
+ "b = np.array([1,0,1,0])\n",
292
+ "x,y = 1,-2"
293
+ ]
294
+ },
295
+ {
296
+ "cell_type": "code",
297
+ "execution_count": 25,
298
+ "metadata": {},
299
+ "outputs": [
300
+ {
301
+ "name": "stdout",
302
+ "output_type": "stream",
303
+ "text": [
304
+ "f(x*a + y*b) = 0\n"
305
+ ]
306
+ }
307
+ ],
308
+ "source": [
309
+ "print('f(x*a + y*b) = ',f(x*a + y*b))"
310
+ ]
311
+ },
312
+ {
313
+ "cell_type": "code",
314
+ "execution_count": 27,
315
+ "metadata": {},
316
+ "outputs": [
317
+ {
318
+ "name": "stdout",
319
+ "output_type": "stream",
320
+ "text": [
321
+ "x*f(a) + y*f(b) = 0\n"
322
+ ]
323
+ }
324
+ ],
325
+ "source": [
326
+ "print('x*f(a) + y*f(b) =',x*f(a) + y*f(b))"
327
+ ]
328
+ },
329
+ {
330
+ "cell_type": "markdown",
331
+ "metadata": {},
332
+ "source": [
333
+ "**Representación producto interno de una función lineal.** En matemáticas las verdades, cuando son verdades, se demuestran usando argumentos principalmente lógicos. Estas verdades vienen empaquetadas en _teoremas_, _corolarios_ y _lemas_. Si no podemos demostrarlo pero creemos que es verdad lo llamamos _conjetura_. Por ejemplo, consideremos el siguiente teorema:"
334
+ ]
335
+ },
336
+ {
337
+ "cell_type": "markdown",
338
+ "metadata": {},
339
+ "source": [
340
+ "**Teorema.** Los ángulos a ambos lados de una recta, que intersecta a otra, siempre suman $180^\\circ$ \n",
341
+ "\n",
342
+ "![img](fl_1.png)"
343
+ ]
344
+ },
345
+ {
346
+ "cell_type": "markdown",
347
+ "metadata": {},
348
+ "source": [
349
+ "*Demostración*: Supongamos que $\\alpha + \\beta \\neq 180$ eso quiere decir que $\\alpha + \\beta > 180$ o $\\alpha + \\beta < 180$. Ahora, pensemos en la linea **f** pasa por el diámetro, es decir, corta a la mitad al círculo. \n",
350
+ "\n",
351
+ "![](fl_t1.png)\n",
352
+ "\n",
353
+ "Al pasar por el diámetro sabemos que ambos lados tenemos un ángulo de $180^\\circ$. Llamemos a ese ángulo $\\Omega=180^\\circ$. Ahora, llamemos **g** a una línea que pase por otro diámetro. \n",
354
+ "\n",
355
+ "![](fl_t2.png)"
356
+ ]
357
+ },
358
+ {
359
+ "cell_type": "markdown",
360
+ "metadata": {},
361
+ "source": [
362
+ "Entonces, al seccionar con **g** tenemos nuevamente los ángulos $\\alpha$ y $\\beta$ entonces tenemos que $\\alpha + \\beta = \\Omega$ pero asumimos que $\\alpha + \\beta \\neq 180^\\circ$ lo cuyal nos lleva a una contradicción $!$ por ello lo anteior debe ser cierto. "
363
+ ]
364
+ },
365
+ {
366
+ "cell_type": "markdown",
367
+ "metadata": {},
368
+ "source": [
369
+ "**Corolario.** Cuando dos líneas se intersectan los ángulos opuestos entre ellos son iguales.\n",
370
+ "\n",
371
+ "![](fl_2.png)"
372
+ ]
373
+ },
374
+ {
375
+ "cell_type": "markdown",
376
+ "metadata": {},
377
+ "source": [
378
+ "*Demostración:* Sabemos que $\\beta + \\alpha = 180^\\circ$ entonces $\\alpha = 180^\\circ - \\beta$. Por otro lado, sabemos que también $\\gamma + \\beta = 180^\\circ$ así pues $\\gamma = 180^\\circ - \\beta$. Juntando lo anteior tenemos que:\n",
379
+ "\n",
380
+ "$$\n",
381
+ "\\alpha = 180^\\circ - \\beta = \\gamma\n",
382
+ "$$\n",
383
+ "\n",
384
+ "Lo mismo es posible aplicarse para $\\beta$ y $\\delta$. **QED**. "
385
+ ]
386
+ },
387
+ {
388
+ "cell_type": "markdown",
389
+ "metadata": {},
390
+ "source": [
391
+ "Ya explorados los teoremas y los corolarios veamos la siguiente proposición: \n",
392
+ "\n",
393
+ "**Proposición:** Una función definida como el producto punto de sus argumentos y algún vector fijo es lineal. Lo inverso es también verdadero: si una función es lineal entonces puede ser expresada como el producto interno de sus argumentos y algún vector fijo."
394
+ ]
395
+ },
396
+ {
397
+ "cell_type": "markdown",
398
+ "metadata": {},
399
+ "source": [
400
+ "Ahora, sea $f$ una función escalar de $n$-vectores que además es lineal. Entonces decimos que _existe_ un $n$-vector $\\mathbf{a}$ tal que $f(\\mathbf{x}) = \\mathbf{a}^{T}\\mathbf{x}$ para cualquier $\\mathbf{x}$. A la expresión $\\mathbf{a}^{T}\\mathbf{x}$ le llamaremos *representación producto punto* de $f$. "
401
+ ]
402
+ },
403
+ {
404
+ "cell_type": "markdown",
405
+ "metadata": {},
406
+ "source": [
407
+ "Otra propiedad interesante es que la *representación producto punto* de $f$ como $\\mathbf{a}^{T}\\mathbf{x}$ es única. "
408
+ ]
409
+ },
410
+ {
411
+ "cell_type": "markdown",
412
+ "metadata": {},
413
+ "source": [
414
+ "$ f(\\mathbf{x}) = \\displaystyle\\sum_{i}^{n-1} x_{i}$ si n=4 esto lo podemos expresar como $f(\\mathbf{x}) = \\mathbf{a}^{T}\\mathbf{x}$ donde:\n",
415
+ "$$\n",
416
+ "a^T = [1,1,1,1]\n",
417
+ "$$"
418
+ ]
419
+ },
420
+ {
421
+ "cell_type": "markdown",
422
+ "metadata": {},
423
+ "source": [
424
+ "**Promedio.** El promedio de una $n$-vector es definida como\n",
425
+ "\n",
426
+ "$$\n",
427
+ "f(x) = (x_{0}+x_{1}+\\cdots+x_{n-1})/n\n",
428
+ "$$\n",
429
+ "\n",
430
+ "Y se denota como $\\mathbf{avg}(x)$, notemos que este $\\mathbf{avg}(x) = a^{T}x$ con\n",
431
+ "\n",
432
+ "$$\n",
433
+ "a^T = [1/n\\; 1/n\\; \\cdots \\; 1/n] = \\mathbf{1}/n\n",
434
+ "$$"
435
+ ]
436
+ },
437
+ {
438
+ "cell_type": "markdown",
439
+ "metadata": {},
440
+ "source": [
441
+ "**Máximo.** Para $n$-vectores $x$ la función que nos da el máximo coeficiente de un vector es $f(x)=max\\{x_{0},x_{1},\\dots,x_{n-1}\\}$ y no es lineal. Para demostrar esto voy a suponer que es lineal y dar un contraejemplo. Si tomamos $x^T = [1,-1]$ y $y^T=[-1,1]$ con $\\alpha = 1/2$ y $\\beta = 1/2$. Entonces tenemos que:\n",
442
+ "\n",
443
+ "$$\n",
444
+ "f(\\alpha x + \\beta y) = 0 \\neq \\alpha f(x) + \\beta f(y) = 1\n",
445
+ "$$"
446
+ ]
447
+ },
448
+ {
449
+ "cell_type": "code",
450
+ "execution_count": 28,
451
+ "metadata": {},
452
+ "outputs": [],
453
+ "source": [
454
+ "def MAX(x):\n",
455
+ " return np.max(x)"
456
+ ]
457
+ },
458
+ {
459
+ "cell_type": "code",
460
+ "execution_count": 29,
461
+ "metadata": {},
462
+ "outputs": [
463
+ {
464
+ "name": "stdout",
465
+ "output_type": "stream",
466
+ "text": [
467
+ "MAX([1,0,2]) = 2\n"
468
+ ]
469
+ }
470
+ ],
471
+ "source": [
472
+ "print('MAX([1,0,2]) = ', MAX(np.array([1,0,2])))"
473
+ ]
474
+ },
475
+ {
476
+ "cell_type": "code",
477
+ "execution_count": 30,
478
+ "metadata": {},
479
+ "outputs": [],
480
+ "source": [
481
+ "x = np.array([1,-1])\n",
482
+ "y = np.array([-1,1])\n",
483
+ "a,b = 1/2, 1/2"
484
+ ]
485
+ },
486
+ {
487
+ "cell_type": "code",
488
+ "execution_count": 31,
489
+ "metadata": {},
490
+ "outputs": [
491
+ {
492
+ "name": "stdout",
493
+ "output_type": "stream",
494
+ "text": [
495
+ "MAX(a*x + b*y) = 0.0\n"
496
+ ]
497
+ }
498
+ ],
499
+ "source": [
500
+ "print('MAX(a*x + b*y) = ', MAX(a*x + b*y))"
501
+ ]
502
+ },
503
+ {
504
+ "cell_type": "code",
505
+ "execution_count": 32,
506
+ "metadata": {},
507
+ "outputs": [
508
+ {
509
+ "name": "stdout",
510
+ "output_type": "stream",
511
+ "text": [
512
+ "a*MAX(x) + b*MAX(y) = 1.0\n"
513
+ ]
514
+ }
515
+ ],
516
+ "source": [
517
+ "print('a*MAX(x) + b*MAX(y) = ', a*MAX(x) + b*MAX(y))"
518
+ ]
519
+ },
520
+ {
521
+ "cell_type": "markdown",
522
+ "metadata": {},
523
+ "source": [
524
+ "## 5.2 Algunas consideraciones"
525
+ ]
526
+ },
527
+ {
528
+ "cell_type": "markdown",
529
+ "metadata": {},
530
+ "source": [
531
+ "**Funciones Afines.** Una función $f:\\mathbb{R}^{n} \\to \\mathbb{R}$ es afín si y solo si puede ser expresada como $f(x) = a^{T}x + b$ para algún $n$-vector $a$ y un escalar $b$, es llamado algunas veces *offset* o *bias*. Por ejemplo si consideramos la siguiente función:\n",
532
+ "\n",
533
+ "$$\n",
534
+ "f(x) = 3 + x_{0}+x_{1}+x_{2}\n",
535
+ "$$\n",
536
+ "\n",
537
+ "La podemos representar como \n",
538
+ "\n",
539
+ "$$\n",
540
+ "f(x) = a^T x + b = [1 \\; 1 \\; 1] x + 3\n",
541
+ "$$"
542
+ ]
543
+ },
544
+ {
545
+ "cell_type": "markdown",
546
+ "metadata": {},
547
+ "source": [
548
+ "Una función afín cumplirá la superposición si y solo si la suma de de los coeficientes de la combinación lineal es uno. Es decir, si $f$ es una función afín entonces $f(\\alpha x + \\beta y) = \\alpha f(x)+ \\beta f(y)$ si y solo si $ \\alpha + \\beta = 1$.\n",
549
+ "\n",
550
+ "*Demostración.* Como $f$ es afín tenemos que $f(x)=a^T x + b$ entonces, usando que $ \\alpha + \\beta = 1$\n",
551
+ "\n",
552
+ "$$\n",
553
+ "\\begin{eqnarray}\n",
554
+ "f(\\alpha x + \\beta y) &=& a^T (\\alpha x + \\beta y) + b \\\\\n",
555
+ " &=& a^T \\alpha x + a^T \\beta y + (\\alpha + \\beta) b \\\\\n",
556
+ " &=& \\alpha a^T x + \\alpha b + \\beta a^T y + \\beta b \\\\\n",
557
+ " &=& \\alpha (a^T x + b) + \\beta (a^T y + b) \\\\\n",
558
+ " &=& \\alpha f(x) + \\beta f(y)\n",
559
+ "\\end{eqnarray}\n",
560
+ "$$"
561
+ ]
562
+ },
563
+ {
564
+ "cell_type": "markdown",
565
+ "metadata": {},
566
+ "source": [
567
+ "**Ejercicio.** Determina si las siguientes funciones son lineales o no:\n",
568
+ "* $f(\\mathbf{x}) = x_{n-1} - x_{0}$\n",
569
+ "\n",
570
+ "* Si $\\mathbf{x}\\in\\mathbb{R}^{4}$ y $f:\\mathbb{R}^{4} \\to \\mathbb{R}$ definida como $f(\\mathbf{x})=x_{3}+(x_{3}-x_{2})$"
571
+ ]
572
+ },
573
+ {
574
+ "cell_type": "markdown",
575
+ "metadata": {},
576
+ "source": [
577
+ "**Problema: Potencia en un clúster de procesadores y temperatura.** La temperatura $T$ de un cluster de tres procesadores es una función afín de la potencia de los procesadores $P^T = [P_{0}\\; P_{1}\\; P_{2}]$. Cuando los tres procesadores están en reposo tenemos que $P^T = [10\\; 10\\; 10]$ lo cual nos da una temperatura de $T=35$. Cuando el primer procesador opera a potencia absoluta tenemos que $P^T = [100\\; 10\\; 10]$ y la temperatura se eleva a $T=60$. Cuando el segundo procesador opera a su máxima capacidad tenemos $P^T = [10\\; 100\\; 10]$ y la temperatura se eleva a $T=75$. Cuando el tercer procesador opera a máxima potencia mientras que los otros dos están en reposo tenemos que $P^T = [10\\; 10\\; 100]$ y la temperatura se elevea a $T=65$. Supongamos que los tres procesadores operan a máxima potencia ¿Qué temperatura se alcanza? La temperatura de fusión de los procesadores (a la que los procesadores se derriten) es cerca de $150$ ¿Cuál es la potencia máxima que pueden alcanzar los procesadores para que $T\\le 150$? \n",
578
+ "*Hint:* $T(P) = a^T P + b$"
579
+ ]
580
+ }
581
+ ],
582
+ "metadata": {
583
+ "kernelspec": {
584
+ "display_name": "Python 3",
585
+ "language": "python",
586
+ "name": "python3"
587
+ },
588
+ "language_info": {
589
+ "codemirror_mode": {
590
+ "name": "ipython",
591
+ "version": 3
592
+ },
593
+ "file_extension": ".py",
594
+ "mimetype": "text/x-python",
595
+ "name": "python",
596
+ "nbconvert_exporter": "python",
597
+ "pygments_lexer": "ipython3",
598
+ "version": "3.7.3"
599
+ }
600
+ },
601
+ "nbformat": 4,
602
+ "nbformat_minor": 4
603
+ }
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Funciones Afines Propiedades y Ejercicios Prácticos.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a9b0a387e99562beceec610f4c956688a819547fa48e0f278f9953e01284a91d
3
+ size 96678478
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Funciones Afines Propiedades y Ejercicios Prácticos.vtt ADDED
@@ -0,0 +1,502 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:03.040 --> 00:00:05.520
4
+ Hola de nuevo. En las clases pasadas ya
5
+
6
+ 00:00:05.520 --> 00:00:09.139
7
+ hablamos sobre funciones, tuvimos vastos ejemplos sobre funciones.
8
+
9
+ 00:00:09.599 --> 00:00:11.920
10
+ Ahora vamos a ver un último ejemplo y
11
+
12
+ 00:00:11.920 --> 00:00:15.665
13
+ te voy a presentar tus ejercicios. Sin más,
14
+
15
+ 00:00:15.665 --> 00:00:19.025
16
+ vamos a la computadora. Nuevamente te presento este
17
+
18
+ 00:00:19.025 --> 00:00:21.665
19
+ notebook sobre el que hemos venido trabajando. En
20
+
21
+ 00:00:21.665 --> 00:00:24.705
22
+ este notebook vamos a encontrar ya nuestra última
23
+
24
+ 00:00:24.705 --> 00:00:28.625
25
+ parte. Vamos a hablar dentro de algunas consideraciones
26
+
27
+ 00:00:28.625 --> 00:00:31.570
28
+ de las funciones afines, y vamos a considerar
29
+
30
+ 00:00:31.710 --> 00:00:33.950
31
+ una función para hablar de las funciones afines
32
+
33
+ 00:00:33.950 --> 00:00:37.710
34
+ que vaya de RNARY diremos que la función
35
+
36
+ 00:00:37.710 --> 00:00:40.990
37
+ es afín sí y solo sí, es decir,
38
+
39
+ 00:00:40.990 --> 00:00:44.035
40
+ que se tiene que cumplir sí o sí,
41
+
42
+ 00:00:44.495 --> 00:00:48.114
43
+ puede ser expresada como f de x igual
44
+
45
+ 00:00:48.175 --> 00:00:50.975
46
+ a a de a traspuesta por x más
47
+
48
+ 00:00:50.975 --> 00:00:56.434
49
+ b, donde AYX son n vectores y estamos
50
+
51
+ 00:00:56.735 --> 00:00:59.910
52
+ pensando a b como un escalar. B es
53
+
54
+ 00:00:59.910 --> 00:01:02.250
55
+ algunas veces llamado el offset o el bias.
56
+
57
+ 00:01:03.350 --> 00:01:07.350
58
+ Por ejemplo, si consideramos la siguiente función dada
59
+
60
+ 00:01:07.350 --> 00:01:10.230
61
+ por esta expresión de aquí, tres más x
62
+
63
+ 00:01:10.230 --> 00:01:12.895
64
+ cero más x uno más x dos, esta
65
+
66
+ 00:01:12.895 --> 00:01:16.655
67
+ la podemos representar como a traspuesta por el
68
+
69
+ 00:01:16.655 --> 00:01:19.855
70
+ vector x más b, donde a será el
71
+
72
+ 00:01:19.855 --> 00:01:23.615
73
+ vector uno uno uno por x, y este
74
+
75
+ 00:01:23.615 --> 00:01:26.335
76
+ tres lo representamos como el offset que está
77
+
78
+ 00:01:26.335 --> 00:01:30.000
79
+ justamente acá. Una función afín cumplirá la superposición
80
+
81
+ 00:01:30.140 --> 00:01:34.700
82
+ a propiedades superposición si, y solamente si, la
83
+
84
+ 00:01:34.700 --> 00:01:37.420
85
+ suma de los coeficientes de la combinación lineal
86
+
87
+ 00:01:37.420 --> 00:01:41.625
88
+ en la que estamos evaluando es uno. Hace
89
+
90
+ 00:01:41.625 --> 00:01:45.305
91
+ algunas clases, cuando presentamos las combinaciones lineales, presentamos
92
+
93
+ 00:01:45.305 --> 00:01:49.485
94
+ las las combinaciones lineales afines, y era justamente
95
+
96
+ 00:01:49.545 --> 00:01:52.985
97
+ en donde los coeficientes de las combinaciones lineales
98
+
99
+ 00:01:52.985 --> 00:01:56.800
100
+ nos sumaban uno. En este caso, vamos a
101
+
102
+ 00:01:56.800 --> 00:02:00.340
103
+ decir que la función afín cumple la superposición
104
+
105
+ 00:02:00.960 --> 00:02:04.259
106
+ si solamente si la suma de los coeficientes
107
+
108
+ 00:02:04.799 --> 00:02:08.239
109
+ es de los coeficientes de la combinación lineal
110
+
111
+ 00:02:08.239 --> 00:02:11.885
112
+ es uno, o bien, simplemente, decir que la
113
+
114
+ 00:02:11.885 --> 00:02:17.165
115
+ que la combinación lineal es afín. Ahora, si
116
+
117
+ 00:02:17.165 --> 00:02:20.225
118
+ es afín, nosotros tenemos que tiene que cumplir
119
+
120
+ 00:02:20.365 --> 00:02:23.325
121
+ esta propiedad aquí, pero solamente la va a
122
+
123
+ 00:02:23.325 --> 00:02:28.090
124
+ cumplir si a más beta es uno. Entonces,
125
+
126
+ 00:02:28.090 --> 00:02:31.329
127
+ f evaluado en la combinación lineal alfa más
128
+
129
+ 00:02:31.370 --> 00:02:34.810
130
+ alfa x más beta e y es igual
131
+
132
+ 00:02:34.810 --> 00:02:37.769
133
+ a alfa por f de x más beta
134
+
135
+ 00:02:37.769 --> 00:02:40.405
136
+ por f de y, si solo si alfa
137
+
138
+ 00:02:40.405 --> 00:02:43.045
139
+ más beta es igual a uno. Vamos a
140
+
141
+ 00:02:43.045 --> 00:02:47.385
142
+ demostrar esto. Como f es afín, sabemos que
143
+
144
+ 00:02:47.445 --> 00:02:50.005
145
+ f se puede expresar como un vector a
146
+
147
+ 00:02:50.005 --> 00:02:53.000
148
+ traspuesto por x más b, y entonces aquí
149
+
150
+ 00:02:53.540 --> 00:02:55.620
151
+ vamos a usar el hecho de que a
152
+
153
+ 00:02:55.620 --> 00:02:59.060
154
+ más beta es igual a uno. Primero, vamos
155
+
156
+ 00:02:59.060 --> 00:03:03.880
157
+ a partir de f por a x más
158
+
159
+ 00:03:05.795 --> 00:03:08.355
160
+ beta veces y. Esto es igual a a
161
+
162
+ 00:03:08.355 --> 00:03:12.515
163
+ traspuesta por alfa x más beta veces y
164
+
165
+ 00:03:12.515 --> 00:03:14.515
166
+ más b. Esa es la definición de una
167
+
168
+ 00:03:14.515 --> 00:03:16.595
169
+ función afín, así se puede expresar una función
170
+
171
+ 00:03:16.595 --> 00:03:21.870
172
+ afín. Ahora, sabemos que esto se distribuye dentro
173
+
174
+ 00:03:21.870 --> 00:03:24.750
175
+ de la suma de esta multiplicación. Entonces, lo
176
+
177
+ 00:03:24.750 --> 00:03:29.569
178
+ podemos escribir como a traspuesta por alfa veces
179
+
180
+ 00:03:29.709 --> 00:03:33.545
181
+ x más a traspuesta por beta veces y,
182
+
183
+ 00:03:33.925 --> 00:03:36.585
184
+ y aquí viene en donde utilizamos esta propiedad.
185
+
186
+ 00:03:38.245 --> 00:03:41.765
187
+ Notemos que como alfa más beta es un
188
+
189
+ 00:03:41.765 --> 00:03:46.325
190
+ uno, entonces esto de aquí es uno por
191
+
192
+ 00:03:46.325 --> 00:03:49.430
193
+ beta, por b, y uno por b es
194
+
195
+ 00:03:49.430 --> 00:03:52.629
196
+ simplemente b, entonces no estamos alterando para nada
197
+
198
+ 00:03:52.629 --> 00:03:57.050
199
+ esta ecuación, solamente introdujimos este término de aquí.
200
+
201
+ 00:03:57.989 --> 00:04:03.285
202
+ Repito, como alfa más beta es igual a
203
+
204
+ 00:04:03.285 --> 00:04:13.285
205
+ uno, entonces alfa más beta por b es
206
+
207
+ 00:04:13.285 --> 00:04:17.310
208
+ simplemente el b, porque alfa más beta es
209
+
210
+ 00:04:17.310 --> 00:04:22.350
211
+ un uno. Y entonces podemos distribuir esta suma
212
+
213
+ 00:04:22.350 --> 00:04:26.670
214
+ también. Distribuyéndola nos queda ese término de beta
215
+
216
+ 00:04:26.670 --> 00:04:30.425
217
+ más alfa, lo colocamos aquí, y ese término
218
+
219
+ 00:04:30.425 --> 00:04:33.885
220
+ de de beta por b lo colocamos acá.
221
+
222
+ 00:04:34.665 --> 00:04:39.945
223
+ Y entonces podemos reagrupar términos y tenemos que
224
+
225
+ 00:04:39.945 --> 00:04:44.550
226
+ reagrupando por alfa, tenemos alfa por a traspuesta
227
+
228
+ 00:04:44.690 --> 00:04:47.570
229
+ por x más b, que es este término
230
+
231
+ 00:04:47.570 --> 00:04:53.010
232
+ de aquí, más beta veces a traspuesta por
233
+
234
+ 00:04:53.010 --> 00:04:56.290
235
+ y más b, que es este término de
236
+
237
+ 00:04:56.290 --> 00:05:03.045
238
+ aquí, pero agrupamos por beta. Y ahora bien,
239
+
240
+ 00:05:03.105 --> 00:05:06.405
241
+ esto de aquí es justo la definición de
242
+
243
+ 00:05:06.625 --> 00:05:09.525
244
+ una función afín evaluada en el vector x.
245
+
246
+ 00:05:09.665 --> 00:05:12.545
247
+ Entonces, podemos escribir esto simplemente como f de
248
+
249
+ 00:05:12.545 --> 00:05:16.040
250
+ x por alfa. Esto de aquí es la
251
+
252
+ 00:05:16.040 --> 00:05:18.840
253
+ función afín, la una función afín evaluada en
254
+
255
+ 00:05:18.840 --> 00:05:22.600
256
+ x. Entonces, f de x por alfa. Lo
257
+
258
+ 00:05:22.600 --> 00:05:24.920
259
+ mismo pasa con este lado, esto es una
260
+
261
+ 00:05:24.920 --> 00:05:27.815
262
+ función afín evaluada en el vector y. Entonces,
263
+
264
+ 00:05:28.355 --> 00:05:32.375
265
+ nos queda beta por f evaluada en y,
266
+
267
+ 00:05:33.075 --> 00:05:37.015
268
+ y así comprobamos que f cumple la propiedad
269
+
270
+ 00:05:37.715 --> 00:05:40.275
271
+ de superposición, que es f evaluado en la
272
+
273
+ 00:05:40.275 --> 00:05:44.460
274
+ combinación lineal, es igual a la suma de
275
+
276
+ 00:05:47.320 --> 00:05:50.840
277
+ la función evaluada en los vectores multiplicada por
278
+
279
+ 00:05:50.840 --> 00:05:56.535
280
+ los escalares. Ahora bien, vamos a pasar a
281
+
282
+ 00:05:56.535 --> 00:06:02.235
283
+ tus ejercicios. Tus ejercicios van a estar distribuidos
284
+
285
+ 00:06:02.375 --> 00:06:05.910
286
+ en un ejercicio y en un problema. En
287
+
288
+ 00:06:05.910 --> 00:06:09.270
289
+ el ejercicio tienes que determinar si estas funciones
290
+
291
+ 00:06:09.270 --> 00:06:11.990
292
+ de aquí son lineales o no. En el
293
+
294
+ 00:06:11.990 --> 00:06:14.970
295
+ primer problema estoy pensando que esta función f
296
+
297
+ 00:06:15.350 --> 00:06:20.925
298
+ es una función que va de RNAR. En
299
+
300
+ 00:06:20.925 --> 00:06:23.725
301
+ general, de RNAR, no de r dos, de
302
+
303
+ 00:06:23.725 --> 00:06:26.765
304
+ r tres, sino de algún RNAR. Hay que
305
+
306
+ 00:06:26.765 --> 00:06:29.405
307
+ determinar si esta función es lineal o no.
308
+
309
+ 00:06:29.405 --> 00:06:31.965
310
+ Tienes que comprobar si esta función cumple o
311
+
312
+ 00:06:31.965 --> 00:06:36.340
313
+ no la propiedad de superposición. Lo mismo para
314
+
315
+ 00:06:36.340 --> 00:06:38.900
316
+ el problema de abajo, vamos a considerar un
317
+
318
+ 00:06:38.900 --> 00:06:41.220
319
+ x en r cuatro y vamos a tener
320
+
321
+ 00:06:41.220 --> 00:06:44.340
322
+ una función definida como x tres menos x
323
+
324
+ 00:06:44.340 --> 00:06:48.200
325
+ tres menos más x tres menos x dos.
326
+
327
+ 00:06:48.465 --> 00:06:51.345
328
+ Hay que comprobar si esta función cumple la
329
+
330
+ 00:06:51.345 --> 00:06:55.025
331
+ superposición. Si no la cumple, diríamos que la
332
+
333
+ 00:06:55.025 --> 00:06:59.665
334
+ función no es lineal. Y viene un problema
335
+
336
+ 00:06:59.665 --> 00:07:03.120
337
+ muy interesante. Este es un problema más simplificado,
338
+
339
+ 00:07:03.120 --> 00:07:05.280
340
+ pero realmente así se manejan algo que se
341
+
342
+ 00:07:05.280 --> 00:07:08.160
343
+ llaman los sistemas de control. Y el problema
344
+
345
+ 00:07:08.160 --> 00:07:10.400
346
+ es este, vamos a asumir que tenemos un
347
+
348
+ 00:07:10.400 --> 00:07:15.395
349
+ clúster de tres procesadores, y nosotros lo que
350
+
351
+ 00:07:15.395 --> 00:07:18.295
352
+ podemos medir en ese clúster son la temperatura
353
+
354
+ 00:07:18.995 --> 00:07:20.995
355
+ y la potencia a la que operan esos
356
+
357
+ 00:07:20.995 --> 00:07:23.815
358
+ procesadores. La potencia a la que operan esos
359
+
360
+ 00:07:23.955 --> 00:07:26.755
361
+ procesadores en orden está dado por este vector,
362
+
363
+ 00:07:26.755 --> 00:07:30.460
364
+ y la temperatura la denotaremos como t. Ahora,
365
+
366
+ 00:07:30.680 --> 00:07:33.480
367
+ cuando los tres procesadores están en reposo, tenemos
368
+
369
+ 00:07:33.480 --> 00:07:38.440
370
+ que la potencia que medimos es diez diez
371
+
372
+ 00:07:38.440 --> 00:07:40.700
373
+ diez, esto va a significar que los tres
374
+
375
+ 00:07:40.760 --> 00:07:43.885
376
+ procesadores están en reposo, y cuando estos tres
377
+
378
+ 00:07:43.885 --> 00:07:46.765
379
+ están en reposo, nosotros medimos una temperatura de
380
+
381
+ 00:07:46.765 --> 00:07:51.025
382
+ treinta y cinco grados. Ahora, cuando el primer
383
+
384
+ 00:07:51.325 --> 00:07:55.345
385
+ procesador opera máxima potencia, pero los otros dos
386
+
387
+ 00:07:55.885 --> 00:08:00.140
388
+ están en reposo, tenemos que la potencia medida
389
+
390
+ 00:08:00.140 --> 00:08:03.120
391
+ será el vector cien en la primera entrada
392
+
393
+ 00:08:03.580 --> 00:08:07.100
394
+ diez diez, y la temperatura se elevará a
395
+
396
+ 00:08:07.100 --> 00:08:11.845
397
+ sesenta grados. En cambio, cuando el segundo procesador
398
+
399
+ 00:08:11.845 --> 00:08:15.384
400
+ opera su máxima capacidad, nosotros mediremos el vector
401
+
402
+ 00:08:16.164 --> 00:08:20.264
403
+ diez, cien, diez, y la temperatura se elevará
404
+
405
+ 00:08:20.405 --> 00:08:24.669
406
+ a setenta y cinco grados. Hay que recordar
407
+
408
+ 00:08:24.669 --> 00:08:27.310
409
+ que aquí los otros dos procesadores, el uno
410
+
411
+ 00:08:27.310 --> 00:08:32.150
412
+ y el tres, están en reposo. Ahora, cuando
413
+
414
+ 00:08:32.150 --> 00:08:34.990
415
+ se eleva el tercer procesador y opera esta
416
+
417
+ 00:08:34.990 --> 00:08:37.709
418
+ máxima potencia, mientras los otros dos están en
419
+
420
+ 00:08:37.709 --> 00:08:41.995
421
+ reposo, tenemos que el vector de potencia medido
422
+
423
+ 00:08:41.995 --> 00:08:43.995
424
+ es diez diez, porque el primero y el
425
+
426
+ 00:08:43.995 --> 00:08:47.035
427
+ segundo están en reposo, y el tercero está
428
+
429
+ 00:08:47.035 --> 00:08:50.635
430
+ en potencia cien. Y cuando y, en este
431
+
432
+ 00:08:50.635 --> 00:08:52.875
433
+ caso, la temperatura se eleva a sesenta y
434
+
435
+ 00:08:52.875 --> 00:08:56.870
436
+ cinco grados. Ahora, supongamos que los tres procesadores
437
+
438
+ 00:08:56.870 --> 00:09:00.870
439
+ operan a máxima potencia. La pregunta que tienes
440
+
441
+ 00:09:00.870 --> 00:09:03.769
442
+ que resolver es qué temperatura va a alcanzar
443
+
444
+ 00:09:04.389 --> 00:09:08.955
445
+ el sistema. Ahora, una cosa más, la temperatura
446
+
447
+ 00:09:08.955 --> 00:09:11.195
448
+ en función de los procesadores, es decir, a
449
+
450
+ 00:09:11.195 --> 00:09:13.595
451
+ la temperatura a la que se podrían derretir,
452
+
453
+ 00:09:13.595 --> 00:09:16.555
454
+ está cerca de los ciento cincuenta grados. ¿Cuál
455
+
456
+ 00:09:16.555 --> 00:09:19.275
457
+ es, entonces, la potencia máxima que pueden alcanzar
458
+
459
+ 00:09:19.275 --> 00:09:22.850
460
+ los procesadores para garantizar que te siempre esté,
461
+
462
+ 00:09:22.850 --> 00:09:25.010
463
+ que la temperatura esté a lo más, o
464
+
465
+ 00:09:25.010 --> 00:09:27.650
466
+ sea, sea menor o igual que ciento cincuenta
467
+
468
+ 00:09:27.650 --> 00:09:30.290
469
+ grados. El fin que te voy a dar
470
+
471
+ 00:09:30.290 --> 00:09:32.530
472
+ es que la función de la temperatura la
473
+
474
+ 00:09:32.530 --> 00:09:36.050
475
+ puedes en la temperatura va a ser una
476
+
477
+ 00:09:36.050 --> 00:09:38.755
478
+ función afín de la del vector de potencia.
479
+
480
+ 00:09:39.214 --> 00:09:41.134
481
+ Lo que tendrás que encontrar en este caso
482
+
483
+ 00:09:41.134 --> 00:09:43.555
484
+ será este vector b y este vector a.
485
+
486
+ 00:09:44.975 --> 00:09:48.815
487
+ Hasta aquí llevo esa sesión de funciones. Espero
488
+
489
+ 00:09:48.815 --> 00:09:51.954
490
+ que pongas en los comentarios tus dudas, detenerlas,
491
+
492
+ 00:09:52.690 --> 00:09:54.769
493
+ y la comunidad de Platzi o yo te
494
+
495
+ 00:09:54.769 --> 00:09:58.470
496
+ las podríamos resolver. También espero ver las soluciones
497
+
498
+ 00:09:58.610 --> 00:10:01.810
499
+ de tu problema. Nos vemos en la siguiente
500
+
501
+ 00:10:01.810 --> 00:10:02.310
502
+ clase.
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Lecturas recomendadas.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ https://colab.research.google.com/drive/1uHLHnGyq5fgP917lwwh3JDNhNtr3EZhw?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_1_791b9934-e2e7-4a79-9088-20b778cea79a.png ADDED
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_2_688205df-74d5-46e1-8388-33e306c7158c.png ADDED
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_t1_7578434d-8348-453c-a733-4a2ac8a759c2.png ADDED
a/Curso de Introducci/303/263n al /303/201lgebra Lineal Vectores/03-Funciones lineales/04-fl_t2_18bf8950-e77a-4a67-bbaa-37fbebb0ecfe.png ADDED
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/04-funciones_lineales_edd8fc32-9519-46dc-88dd-8718820a615d.ipynb ADDED
@@ -0,0 +1,603 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 5. Funciones Lineales"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "La notación $f: \\mathbb{R}^{n}\\to \\mathbb{R}$ significa que $f$ es una función con **dominio** en $\\mathbb{R}^{n}$ e imagen en $\\mathbb{R}$, es decir, que toma un $n$-vector y lo convierte en un escalar. \n",
15
+ "La función puede denotarse como $f\\left(\\mathbf{x}\\right)= f\\left(x_{0},x_{1},\\dots,x_{n-1}\\right)$ donde $\\mathbf{x}\\in \\mathbb{R}^{n}$ y $x_{i}$ son las entradas del vector. \n",
16
+ "\n",
17
+ "Es necesario enfatizar que $f(\\mathbf{x})$ es un escalar. "
18
+ ]
19
+ },
20
+ {
21
+ "cell_type": "markdown",
22
+ "metadata": {},
23
+ "source": [
24
+ "Para describir una función $f: \\mathbb{R}^{n} \\to \\mathbb{R}$ tenemos que especificar el cual es el valor para cualquier vector $\\mathbf{x}\\in\\mathbb{R}^{n}$. Por ejemplo, sea $f: \\mathbb{R}^{4} \\to \\mathbb{R}$ definida por\n",
25
+ "$$\n",
26
+ "f(\\mathbf{x}) = x_{0} + x_{1} + x_{2} + x_{3}\n",
27
+ "$$"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "Así pues el valor de cualquier $4$-vector queda bien definido, por ejemplo:\n",
35
+ "\n",
36
+ "* $f(\\mathbf{0}) = 0 + 0+ 0+0 = 0$\n",
37
+ "\n",
38
+ "* $f([1\\; 0\\; 0\\; 0]) = 1+0+0+0 = 1$\n",
39
+ "\n",
40
+ "* $f([1\\; 1\\; 1\\; 1]) = 1+1+1+1 = 4$"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type": "code",
45
+ "execution_count": 15,
46
+ "metadata": {},
47
+ "outputs": [],
48
+ "source": [
49
+ "import numpy as np"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": 16,
55
+ "metadata": {},
56
+ "outputs": [],
57
+ "source": [
58
+ "def f(x):\n",
59
+ " return np.sum(x)"
60
+ ]
61
+ },
62
+ {
63
+ "cell_type": "code",
64
+ "execution_count": 17,
65
+ "metadata": {},
66
+ "outputs": [
67
+ {
68
+ "name": "stdout",
69
+ "output_type": "stream",
70
+ "text": [
71
+ "f(0) = 0\n"
72
+ ]
73
+ }
74
+ ],
75
+ "source": [
76
+ "print('f(0) = ',f(np.array([0,0,0,0])))"
77
+ ]
78
+ },
79
+ {
80
+ "cell_type": "code",
81
+ "execution_count": 18,
82
+ "metadata": {},
83
+ "outputs": [
84
+ {
85
+ "name": "stdout",
86
+ "output_type": "stream",
87
+ "text": [
88
+ "f([1,0,0,0]) = 1\n"
89
+ ]
90
+ }
91
+ ],
92
+ "source": [
93
+ "print('f([1,0,0,0]) = ',f(np.array([1,0,0,0])))"
94
+ ]
95
+ },
96
+ {
97
+ "cell_type": "code",
98
+ "execution_count": 19,
99
+ "metadata": {},
100
+ "outputs": [
101
+ {
102
+ "name": "stdout",
103
+ "output_type": "stream",
104
+ "text": [
105
+ "f([1,1,1,1]) = 4\n"
106
+ ]
107
+ }
108
+ ],
109
+ "source": [
110
+ "print('f([1,1,1,1]) = ',f(np.array([1,1,1,1])))"
111
+ ]
112
+ },
113
+ {
114
+ "cell_type": "markdown",
115
+ "metadata": {},
116
+ "source": [
117
+ "Como otro ejemplo, sea $g: \\mathbb{R}^{3} \\to \\mathbb{R}$ definida por \n",
118
+ "$$\n",
119
+ "g(\\mathbf{x}) = x_{0}\n",
120
+ "$$"
121
+ ]
122
+ },
123
+ {
124
+ "cell_type": "markdown",
125
+ "metadata": {},
126
+ "source": [
127
+ "Tenemos entonces:\n",
128
+ "\n",
129
+ "* $g(\\mathbf{0}) = 0$ \n",
130
+ "\n",
131
+ "* $g([0\\; 0\\; 1]) = 0$\n",
132
+ "\n",
133
+ "* $g([1\\; 0\\; 4]) = 1$"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "code",
138
+ "execution_count": 20,
139
+ "metadata": {},
140
+ "outputs": [],
141
+ "source": [
142
+ "def g(x):\n",
143
+ " return x[0]"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "code",
148
+ "execution_count": 21,
149
+ "metadata": {},
150
+ "outputs": [
151
+ {
152
+ "name": "stdout",
153
+ "output_type": "stream",
154
+ "text": [
155
+ "g(0) = 0\n"
156
+ ]
157
+ }
158
+ ],
159
+ "source": [
160
+ "print('g(0) = ',g(np.array([0,0,0])))"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 22,
166
+ "metadata": {},
167
+ "outputs": [
168
+ {
169
+ "name": "stdout",
170
+ "output_type": "stream",
171
+ "text": [
172
+ "g([0,0,1]) = 0\n"
173
+ ]
174
+ }
175
+ ],
176
+ "source": [
177
+ "print('g([0,0,1]) = ',g(np.array([0,0,1])))"
178
+ ]
179
+ },
180
+ {
181
+ "cell_type": "code",
182
+ "execution_count": 23,
183
+ "metadata": {},
184
+ "outputs": [
185
+ {
186
+ "name": "stdout",
187
+ "output_type": "stream",
188
+ "text": [
189
+ "g([1,0,4]) = 1\n"
190
+ ]
191
+ }
192
+ ],
193
+ "source": [
194
+ "print('g([1,0,4]) = ',g(np.array([1,0,4])))"
195
+ ]
196
+ },
197
+ {
198
+ "cell_type": "markdown",
199
+ "metadata": {},
200
+ "source": [
201
+ "Podemos notar que en este caso $f(\\mathbf{x})$ corresponde a la _función suma_ y $g(\\mathbf{x})$ a proyección sobre $x_{0}$."
202
+ ]
203
+ },
204
+ {
205
+ "cell_type": "markdown",
206
+ "metadata": {},
207
+ "source": [
208
+ "## 5.1 Algunas funciones"
209
+ ]
210
+ },
211
+ {
212
+ "cell_type": "markdown",
213
+ "metadata": {},
214
+ "source": [
215
+ "**Función producto interno**. Si una función tiene como aurgmentos dos $n$-vectores el dominio de la función se expresará como $\\mathbb{R}^{n}\\times\\mathbb{R}^{n}$. Por ejemplo, sea $f:\\mathbb{R}^{n}\\times\\mathbb{R}^{n} \\to \\mathbb{R}$ definida por:\n",
216
+ "\n",
217
+ "$$\n",
218
+ "f(\\mathbf{a},\\mathbf{b}) = a_{0}b_{0} + a_{1}b_{1} + \\cdots + a_{n-1}b_{n-1}\n",
219
+ "$$"
220
+ ]
221
+ },
222
+ {
223
+ "cell_type": "markdown",
224
+ "metadata": {},
225
+ "source": [
226
+ "Notemos que podemos expresar lo anterior como\n",
227
+ "\n",
228
+ "$$\n",
229
+ "f(\\mathbf{a},\\mathbf{b}) = \\mathbf{a}^{T}\\mathbf{b}\n",
230
+ "$$\n",
231
+ "\n",
232
+ "Esta función recibe el nombre de función producto interno. Si quisieramos dejar fijo un vector, digamos el vector $\\mathbf{a}$ podemos recurrir a la siguiente notación:\n",
233
+ "\n",
234
+ "$$\n",
235
+ "f_{\\mathbf{a}}(\\mathbf{b}) = \\mathbf{a}^{T}\\mathbf{b}\n",
236
+ "$$\n",
237
+ "\n",
238
+ "Esto significará que $\\mathbf{a}$ estará fijo mientras que $\\mathbf{b}$ será el que variará. "
239
+ ]
240
+ },
241
+ {
242
+ "cell_type": "markdown",
243
+ "metadata": {},
244
+ "source": [
245
+ "**Superposición y linealidad.** La función producto interno satisface la siguiente propiedad:\n",
246
+ "\n",
247
+ "$$\n",
248
+ "\\begin{eqnarray}\n",
249
+ "f_\\mathbf{x}(\\alpha\\mathbf{a}+\\beta\\mathbf{b}) &=& \\mathbf{x}^{T}(\\alpha\\mathbf{a}+\\beta\\mathbf{b}) \\\\\n",
250
+ " &=& \\mathbf{x}^{T}(\\alpha\\mathbf{a})+\\mathbf{x}^{T}(\\beta\\mathbf{b}) \\\\\n",
251
+ " &=& \\alpha(\\mathbf{x}^{T}\\mathbf{a}) + \\beta(\\mathbf{x}^{T}\\mathbf{b}) \\\\\n",
252
+ " &=& \\alpha f_{\\mathbf{x}}(\\mathbf{a}) + \\beta f_{\\mathbf{x}}(\\mathbf{b})\n",
253
+ "\\end{eqnarray}\n",
254
+ "$$\n",
255
+ "\n",
256
+ "Si la función $g$ cumple que $g(\\alpha\\mathbf{x}+\\beta\\mathbf{y}) = \\alpha g(\\mathbf{x})+\\beta g(\\mathbf{y})$ decimos que la función $g$ es una **función lineal.** "
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "markdown",
261
+ "metadata": {},
262
+ "source": [
263
+ "Si $f$ es una función lineal la _linearidad_ se extiende a cualquier combinación lineal y no solamente a una combinación de dos vectores, tenemos \n",
264
+ "\n",
265
+ "$$\n",
266
+ "f(\\alpha_{0}\\mathbf{x_{0}} + \\alpha_{1}\\mathbf{x_{1}} + \\alpha_{2}\\mathbf{x_{2}} + \\cdots \n",
267
+ " + \\alpha_{n-1}\\mathbf{x_{n-1}}) = \\alpha_{0}f(\\mathbf{x_{0}}) + \\alpha_{1}f(\\mathbf{x_{1}}) + \\alpha_{2}f(\\mathbf{x_{2}}) + \\cdots + \\alpha_{n-1}f(\\mathbf{x_{n-1}})\n",
268
+ "$$\n"
269
+ ]
270
+ },
271
+ {
272
+ "cell_type": "markdown",
273
+ "metadata": {},
274
+ "source": [
275
+ "Si una función $g:\\mathbf{R}^{n} \\to \\mathbf{R}$ es lineal sabemo que cumple $g(\\alpha\\mathbf{x}+\\beta\\mathbf{y}) = \\alpha g(\\mathbf{x})+\\beta g(\\mathbf{y})$, propiedad que llamaremos _superposición_. Ahora, la superposición puede ser separada en dos propiedades:\n",
276
+ "\n",
277
+ "* _Homogeneidad_. Para cualquier $n$-vector $\\mathbf{x}$ y cualquier escalar $\\alpha$ tenemos que $g(\\alpha \\mathbf{x}) = \\alpha g(\\mathbf{x})$\n",
278
+ "\n",
279
+ "* _Aditividad_. Para cualquier $n$-vector $\\mathbf{x}$ y $\\mathbf{y}$ tenemos que $g(\\mathbf{x}+\\mathbf{y}) = g(\\mathbf{x})+g(\\mathbf{y})$\n",
280
+ "\n",
281
+ "La homogeneidad nos dice que escalar el argumento es igual que escalar el valor de la función; la aditividad nos indica que sumar los argumentos es igual que sumar los valores de la función. "
282
+ ]
283
+ },
284
+ {
285
+ "cell_type": "code",
286
+ "execution_count": 24,
287
+ "metadata": {},
288
+ "outputs": [],
289
+ "source": [
290
+ "a = np.array([1,1,1,1])\n",
291
+ "b = np.array([1,0,1,0])\n",
292
+ "x,y = 1,-2"
293
+ ]
294
+ },
295
+ {
296
+ "cell_type": "code",
297
+ "execution_count": 25,
298
+ "metadata": {},
299
+ "outputs": [
300
+ {
301
+ "name": "stdout",
302
+ "output_type": "stream",
303
+ "text": [
304
+ "f(x*a + y*b) = 0\n"
305
+ ]
306
+ }
307
+ ],
308
+ "source": [
309
+ "print('f(x*a + y*b) = ',f(x*a + y*b))"
310
+ ]
311
+ },
312
+ {
313
+ "cell_type": "code",
314
+ "execution_count": 27,
315
+ "metadata": {},
316
+ "outputs": [
317
+ {
318
+ "name": "stdout",
319
+ "output_type": "stream",
320
+ "text": [
321
+ "x*f(a) + y*f(b) = 0\n"
322
+ ]
323
+ }
324
+ ],
325
+ "source": [
326
+ "print('x*f(a) + y*f(b) =',x*f(a) + y*f(b))"
327
+ ]
328
+ },
329
+ {
330
+ "cell_type": "markdown",
331
+ "metadata": {},
332
+ "source": [
333
+ "**Representación producto interno de una función lineal.** En matemáticas las verdades, cuando son verdades, se demuestran usando argumentos principalmente lógicos. Estas verdades vienen empaquetadas en _teoremas_, _corolarios_ y _lemas_. Si no podemos demostrarlo pero creemos que es verdad lo llamamos _conjetura_. Por ejemplo, consideremos el siguiente teorema:"
334
+ ]
335
+ },
336
+ {
337
+ "cell_type": "markdown",
338
+ "metadata": {},
339
+ "source": [
340
+ "**Teorema.** Los ángulos a ambos lados de una recta, que intersecta a otra, siempre suman $180^\\circ$ \n",
341
+ "\n",
342
+ "![img](fl_1.png)"
343
+ ]
344
+ },
345
+ {
346
+ "cell_type": "markdown",
347
+ "metadata": {},
348
+ "source": [
349
+ "*Demostración*: Supongamos que $\\alpha + \\beta \\neq 180$ eso quiere decir que $\\alpha + \\beta > 180$ o $\\alpha + \\beta < 180$. Ahora, pensemos en la linea **f** pasa por el diámetro, es decir, corta a la mitad al círculo. \n",
350
+ "\n",
351
+ "![](fl_t1.png)\n",
352
+ "\n",
353
+ "Al pasar por el diámetro sabemos que ambos lados tenemos un ángulo de $180^\\circ$. Llamemos a ese ángulo $\\Omega=180^\\circ$. Ahora, llamemos **g** a una línea que pase por otro diámetro. \n",
354
+ "\n",
355
+ "![](fl_t2.png)"
356
+ ]
357
+ },
358
+ {
359
+ "cell_type": "markdown",
360
+ "metadata": {},
361
+ "source": [
362
+ "Entonces, al seccionar con **g** tenemos nuevamente los ángulos $\\alpha$ y $\\beta$ entonces tenemos que $\\alpha + \\beta = \\Omega$ pero asumimos que $\\alpha + \\beta \\neq 180^\\circ$ lo cuyal nos lleva a una contradicción $!$ por ello lo anteior debe ser cierto. "
363
+ ]
364
+ },
365
+ {
366
+ "cell_type": "markdown",
367
+ "metadata": {},
368
+ "source": [
369
+ "**Corolario.** Cuando dos líneas se intersectan los ángulos opuestos entre ellos son iguales.\n",
370
+ "\n",
371
+ "![](fl_2.png)"
372
+ ]
373
+ },
374
+ {
375
+ "cell_type": "markdown",
376
+ "metadata": {},
377
+ "source": [
378
+ "*Demostración:* Sabemos que $\\beta + \\alpha = 180^\\circ$ entonces $\\alpha = 180^\\circ - \\beta$. Por otro lado, sabemos que también $\\gamma + \\beta = 180^\\circ$ así pues $\\gamma = 180^\\circ - \\beta$. Juntando lo anteior tenemos que:\n",
379
+ "\n",
380
+ "$$\n",
381
+ "\\alpha = 180^\\circ - \\beta = \\gamma\n",
382
+ "$$\n",
383
+ "\n",
384
+ "Lo mismo es posible aplicarse para $\\beta$ y $\\delta$. **QED**. "
385
+ ]
386
+ },
387
+ {
388
+ "cell_type": "markdown",
389
+ "metadata": {},
390
+ "source": [
391
+ "Ya explorados los teoremas y los corolarios veamos la siguiente proposición: \n",
392
+ "\n",
393
+ "**Proposición:** Una función definida como el producto punto de sus argumentos y algún vector fijo es lineal. Lo inverso es también verdadero: si una función es lineal entonces puede ser expresada como el producto interno de sus argumentos y algún vector fijo."
394
+ ]
395
+ },
396
+ {
397
+ "cell_type": "markdown",
398
+ "metadata": {},
399
+ "source": [
400
+ "Ahora, sea $f$ una función escalar de $n$-vectores que además es lineal. Entonces decimos que _existe_ un $n$-vector $\\mathbf{a}$ tal que $f(\\mathbf{x}) = \\mathbf{a}^{T}\\mathbf{x}$ para cualquier $\\mathbf{x}$. A la expresión $\\mathbf{a}^{T}\\mathbf{x}$ le llamaremos *representación producto punto* de $f$. "
401
+ ]
402
+ },
403
+ {
404
+ "cell_type": "markdown",
405
+ "metadata": {},
406
+ "source": [
407
+ "Otra propiedad interesante es que la *representación producto punto* de $f$ como $\\mathbf{a}^{T}\\mathbf{x}$ es única. "
408
+ ]
409
+ },
410
+ {
411
+ "cell_type": "markdown",
412
+ "metadata": {},
413
+ "source": [
414
+ "$ f(\\mathbf{x}) = \\displaystyle\\sum_{i}^{n-1} x_{i}$ si n=4 esto lo podemos expresar como $f(\\mathbf{x}) = \\mathbf{a}^{T}\\mathbf{x}$ donde:\n",
415
+ "$$\n",
416
+ "a^T = [1,1,1,1]\n",
417
+ "$$"
418
+ ]
419
+ },
420
+ {
421
+ "cell_type": "markdown",
422
+ "metadata": {},
423
+ "source": [
424
+ "**Promedio.** El promedio de una $n$-vector es definida como\n",
425
+ "\n",
426
+ "$$\n",
427
+ "f(x) = (x_{0}+x_{1}+\\cdots+x_{n-1})/n\n",
428
+ "$$\n",
429
+ "\n",
430
+ "Y se denota como $\\mathbf{avg}(x)$, notemos que este $\\mathbf{avg}(x) = a^{T}x$ con\n",
431
+ "\n",
432
+ "$$\n",
433
+ "a^T = [1/n\\; 1/n\\; \\cdots \\; 1/n] = \\mathbf{1}/n\n",
434
+ "$$"
435
+ ]
436
+ },
437
+ {
438
+ "cell_type": "markdown",
439
+ "metadata": {},
440
+ "source": [
441
+ "**Máximo.** Para $n$-vectores $x$ la función que nos da el máximo coeficiente de un vector es $f(x)=max\\{x_{0},x_{1},\\dots,x_{n-1}\\}$ y no es lineal. Para demostrar esto voy a suponer que es lineal y dar un contraejemplo. Si tomamos $x^T = [1,-1]$ y $y^T=[-1,1]$ con $\\alpha = 1/2$ y $\\beta = 1/2$. Entonces tenemos que:\n",
442
+ "\n",
443
+ "$$\n",
444
+ "f(\\alpha x + \\beta y) = 0 \\neq \\alpha f(x) + \\beta f(y) = 1\n",
445
+ "$$"
446
+ ]
447
+ },
448
+ {
449
+ "cell_type": "code",
450
+ "execution_count": 28,
451
+ "metadata": {},
452
+ "outputs": [],
453
+ "source": [
454
+ "def MAX(x):\n",
455
+ " return np.max(x)"
456
+ ]
457
+ },
458
+ {
459
+ "cell_type": "code",
460
+ "execution_count": 29,
461
+ "metadata": {},
462
+ "outputs": [
463
+ {
464
+ "name": "stdout",
465
+ "output_type": "stream",
466
+ "text": [
467
+ "MAX([1,0,2]) = 2\n"
468
+ ]
469
+ }
470
+ ],
471
+ "source": [
472
+ "print('MAX([1,0,2]) = ', MAX(np.array([1,0,2])))"
473
+ ]
474
+ },
475
+ {
476
+ "cell_type": "code",
477
+ "execution_count": 30,
478
+ "metadata": {},
479
+ "outputs": [],
480
+ "source": [
481
+ "x = np.array([1,-1])\n",
482
+ "y = np.array([-1,1])\n",
483
+ "a,b = 1/2, 1/2"
484
+ ]
485
+ },
486
+ {
487
+ "cell_type": "code",
488
+ "execution_count": 31,
489
+ "metadata": {},
490
+ "outputs": [
491
+ {
492
+ "name": "stdout",
493
+ "output_type": "stream",
494
+ "text": [
495
+ "MAX(a*x + b*y) = 0.0\n"
496
+ ]
497
+ }
498
+ ],
499
+ "source": [
500
+ "print('MAX(a*x + b*y) = ', MAX(a*x + b*y))"
501
+ ]
502
+ },
503
+ {
504
+ "cell_type": "code",
505
+ "execution_count": 32,
506
+ "metadata": {},
507
+ "outputs": [
508
+ {
509
+ "name": "stdout",
510
+ "output_type": "stream",
511
+ "text": [
512
+ "a*MAX(x) + b*MAX(y) = 1.0\n"
513
+ ]
514
+ }
515
+ ],
516
+ "source": [
517
+ "print('a*MAX(x) + b*MAX(y) = ', a*MAX(x) + b*MAX(y))"
518
+ ]
519
+ },
520
+ {
521
+ "cell_type": "markdown",
522
+ "metadata": {},
523
+ "source": [
524
+ "## 5.2 Algunas consideraciones"
525
+ ]
526
+ },
527
+ {
528
+ "cell_type": "markdown",
529
+ "metadata": {},
530
+ "source": [
531
+ "**Funciones Afines.** Una función $f:\\mathbb{R}^{n} \\to \\mathbb{R}$ es afín si y solo si puede ser expresada como $f(x) = a^{T}x + b$ para algún $n$-vector $a$ y un escalar $b$, es llamado algunas veces *offset* o *bias*. Por ejemplo si consideramos la siguiente función:\n",
532
+ "\n",
533
+ "$$\n",
534
+ "f(x) = 3 + x_{0}+x_{1}+x_{2}\n",
535
+ "$$\n",
536
+ "\n",
537
+ "La podemos representar como \n",
538
+ "\n",
539
+ "$$\n",
540
+ "f(x) = a^T x + b = [1 \\; 1 \\; 1] x + 3\n",
541
+ "$$"
542
+ ]
543
+ },
544
+ {
545
+ "cell_type": "markdown",
546
+ "metadata": {},
547
+ "source": [
548
+ "Una función afín cumplirá la superposición si y solo si la suma de de los coeficientes de la combinación lineal es uno. Es decir, si $f$ es una función afín entonces $f(\\alpha x + \\beta y) = \\alpha f(x)+ \\beta f(y)$ si y solo si $ \\alpha + \\beta = 1$.\n",
549
+ "\n",
550
+ "*Demostración.* Como $f$ es afín tenemos que $f(x)=a^T x + b$ entonces, usando que $ \\alpha + \\beta = 1$\n",
551
+ "\n",
552
+ "$$\n",
553
+ "\\begin{eqnarray}\n",
554
+ "f(\\alpha x + \\beta y) &=& a^T (\\alpha x + \\beta y) + b \\\\\n",
555
+ " &=& a^T \\alpha x + a^T \\beta y + (\\alpha + \\beta) b \\\\\n",
556
+ " &=& \\alpha a^T x + \\alpha b + \\beta a^T y + \\beta b \\\\\n",
557
+ " &=& \\alpha (a^T x + b) + \\beta (a^T y + b) \\\\\n",
558
+ " &=& \\alpha f(x) + \\beta f(y)\n",
559
+ "\\end{eqnarray}\n",
560
+ "$$"
561
+ ]
562
+ },
563
+ {
564
+ "cell_type": "markdown",
565
+ "metadata": {},
566
+ "source": [
567
+ "**Ejercicio.** Determina si las siguientes funciones son lineales o no:\n",
568
+ "* $f(\\mathbf{x}) = x_{n-1} - x_{0}$\n",
569
+ "\n",
570
+ "* Si $\\mathbf{x}\\in\\mathbb{R}^{4}$ y $f:\\mathbb{R}^{4} \\to \\mathbb{R}$ definida como $f(\\mathbf{x})=x_{3}+(x_{3}-x_{2})$"
571
+ ]
572
+ },
573
+ {
574
+ "cell_type": "markdown",
575
+ "metadata": {},
576
+ "source": [
577
+ "**Problema: Potencia en un clúster de procesadores y temperatura.** La temperatura $T$ de un cluster de tres procesadores es una función afín de la potencia de los procesadores $P^T = [P_{0}\\; P_{1}\\; P_{2}]$. Cuando los tres procesadores están en reposo tenemos que $P^T = [10\\; 10\\; 10]$ lo cual nos da una temperatura de $T=35$. Cuando el primer procesador opera a potencia absoluta tenemos que $P^T = [100\\; 10\\; 10]$ y la temperatura se eleva a $T=60$. Cuando el segundo procesador opera a su máxima capacidad tenemos $P^T = [10\\; 100\\; 10]$ y la temperatura se eleva a $T=75$. Cuando el tercer procesador opera a máxima potencia mientras que los otros dos están en reposo tenemos que $P^T = [10\\; 10\\; 100]$ y la temperatura se elevea a $T=65$. Supongamos que los tres procesadores operan a máxima potencia ¿Qué temperatura se alcanza? La temperatura de fusión de los procesadores (a la que los procesadores se derriten) es cerca de $150$ ¿Cuál es la potencia máxima que pueden alcanzar los procesadores para que $T\\le 150$? \n",
578
+ "*Hint:* $T(P) = a^T P + b$"
579
+ ]
580
+ }
581
+ ],
582
+ "metadata": {
583
+ "kernelspec": {
584
+ "display_name": "Python 3",
585
+ "language": "python",
586
+ "name": "python3"
587
+ },
588
+ "language_info": {
589
+ "codemirror_mode": {
590
+ "name": "ipython",
591
+ "version": 3
592
+ },
593
+ "file_extension": ".py",
594
+ "mimetype": "text/x-python",
595
+ "name": "python",
596
+ "nbconvert_exporter": "python",
597
+ "pygments_lexer": "ipython3",
598
+ "version": "3.7.3"
599
+ }
600
+ },
601
+ "nbformat": 4,
602
+ "nbformat_minor": 4
603
+ }
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Aproximaciones de Taylor Modelos Lineales de Funciones No Lineales.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c89d587ca1e1d5f59d6d90a7b7083228815f7c81a2caed3b3c33d446c7030bd5
3
+ size 79794439
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Aproximaciones de Taylor Modelos Lineales de Funciones No Lineales.vtt ADDED
@@ -0,0 +1,433 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:03.679 --> 00:00:06.000
4
+ Hola de nuevo. El camino ha sido largo
5
+
6
+ 00:00:06.000 --> 00:00:08.720
7
+ y nos está dando frutos. Lo que vamos
8
+
9
+ 00:00:08.720 --> 00:00:11.059
10
+ a ver hoy son las aproximaciones de Taylor.
11
+
12
+ 00:00:11.679 --> 00:00:13.519
13
+ La mayoría de las funciones que están en
14
+
15
+ 00:00:13.519 --> 00:00:16.995
16
+ la realidad, pensando en que las la realidad
17
+
18
+ 00:00:16.995 --> 00:00:20.915
19
+ la aproximamos también con funciones, son funciones altamente
20
+
21
+ 00:00:20.915 --> 00:00:23.635
22
+ no lineales, y a veces poder trabajar y
23
+
24
+ 00:00:23.635 --> 00:00:26.695
25
+ lidiar con ellas es muy complicado. A veces
26
+
27
+ 00:00:26.695 --> 00:00:27.505
28
+ nos conviene aproximar funciones lineales o funciones afines,
29
+
30
+ 00:00:28.610 --> 00:00:32.310
31
+ aproximar funciones lineales o funciones afines en vecindades
32
+
33
+ 00:00:34.610 --> 00:00:38.290
34
+ en distancias muy pequeñas de un punto que
35
+
36
+ 00:00:38.290 --> 00:00:41.690
37
+ nos interese. Las funciones lineales las podemos hacer
38
+
39
+ 00:00:41.690 --> 00:00:44.394
40
+ y trabajar muy bien, mientras que algunas, las
41
+
42
+ 00:00:44.394 --> 00:00:47.034
43
+ no lineales más difíciles, va a ser mucho
44
+
45
+ 00:00:47.034 --> 00:00:49.774
46
+ más complicado entenderlas y poder trabajar con ellas.
47
+
48
+ 00:00:50.394 --> 00:00:52.394
49
+ Por eso, en esta clase vamos a ver
50
+
51
+ 00:00:52.394 --> 00:00:55.695
52
+ las aproximaciones de Taylor, que es una aproximación
53
+
54
+ 00:00:55.835 --> 00:00:59.610
55
+ que nos da el cálculo diferencial para poder
56
+
57
+ 00:00:59.610 --> 00:01:02.410
58
+ llegar a aproximar alrededor de un punto una
59
+
60
+ 00:01:02.410 --> 00:01:07.050
61
+ función no lineal. Sin más, vámonos a la
62
+
63
+ 00:01:07.050 --> 00:01:10.650
64
+ computadora. Este notebook en el que vamos a
65
+
66
+ 00:01:10.650 --> 00:01:13.130
67
+ estar trabajando es un nuevo notebook, no te
68
+
69
+ 00:01:13.130 --> 00:01:16.655
70
+ preocupes, va a estar en el enlace en
71
+
72
+ 00:01:16.955 --> 00:01:20.395
73
+ los recursos. Ahora bien, como les comentaba, la
74
+
75
+ 00:01:20.395 --> 00:01:22.795
76
+ mayoría de los fenómenos de la realidad, entendiendo
77
+
78
+ 00:01:22.795 --> 00:01:26.255
79
+ que también aproximamos a la realidad con funciones,
80
+
81
+ 00:01:26.590 --> 00:01:29.870
82
+ son funciones altamente no lineales, son súper no
83
+
84
+ 00:01:29.870 --> 00:01:32.030
85
+ lineales, y a veces nos va a ser
86
+
87
+ 00:01:32.030 --> 00:01:34.450
88
+ más sencillo para trabajar con ellas o entenderlas
89
+
90
+ 00:01:35.230 --> 00:01:38.270
91
+ aproximarnos alrededor de un punto con una función
92
+
93
+ 00:01:38.270 --> 00:01:41.495
94
+ afín o lineal. En este caso, nos referiremos
95
+
96
+ 00:01:41.495 --> 00:01:44.375
97
+ a la aproximación como modelo, es decir, nuestra
98
+
99
+ 00:01:44.375 --> 00:01:46.215
100
+ aproximación es a lo que le vamos a
101
+
102
+ 00:01:46.215 --> 00:01:49.595
103
+ llamar un modelo, para recordar que la aproximación
104
+
105
+ 00:01:49.975 --> 00:01:52.855
106
+ es solamente eso, es una aproximación, no vamos
107
+
108
+ 00:01:52.855 --> 00:01:55.020
109
+ a estar hablando de nuestra función non lineal
110
+
111
+ 00:01:55.020 --> 00:01:59.740
112
+ original. Ahora, quien nos otorga las herramientas para
113
+
114
+ 00:01:59.740 --> 00:02:02.940
115
+ trabajar de forma organizada para poder encontrar ese
116
+
117
+ 00:02:02.940 --> 00:02:08.125
118
+ modelo es el cálculo diferencial. Entonces, vamos a
119
+
120
+ 00:02:08.125 --> 00:02:10.365
121
+ suponer que tenemos una función que va de
122
+
123
+ 00:02:10.365 --> 00:02:14.685
124
+ RNARY, además, que esta función es diferenciable, es
125
+
126
+ 00:02:14.685 --> 00:02:19.245
127
+ decir, que sus derivadas existen. También, sea z
128
+
129
+ 00:02:19.245 --> 00:02:22.730
130
+ un n vector. Vamos a definir a la
131
+
132
+ 00:02:22.730 --> 00:02:25.770
133
+ aproximación de Taylor de primer orden cerca del
134
+
135
+ 00:02:25.770 --> 00:02:29.370
136
+ punto o alrededor del punto z como esta
137
+
138
+ 00:02:29.370 --> 00:02:33.790
139
+ función, f gorrito en x igual a f
140
+
141
+ 00:02:34.010 --> 00:02:38.195
142
+ evaluado en z, nuestra función original, más la
143
+
144
+ 00:02:38.195 --> 00:02:41.635
145
+ derivada respecto a la componente, a respecto a
146
+
147
+ 00:02:41.635 --> 00:02:44.755
148
+ la primer componente de f evaluado en nuestro
149
+
150
+ 00:02:44.755 --> 00:02:52.535
151
+ vector ZYS multiplicado por x menos x cero,
152
+
153
+ 00:02:53.450 --> 00:02:56.650
154
+ es decir, de nuestro vector x de aquí
155
+
156
+ 00:02:56.650 --> 00:03:00.650
157
+ agarramos la primer componente y de nuestro vector
158
+
159
+ 00:03:00.650 --> 00:03:04.090
160
+ z agarramos la primer componente y obtenemos x
161
+
162
+ 00:03:04.090 --> 00:03:08.465
163
+ cero menos z cero. Este elemento de acá
164
+
165
+ 00:03:08.465 --> 00:03:14.545
166
+ es f evaluado, la derivada de f respecto
167
+
168
+ 00:03:14.545 --> 00:03:17.265
169
+ a la segunda componente evaluado en el vector
170
+
171
+ 00:03:17.265 --> 00:03:23.390
172
+ z, multiplicado por x menos un x uno
173
+
174
+ 00:03:23.390 --> 00:03:26.450
175
+ menos z menos uno. Agarramos la primer componente
176
+
177
+ 00:03:26.510 --> 00:03:29.170
178
+ de nuestro vector x y agarramos la segunda
179
+
180
+ 00:03:29.310 --> 00:03:33.095
181
+ componente de nuestro vector z. Y así hasta
182
+
183
+ 00:03:33.095 --> 00:03:35.995
184
+ la n menos un derivada de la función
185
+
186
+ 00:03:36.055 --> 00:03:39.415
187
+ f, evaluado en z, multiplicado por x n
188
+
189
+ 00:03:39.415 --> 00:03:44.135
190
+ menos uno, menos x menos z n menos
191
+
192
+ 00:03:44.135 --> 00:03:48.799
193
+ uno. Ahora, hay que recordar que esta notación
194
+
195
+ 00:03:48.799 --> 00:03:52.099
196
+ de aquí, lo que denota, es la derivada
197
+
198
+ 00:03:52.400 --> 00:03:59.040
199
+ parcial de f respecto a la coordenada I0A
200
+
201
+ 00:03:59.040 --> 00:04:03.625
202
+ la componente iésima evaluado en el vector z.
203
+
204
+ 00:04:06.165 --> 00:04:09.765
205
+ Algunas veces es útil referirse a f de
206
+
207
+ 00:04:09.765 --> 00:04:14.165
208
+ z a nuestra aproximación como f de x
209
+
210
+ 00:04:14.165 --> 00:04:17.500
211
+ punto y coma z o también f subíndice
212
+
213
+ 00:04:17.720 --> 00:04:20.860
214
+ z de x, para mostrar que estamos expandiendo
215
+
216
+ 00:04:21.479 --> 00:04:26.860
217
+ esta función no lineal alrededor de este punto
218
+
219
+ 00:04:28.680 --> 00:04:35.535
220
+ z. Ahora, notemos que esta función, nuestra aproximación,
221
+
222
+ 00:04:36.475 --> 00:04:41.354
223
+ la podemos escribir como esta función afín. F
224
+
225
+ 00:04:41.354 --> 00:04:44.720
226
+ de z de aquí es un escalar, y
227
+
228
+ 00:04:44.860 --> 00:04:47.740
229
+ este de aquí lo vamos a denotar como
230
+
231
+ 00:04:47.740 --> 00:04:49.979
232
+ un vector, y ese se llamará el vector
233
+
234
+ 00:04:49.979 --> 00:04:53.099
235
+ gradiente. Y está compuesto en cada una de
236
+
237
+ 00:04:53.099 --> 00:04:55.680
238
+ sus componentes, tiene cada una de las derivadas
239
+
240
+ 00:04:56.380 --> 00:04:59.745
241
+ parciales de la función evaluado en z, y
242
+
243
+ 00:04:59.745 --> 00:05:05.505
244
+ eso estará multiplicando al vector x menos z.
245
+
246
+ 00:05:05.505 --> 00:05:07.665
247
+ Y esto de aquí, como vimos, es una
248
+
249
+ 00:05:07.665 --> 00:05:12.705
250
+ función afín. Ahora, notemos otra vez que el
251
+
252
+ 00:05:12.705 --> 00:05:19.000
253
+ primer término de aquí es una constante, Y
254
+
255
+ 00:05:19.000 --> 00:05:22.599
256
+ este, bueno, básicamente, esto es f, nuestra función
257
+
258
+ 00:05:22.599 --> 00:05:25.960
259
+ original, evaluada en nuestro vector z. Entonces, esto
260
+
261
+ 00:05:25.960 --> 00:05:27.960
262
+ nos da un número, porque nuestra función va
263
+
264
+ 00:05:27.960 --> 00:05:33.145
265
+ de RNAR. Luego tenemos aquí el vector gradiente,
266
+
267
+ 00:05:34.004 --> 00:05:36.645
268
+ y a este término de aquí le vamos
269
+
270
+ 00:05:36.645 --> 00:05:41.465
271
+ a llamar la perturbación en x o la
272
+
273
+ 00:05:41.565 --> 00:05:49.680
274
+ perturbación de x dado z. Ahora, esto se
275
+
276
+ 00:05:49.700 --> 00:05:52.800
277
+ llama la aproximación a primer orden de Taylor,
278
+
279
+ 00:05:53.100 --> 00:05:55.919
280
+ y esto nos da una forma de poder
281
+
282
+ 00:05:56.139 --> 00:05:59.634
283
+ construir una función afín que aproximará nuestra función
284
+
285
+ 00:05:59.634 --> 00:06:03.475
286
+ no lineal alrededor del punto z, siempre y
287
+
288
+ 00:06:03.475 --> 00:06:06.615
289
+ cuando exista una función explícita de la función
290
+
291
+ 00:06:06.675 --> 00:06:10.110
292
+ f y, además, sea diferenciable esa función. Es
293
+
294
+ 00:06:10.110 --> 00:06:12.430
295
+ decir, que para que esto funcione, nuestra función
296
+
297
+ 00:06:12.430 --> 00:06:15.170
298
+ tiene que ser diferenciable y además tenemos conocer
299
+
300
+ 00:06:15.790 --> 00:06:18.590
301
+ cómo está f de manera explícita, necesitamos a
302
+
303
+ 00:06:18.590 --> 00:06:23.390
304
+ nuestra función no lineal. Vamos a un breve
305
+
306
+ 00:06:23.390 --> 00:06:26.905
307
+ ejemplo. Como primer ejemplo, vamos a tomar o
308
+
309
+ 00:06:26.905 --> 00:06:29.065
310
+ vamos a considerar la función que va de
311
+
312
+ 00:06:29.065 --> 00:06:32.025
313
+ r dos a r, denotada por f de
314
+
315
+ 00:06:32.025 --> 00:06:36.265
316
+ x igual a x cero más la exponencial
317
+
318
+ 00:06:36.265 --> 00:06:39.280
319
+ de x uno menos x cero, donde x
320
+
321
+ 00:06:39.660 --> 00:06:41.900
322
+ cero y x uno son las componentes del
323
+
324
+ 00:06:41.900 --> 00:06:46.780
325
+ vector x. Esta función es una función no
326
+
327
+ 00:06:46.780 --> 00:06:49.740
328
+ lineal, por ende, no es ni lineal ni
329
+
330
+ 00:06:49.740 --> 00:06:54.634
331
+ es afín. Vamos a encontrar una aproximación de
332
+
333
+ 00:06:54.634 --> 00:06:58.228
334
+ Taylor, una función afín alrededor del punto uno
335
+
336
+ 00:06:58.228 --> 00:07:03.385
337
+ dos, alrededor de nuestro vector uno dos. Para
338
+
339
+ 00:07:03.385 --> 00:07:07.349
340
+ este caso, el vector gradiente será este de
341
+
342
+ 00:07:07.370 --> 00:07:10.010
343
+ aquí, donde si tomamos la primer derivada o
344
+
345
+ 00:07:10.010 --> 00:07:12.910
346
+ la derivada respecto a la a la componente
347
+
348
+ 00:07:12.970 --> 00:07:15.690
349
+ x cero, nos da aquí un uno, que
350
+
351
+ 00:07:15.690 --> 00:07:18.630
352
+ es el que tenemos aquí, y cuando derivamos
353
+
354
+ 00:07:18.650 --> 00:07:21.130
355
+ la exponencial, tenemos que utilizar la regla de
356
+
357
+ 00:07:21.130 --> 00:07:24.955
358
+ la cadena, y esto nos saca un menos
359
+
360
+ 00:07:25.015 --> 00:07:27.335
361
+ respecto a este x cero, entonces nos queda
362
+
363
+ 00:07:27.335 --> 00:07:30.055
364
+ menos la exponencial de z uno menos z
365
+
366
+ 00:07:30.055 --> 00:07:33.735
367
+ cero. La segunda componente viene dictada por la
368
+
369
+ 00:07:33.735 --> 00:07:37.980
370
+ derivada de x uno. En este caso, la
371
+
372
+ 00:07:37.980 --> 00:07:41.820
373
+ derivada de x uno de x respecto a
374
+
375
+ 00:07:41.820 --> 00:07:43.840
376
+ x uno de x cero es un cero,
377
+
378
+ 00:07:44.139 --> 00:07:46.699
379
+ por eso no hay ningún término sumando. Y
380
+
381
+ 00:07:46.699 --> 00:07:49.755
382
+ en el caso del exponencial, tenemos que como
383
+
384
+ 00:07:49.755 --> 00:07:51.835
385
+ esta deriva de respecto a x uno y
386
+
387
+ 00:07:51.835 --> 00:07:55.115
388
+ x uno es simplemente x uno, nos saca
389
+
390
+ 00:07:55.115 --> 00:07:56.955
391
+ un uno, no nos altera para nada y
392
+
393
+ 00:07:56.955 --> 00:07:59.835
394
+ nos queda la exponencial de z uno menos
395
+
396
+ 00:07:59.835 --> 00:08:01.755
397
+ z cero, porque la estamos evaluando en los
398
+
399
+ 00:08:01.755 --> 00:08:06.629
400
+ vectores z. Así bien, lo que tenemos es
401
+
402
+ 00:08:06.629 --> 00:08:10.250
403
+ que tenemos que pasar a evaluar nuestro vector
404
+
405
+ 00:08:10.310 --> 00:08:13.990
406
+ gradiente en nuestro vector z. Eso lo haremos
407
+
408
+ 00:08:13.990 --> 00:08:16.150
409
+ en Python y lo haremos para la siguiente
410
+
411
+ 00:08:16.150 --> 00:08:19.305
412
+ clase. Si te sentiste perdido en esta clase,
413
+
414
+ 00:08:19.305 --> 00:08:21.865
415
+ te recomiendo que tomes el curso de cálculo
416
+
417
+ 00:08:21.865 --> 00:08:23.945
418
+ que tenemos en Platze. Es un curso que
419
+
420
+ 00:08:23.945 --> 00:08:26.345
421
+ te dará las bases suficientes para poder llevar
422
+
423
+ 00:08:26.345 --> 00:08:30.297
424
+ esta clase sin ningún problema. Nos vemos la
425
+
426
+ 00:08:30.297 --> 00:08:32.857
427
+ próxima clase, en donde voy a estar realizando
428
+
429
+ 00:08:32.857 --> 00:08:35.177
430
+ la evaluación de nuestra aproximación de Taylor y
431
+
432
+ 00:08:35.177 --> 00:08:37.277
433
+ veremos un ejemplo geométrico más.
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Lecturas recomendadas.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ https://platzi.com/cursos/calculo-data-science/
2
+ https://colab.research.google.com/drive/1qqJ0suSucs3B7ePEHsBrJ6EKz8YUv7X5?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/05-aproximacion_taylor_6d013e46-3c9a-49a9-ad07-99eb13e84e1f.ipynb ADDED
@@ -0,0 +1,481 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 6. Aproximación de Taylor"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "La mayoría de los fenómenos de la realidad solo pueden ser aproximados a través de funciones no-lineales y algunas veces es más sencillo aproximarnos con funciones afines o lineales. "
15
+ ]
16
+ },
17
+ {
18
+ "cell_type": "markdown",
19
+ "metadata": {},
20
+ "source": [
21
+ "En este caso nos referiremos a la aproximación como *modelo* para recordar que la aproximación es solamente eso, una aproximación."
22
+ ]
23
+ },
24
+ {
25
+ "cell_type": "markdown",
26
+ "metadata": {},
27
+ "source": [
28
+ "Ahora, el cálculo diferencial nos otorga una forma organizada de encontrar ese modelo. Supongamos entonces que $f:\\mathbf{R}^{n} \\to \\mathbf{R}$ es una función diferenciable, sea también $\\mathbf{z}$ un $n$-vector. La aproximación de Taylor de primer orden de $f$ cerca del punto $\\mathbf{z}$ es la función\n",
29
+ "\n",
30
+ "$$\n",
31
+ "\\hat{f}(\\mathbf{x}) = f(\\mathbf{z}) + \\displaystyle\\frac{\\partial}{\\partial x_{0}} f(\\mathbf{z})(x_{0}-z_{0}) + \\displaystyle\\frac{\\partial}{\\partial x_{1}} f(\\mathbf{z})(x_{1}-z_{1}) + \\cdots + \\displaystyle\\frac{\\partial}{\\partial x_{n-1}} f(\\mathbf{z})(x_{n-1}-z_{n-1})\n",
32
+ "$$\n",
33
+ "\n",
34
+ "Donde $\\displaystyle\\frac{\\partial}{\\partial x_{i}}f(\\mathbf{z})$ denota la derivada parcial de $f$ evaluada en el vector $\\mathbf{z}$ respecto al i-ésimo argumento. "
35
+ ]
36
+ },
37
+ {
38
+ "cell_type": "markdown",
39
+ "metadata": {},
40
+ "source": [
41
+ "Algunas veces $\\hat{f}(\\mathbf{z})$ también se escribe como $\\hat{f}(\\mathbf{x};\\mathbf{z})$ o también $\\hat{f}_{\\mathbf{z}}(\\mathbf{x})$ para mostrar en qué punto se evalúa o respecto al que se está desarrollando. "
42
+ ]
43
+ },
44
+ {
45
+ "cell_type": "markdown",
46
+ "metadata": {},
47
+ "source": [
48
+ "Notemos que \n",
49
+ "\n",
50
+ "$$\n",
51
+ "\\hat{f}(\\mathbf{x}) = f(\\mathbf{z}) + \\nabla f(\\mathbf{z})^{T} (\\mathbf{x}-\\mathbf{z})\n",
52
+ "$$\n",
53
+ "\n",
54
+ "Donde $\\nabla f(\\mathbf{z})$ representa el vector gradiente\n",
55
+ "\n",
56
+ "$$\n",
57
+ "\\nabla f(\\mathbf{z}) = \\begin{bmatrix}\\displaystyle\\frac{\\partial f}{\\partial x_{0}}(\\mathbf{z}) \\\\ \\displaystyle\\frac{\\partial f}{\\partial x_{1}}(\\mathbf{z})\\\\ \\vdots \\\\ \\displaystyle\\frac{\\partial f}{\\partial x_{n-1}}(\\mathbf{z}) \\end{bmatrix}\n",
58
+ "$$\n",
59
+ "\n",
60
+ "Notemos que le primer término de la aproximación es la constante $f(\\mathbf{z})$ (esto es la función $f(\\mathbf{x})$ evaluada en $\\mathbf{z}$). El segundo término es el prodcuto itnerno del vector gradiente de $f$ en $\\mathbf{z}$ y la *desviación* o *perturbación* de $\\mathbf{x}$ por parte de $\\mathbf{z}$, el $n$-vector $(\\mathbf{x}-\\mathbf{z})$."
61
+ ]
62
+ },
63
+ {
64
+ "cell_type": "markdown",
65
+ "metadata": {},
66
+ "source": [
67
+ "La aproximación de primer orden de Taylor nos da una forma de consturir una función afín que aproximará la función $f: \\mathbf{R}^{n} \\to \\mathbf{R}$ alrededor del punto $\\mathbf{z}$, siempre y cuando exista una forma explícita de la función $f$ y sea diferenciable. "
68
+ ]
69
+ },
70
+ {
71
+ "cell_type": "markdown",
72
+ "metadata": {},
73
+ "source": [
74
+ "## 6.1 Breves ejemplos"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "markdown",
79
+ "metadata": {},
80
+ "source": [
81
+ "**Ejemplo 1.** Considera la función $f:\\mathbf{R}^{2}\\to \\mathbf{R}$ dada por $f(\\mathbf{x}) = x_{0}+\\exp{(x_{1}-x_{0})}$ la cual no es lineal ni afín. Para encontrar una aproximación de Taylor $\\hat{f}$ cerca del punto $\\mathbf{z}^{T} = [1 \\; 2]$. Tenemos que el vector gradiente en este caso será:\n",
82
+ "\n",
83
+ "$$\n",
84
+ "\\nabla f(\\mathbf{z}) = \\begin{bmatrix}\\displaystyle\\frac{\\partial f}{\\partial x_{0}}(\\mathbf{z}) \\\\ \\displaystyle\\frac{\\partial f}{\\partial x_{1}}(\\mathbf{z})\\end{bmatrix} = \\begin{bmatrix} 1 - \\exp{(z_{1}-z_{0})} \\\\ \\exp{(z_{1}-z_{0})} \\end{bmatrix}\n",
85
+ "$$\n",
86
+ "\n",
87
+ "Ahora vamos a evaluar $\\nabla f(\\mathbf{z})$ en el vector $\\mathbf{z}^{T} = [1 \\; 2]$"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "code",
92
+ "execution_count": 3,
93
+ "metadata": {},
94
+ "outputs": [],
95
+ "source": [
96
+ "import numpy as np"
97
+ ]
98
+ },
99
+ {
100
+ "cell_type": "code",
101
+ "execution_count": 4,
102
+ "metadata": {},
103
+ "outputs": [],
104
+ "source": [
105
+ "def gradF(z):\n",
106
+ " return np.array([1-np.exp(z[1]-z[0]),np.exp(z[1]-z[0])])"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "code",
111
+ "execution_count": 5,
112
+ "metadata": {},
113
+ "outputs": [
114
+ {
115
+ "name": "stdout",
116
+ "output_type": "stream",
117
+ "text": [
118
+ "grad(f)[1,2] = [-1.71828183 2.71828183]\n"
119
+ ]
120
+ }
121
+ ],
122
+ "source": [
123
+ "z = np.array([1,2])\n",
124
+ "print('grad(f)[1,2] = ', gradF(z))"
125
+ ]
126
+ },
127
+ {
128
+ "cell_type": "markdown",
129
+ "metadata": {},
130
+ "source": [
131
+ "Ahora vamos a programar la función $f$."
132
+ ]
133
+ },
134
+ {
135
+ "cell_type": "code",
136
+ "execution_count": 6,
137
+ "metadata": {},
138
+ "outputs": [],
139
+ "source": [
140
+ "def F(x):\n",
141
+ " return x[0] + np.exp(x[1]-x[0])"
142
+ ]
143
+ },
144
+ {
145
+ "cell_type": "code",
146
+ "execution_count": 7,
147
+ "metadata": {},
148
+ "outputs": [
149
+ {
150
+ "name": "stdout",
151
+ "output_type": "stream",
152
+ "text": [
153
+ "f([1,2]) = 3.718281828459045\n"
154
+ ]
155
+ }
156
+ ],
157
+ "source": [
158
+ "print('f([1,2]) =',F(z))"
159
+ ]
160
+ },
161
+ {
162
+ "cell_type": "markdown",
163
+ "metadata": {},
164
+ "source": [
165
+ "Así pues, nuestro aproximación de Taylor a primer orden será:"
166
+ ]
167
+ },
168
+ {
169
+ "cell_type": "code",
170
+ "execution_count": 8,
171
+ "metadata": {},
172
+ "outputs": [],
173
+ "source": [
174
+ "def taylor_F(x,z):\n",
175
+ " fz = F(z)\n",
176
+ " gz = gradF(z)\n",
177
+ " return fz + gz@(x-z)"
178
+ ]
179
+ },
180
+ {
181
+ "cell_type": "markdown",
182
+ "metadata": {},
183
+ "source": [
184
+ "Para corroborar que nuestra aproximación es correcta si la evaluamos en $x=z$ deberíamos de obtener que $\\hat{f}(\\mathbf{z})=f(\\mathbf{z})$"
185
+ ]
186
+ },
187
+ {
188
+ "cell_type": "code",
189
+ "execution_count": 9,
190
+ "metadata": {},
191
+ "outputs": [
192
+ {
193
+ "name": "stdout",
194
+ "output_type": "stream",
195
+ "text": [
196
+ "taylor_F([1,2],[1,2]) = 3.718281828459045\n"
197
+ ]
198
+ }
199
+ ],
200
+ "source": [
201
+ "print('taylor_F([1,2],[1,2]) = ',taylor_F(z,z))"
202
+ ]
203
+ },
204
+ {
205
+ "cell_type": "markdown",
206
+ "metadata": {},
207
+ "source": [
208
+ "Esto significa que lo hicimos bien, nuestra aproximación viene dada por\n",
209
+ "\n",
210
+ "$$\n",
211
+ "\\hat{f}(\\mathbf{x}) = 3.7183 + [-1.72\\; 2.72]\\begin{bmatrix}x_{0}-1\\\\ x_{1}-2\\end{bmatrix}\n",
212
+ "$$"
213
+ ]
214
+ },
215
+ {
216
+ "cell_type": "markdown",
217
+ "metadata": {},
218
+ "source": [
219
+ "**Ejercicio 2.** Para tener un mejor idea de lo que significa hacer una aproximación lineal vamos a realizar la aproximación de una función unidimensional\n",
220
+ "\n",
221
+ "$$\n",
222
+ "f(x) = x^{2} - x^{3}\n",
223
+ "$$\n",
224
+ "\n",
225
+ "Con lo que obtenemos\n",
226
+ "\n",
227
+ "$$\n",
228
+ "\\nabla f(z) = 2z - 3z^{2}\n",
229
+ "$$\n",
230
+ "\n",
231
+ "Ahora, si lo aproximamos en $z=0.4$. "
232
+ ]
233
+ },
234
+ {
235
+ "cell_type": "code",
236
+ "execution_count": 10,
237
+ "metadata": {},
238
+ "outputs": [],
239
+ "source": [
240
+ "def df(z):\n",
241
+ " return 2*z - 3*z**2"
242
+ ]
243
+ },
244
+ {
245
+ "cell_type": "code",
246
+ "execution_count": 11,
247
+ "metadata": {},
248
+ "outputs": [],
249
+ "source": [
250
+ "def tf(x,z):\n",
251
+ " return f(z) + df(z)*(x-z)"
252
+ ]
253
+ },
254
+ {
255
+ "cell_type": "code",
256
+ "execution_count": 12,
257
+ "metadata": {},
258
+ "outputs": [],
259
+ "source": [
260
+ "def f(x):\n",
261
+ " return x**2 - x**3"
262
+ ]
263
+ },
264
+ {
265
+ "cell_type": "code",
266
+ "execution_count": 13,
267
+ "metadata": {},
268
+ "outputs": [
269
+ {
270
+ "name": "stdout",
271
+ "output_type": "stream",
272
+ "text": [
273
+ "f(0.4) = 0.09600000000000002\n"
274
+ ]
275
+ }
276
+ ],
277
+ "source": [
278
+ "print('f(0.4) =',f(0.4))"
279
+ ]
280
+ },
281
+ {
282
+ "cell_type": "code",
283
+ "execution_count": 14,
284
+ "metadata": {},
285
+ "outputs": [
286
+ {
287
+ "name": "stdout",
288
+ "output_type": "stream",
289
+ "text": [
290
+ "Df(0.4) = 0.31999999999999995\n"
291
+ ]
292
+ }
293
+ ],
294
+ "source": [
295
+ "print('Df(0.4) =',df(0.4))"
296
+ ]
297
+ },
298
+ {
299
+ "cell_type": "markdown",
300
+ "metadata": {},
301
+ "source": [
302
+ "Usando los resultados anteriores tenemos que la aproximación de Taylor es\n",
303
+ "\n",
304
+ "$$\n",
305
+ "\\hat{f}(x) = 0.09600000000000002 + 0.31999999999999995 * (x - 0.4)\n",
306
+ "$$\n"
307
+ ]
308
+ },
309
+ {
310
+ "cell_type": "code",
311
+ "execution_count": 15,
312
+ "metadata": {},
313
+ "outputs": [],
314
+ "source": [
315
+ "import matplotlib.pyplot as plt #Biblioteca con funciones para visualizar"
316
+ ]
317
+ },
318
+ {
319
+ "cell_type": "code",
320
+ "execution_count": 16,
321
+ "metadata": {},
322
+ "outputs": [
323
+ {
324
+ "data": {
325
+ "image/png": "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W2jWrBlAM2vtlpz215ppuWyxsbEXjL3xxhuA87hwERERkRx98+b5IB0YBkOXFHqQ9oaWechlmzdvHlOnTqVr166EhISwdu1a5syZQ6dOnbj55pvdbk9ERESKui//DV+84rwOKg9Dl0LV5u72lEsK03LZmjdvjq+vL+PGjePMmTPpb0p85ZVX3G5NREREijJr4Yt/wlepN0EoUwmGLoPKTdztKw8UpuWyXXvttXz22WdutyEiIiLFibXw2Rj4xlkaSkgVGLYcKl3palt5pTAtIiIiIoXLWlj1LHz7jlOHVneCdIX67vblBYVpERERESk8KSnwyWjnFngAYbVg+HIIr+NqW95SmBYRERGRwpGSAh89ApumO3V4XWdGulxNd/u6DArTIiIiIlLwUpJh6V/h5zlOXaGBE6RDq7nb12VSmBYRERGRgpWcBB/eD5sXOXWlRs5dO8pWdrevfKAwLSIiIiIFJykBFt0Dvy1z6srNnPtIl6nobl/5RGFaRERERApGUjzMHwa/f+LUVa+GIUsguLy7feUjPU5cpJAsXryYV199leTkZLdbERERKXiJsTB34PkgXf16Z2lHCQrSoDAtxUS7du1o166d221c1PDhw6lTp85Ft69bt45BgwbRpEkTPB5P4TUmIiLihoQYmH0X7Ex9qFvNv8CQDyGonLt9FQAt8xApYCdOnKB///689dZbdO3a1e12REREClZ8tBOk96116jptYMBcCAhxt68CojAtxcLq1avdbuGS3n//fVJSUrLd9uOPP/LKK68wdOjQQu5KRESkkMVFway+sH+DU9drD/1ng3+wu30VIIVpyVfWWuLi4ggKCsrX8/r7++fr+fKbn5/fRbd17NixEDsRERFxSewpmHEnHNzk1Fd0gn4zwC/Q3b4KmNZMlyL79u1j1KhRNGzYkKCgICpUqEDfvn3Zu3dvpv2mTp2KMYavvvqKkSNHUqFCBUJDQxk6dCinTp3KtG+dOnXo3r07q1at4vrrrycoKIhJkyYBsHv3bvr27Uv58uUJDg7mL3/5Cx9//HH6sb/99htBQUEXzNiuXbsWj8fDU089lT6Wdc30mjVrMMYwf/58XnrpJapXr07ZsmXp06cPUVFRxMfH8+ijjxIREUFISAgjRowgPj4+03WmTJnCrbfeSkREBAEBATRp0oSJEydm+7X75JNPaNu2LWXLliU0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\n",
326
+ "text/plain": [
327
+ "<Figure size 840x840 with 1 Axes>"
328
+ ]
329
+ },
330
+ "metadata": {
331
+ "needs_background": "light"
332
+ },
333
+ "output_type": "display_data"
334
+ }
335
+ ],
336
+ "source": [
337
+ "%matplotlib inline\n",
338
+ "fig, ax = plt.subplots(1,1,figsize=(7,7),dpi=120)\n",
339
+ "\n",
340
+ "x = np.linspace(0,1,1000)\n",
341
+ "taf = lambda x:tf(x,0.4)\n",
342
+ "\n",
343
+ "ax.plot(x,f(x),label='original')\n",
344
+ "ax.plot(x,taf(x),label='aproximación')\n",
345
+ "ax.scatter(0.4,f(0.4),color='red')\n",
346
+ "ax.legend()\n",
347
+ "plt.show()"
348
+ ]
349
+ },
350
+ {
351
+ "cell_type": "markdown",
352
+ "metadata": {},
353
+ "source": [
354
+ "Ahora vamos a calcular algunas diferencias y errores de la aproximación"
355
+ ]
356
+ },
357
+ {
358
+ "cell_type": "code",
359
+ "execution_count": 17,
360
+ "metadata": {},
361
+ "outputs": [
362
+ {
363
+ "name": "stdout",
364
+ "output_type": "stream",
365
+ "text": [
366
+ "x = 0.3, f(x) = 0.063, Taylor f(x) = 0.064, |f(x) - Taylor f(x)| = 0.0010000000000000009\n"
367
+ ]
368
+ }
369
+ ],
370
+ "source": [
371
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.3,f(0.3),taf(0.3),np.abs(f(0.3)-taf(0.3))))"
372
+ ]
373
+ },
374
+ {
375
+ "cell_type": "code",
376
+ "execution_count": 18,
377
+ "metadata": {},
378
+ "outputs": [
379
+ {
380
+ "name": "stdout",
381
+ "output_type": "stream",
382
+ "text": [
383
+ "x = 0.35, f(x) = 0.079625, Taylor f(x) = 0.08, |f(x) - Taylor f(x)| = 0.00037500000000000033\n"
384
+ ]
385
+ }
386
+ ],
387
+ "source": [
388
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.35,f(0.35),taf(0.35),np.abs(f(0.35)-taf(0.35))))"
389
+ ]
390
+ },
391
+ {
392
+ "cell_type": "code",
393
+ "execution_count": 19,
394
+ "metadata": {},
395
+ "outputs": [
396
+ {
397
+ "name": "stdout",
398
+ "output_type": "stream",
399
+ "text": [
400
+ "x = 0.4, f(x) = 0.09600000000000002, Taylor f(x) = 0.09600000000000002, |f(x) - Taylor f(x)| = 0.0\n"
401
+ ]
402
+ }
403
+ ],
404
+ "source": [
405
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.4,f(0.4),taf(0.4),np.abs(f(0.4)-taf(0.4))))"
406
+ ]
407
+ },
408
+ {
409
+ "cell_type": "code",
410
+ "execution_count": 20,
411
+ "metadata": {},
412
+ "outputs": [
413
+ {
414
+ "name": "stdout",
415
+ "output_type": "stream",
416
+ "text": [
417
+ "x = 0.45, f(x) = 0.111375, Taylor f(x) = 0.11200000000000002, |f(x) - Taylor f(x)| = 0.0006250000000000144\n"
418
+ ]
419
+ }
420
+ ],
421
+ "source": [
422
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.45,f(0.45),taf(0.45),np.abs(f(0.45)-taf(0.45))))"
423
+ ]
424
+ },
425
+ {
426
+ "cell_type": "code",
427
+ "execution_count": 21,
428
+ "metadata": {},
429
+ "outputs": [
430
+ {
431
+ "name": "stdout",
432
+ "output_type": "stream",
433
+ "text": [
434
+ "x = 0.5, f(x) = 0.125, Taylor f(x) = 0.128, |f(x) - Taylor f(x)| = 0.0030000000000000027\n"
435
+ ]
436
+ }
437
+ ],
438
+ "source": [
439
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.5,f(0.5),taf(0.5),np.abs(f(0.5)-taf(0.5))))"
440
+ ]
441
+ },
442
+ {
443
+ "cell_type": "code",
444
+ "execution_count": 22,
445
+ "metadata": {},
446
+ "outputs": [
447
+ {
448
+ "name": "stdout",
449
+ "output_type": "stream",
450
+ "text": [
451
+ "x = 0.8, f(x) = 0.128, Taylor f(x) = 0.22399999999999998, |f(x) - Taylor f(x)| = 0.09599999999999997\n"
452
+ ]
453
+ }
454
+ ],
455
+ "source": [
456
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.8,f(0.8),taf(0.8),np.abs(f(0.8)-taf(0.8))))"
457
+ ]
458
+ }
459
+ ],
460
+ "metadata": {
461
+ "kernelspec": {
462
+ "display_name": "Python 3",
463
+ "language": "python",
464
+ "name": "python3"
465
+ },
466
+ "language_info": {
467
+ "codemirror_mode": {
468
+ "name": "ipython",
469
+ "version": 3
470
+ },
471
+ "file_extension": ".py",
472
+ "mimetype": "text/x-python",
473
+ "name": "python",
474
+ "nbconvert_exporter": "python",
475
+ "pygments_lexer": "ipython3",
476
+ "version": "3.7.3"
477
+ }
478
+ },
479
+ "nbformat": 4,
480
+ "nbformat_minor": 4
481
+ }
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Aproximaciones de Taylor y análisis de error en Python.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:245f6360e6589c6678b9233fb5b862fd296aef57e6c42e41c3301ace972ae90f
3
+ size 133388271
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Aproximaciones de Taylor y análisis de error en Python.vtt ADDED
@@ -0,0 +1,706 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:03.040 --> 00:00:06.899
4
+ La clase pasada introducimos las aproximaciones de Taylor.
5
+
6
+ 00:00:07.040 --> 00:00:10.019
7
+ Vimos cómo una función no lineal la podemos
8
+
9
+ 00:00:10.160 --> 00:00:14.000
10
+ aproximar alrededor de un punto a una función
11
+
12
+ 00:00:14.000 --> 00:00:18.005
13
+ afín. Ahora vamos a terminar un ejercicio que
14
+
15
+ 00:00:18.005 --> 00:00:20.404
16
+ empezamos la clase pasada y vamos a dar
17
+
18
+ 00:00:20.404 --> 00:00:23.845
19
+ un ejemplo más geométrico. Sin más, vamos a
20
+
21
+ 00:00:23.845 --> 00:00:28.985
22
+ la computadora. La clase pasada introdujimos este breve
23
+
24
+ 00:00:29.205 --> 00:00:32.270
25
+ ejemplo, en donde vimos que había una función
26
+
27
+ 00:00:32.270 --> 00:00:34.430
28
+ que iba de r dos a r, que
29
+
30
+ 00:00:34.430 --> 00:00:36.830
31
+ era y que estaba dada por esa expresión
32
+
33
+ 00:00:36.830 --> 00:00:39.150
34
+ de aquí, la cual no era lineal ni
35
+
36
+ 00:00:39.150 --> 00:00:43.490
37
+ afín. Para poder encontrar la aproximación de Taylor
38
+
39
+ 00:00:43.630 --> 00:00:46.815
40
+ alrededor del punto uno coma dos, del vector
41
+
42
+ 00:00:46.815 --> 00:00:50.675
43
+ uno coma dos, calculamos el vector gradiente y
44
+
45
+ 00:00:50.894 --> 00:00:54.015
46
+ obtuvimos este vector gradiente. Ahora, lo que nos
47
+
48
+ 00:00:54.015 --> 00:00:56.815
49
+ resta es evaluar ese vector gradiente en Python
50
+
51
+ 00:00:56.815 --> 00:01:01.560
52
+ y obtener los resultados. Primero, para eso vamos
53
+
54
+ 00:01:01.560 --> 00:01:04.060
55
+ a a importar NumPy, que es la biblioteca
56
+
57
+ 00:01:04.120 --> 00:01:07.080
58
+ que vamos a estar utilizando. Después vamos a
59
+
60
+ 00:01:07.080 --> 00:01:10.680
61
+ declarar la función del gradiente de f. Esta
62
+
63
+ 00:01:10.680 --> 00:01:13.740
64
+ función nos va a regresar el vector gradiente.
65
+
66
+ 00:01:14.465 --> 00:01:17.765
67
+ En este caso, tenemos que gradiente de f
68
+
69
+ 00:01:17.825 --> 00:01:20.965
70
+ recibe un vector z y nos regresa este
71
+
72
+ 00:01:21.265 --> 00:01:23.825
73
+ vector, en donde la primer componente es el
74
+
75
+ 00:01:23.825 --> 00:01:28.300
76
+ uno menos la exponencial. Numpa ya tiene precargada
77
+
78
+ 00:01:28.440 --> 00:01:30.940
79
+ la función exponencial y la llamamos de esta
80
+
81
+ 00:01:30.940 --> 00:01:36.460
82
+ manera, y dentro del exponencial restamos z uno
83
+
84
+ 00:01:36.520 --> 00:01:39.580
85
+ menos z cero, z uno menos z cero,
86
+
87
+ 00:01:39.945 --> 00:01:43.145
88
+ Y la siguiente componente es z uno menos
89
+
90
+ 00:01:43.145 --> 00:01:46.185
91
+ z cero, acá lo tenemos también, z uno
92
+
93
+ 00:01:46.185 --> 00:01:50.365
94
+ menos z cero. Ahora, lo que nos resta
95
+
96
+ 00:01:50.745 --> 00:01:53.380
97
+ es definir a z como el vector uno
98
+
99
+ 00:01:53.380 --> 00:01:55.780
100
+ coma dos, aquí ya lo estamos definiendo como
101
+
102
+ 00:01:55.780 --> 00:01:58.740
103
+ el vector uno coma dos, y vamos a
104
+
105
+ 00:01:58.740 --> 00:02:01.460
106
+ evaluar nuestra función gradiente de f en nuestro
107
+
108
+ 00:02:01.460 --> 00:02:05.300
109
+ vector uno coma dos. Evaluando la función en
110
+
111
+ 00:02:05.300 --> 00:02:08.235
112
+ uno coma dos, obtenemos que la primer componente
113
+
114
+ 00:02:08.235 --> 00:02:10.634
115
+ del vector gradiente es uno punto setenta y
116
+
117
+ 00:02:10.634 --> 00:02:13.515
118
+ uno ochenta y dos, y la segunda es
119
+
120
+ 00:02:13.515 --> 00:02:17.595
121
+ dos punto setenta y uno. Ahora, vamos a
122
+
123
+ 00:02:17.595 --> 00:02:21.740
124
+ programar la función de f. Nuestra función f,
125
+
126
+ 00:02:21.740 --> 00:02:25.120
127
+ como la vemos aquí, es x cero más
128
+
129
+ 00:02:25.140 --> 00:02:27.760
130
+ la exponencial de x uno menos x cero,
131
+
132
+ 00:02:27.980 --> 00:02:30.220
133
+ lo que nos va a regresar nuestra función
134
+
135
+ 00:02:30.220 --> 00:02:33.100
136
+ f de x recibiendo un vector x es
137
+
138
+ 00:02:33.100 --> 00:02:37.305
139
+ x cero más la exponencial, recordemos que la
140
+
141
+ 00:02:37.305 --> 00:02:39.385
142
+ exponencial en un país se llama como n
143
+
144
+ 00:02:39.385 --> 00:02:42.584
145
+ p dot exp, paréntesis lo que vaya del
146
+
147
+ 00:02:42.584 --> 00:02:45.864
148
+ argumento de la exponencial, x uno menos x
149
+
150
+ 00:02:45.864 --> 00:02:51.099
151
+ cero. Así, entonces, tenemos que calcular este elemento,
152
+
153
+ 00:02:51.719 --> 00:02:55.739
154
+ retomando la aproximación de Taylor, tenemos que calcular
155
+
156
+ 00:02:55.959 --> 00:02:58.280
157
+ el primer elemento que es una constante de
158
+
159
+ 00:02:58.280 --> 00:03:05.254
160
+ nuestra aproximación de Taylor. Evaluamos esta función y
161
+
162
+ 00:03:05.254 --> 00:03:09.275
163
+ corremos esta celda. Así tenemos que f evaluada
164
+
165
+ 00:03:09.415 --> 00:03:11.814
166
+ en uno coma dos es el tres punto
167
+
168
+ 00:03:11.814 --> 00:03:16.489
169
+ setenta y uno. Ya tenemos este término y
170
+
171
+ 00:03:16.489 --> 00:03:19.670
172
+ ya tenemos este vector de aquí. Va a
173
+
174
+ 00:03:19.670 --> 00:03:28.170
175
+ restar conseguir vectores aquí. Para construir nuestra aproximación
176
+
177
+ 00:03:28.170 --> 00:03:31.285
178
+ de Taylor, bastará con que nosotros definamos la
179
+
180
+ 00:03:31.285 --> 00:03:34.965
181
+ aproximación de Taylor. Dentro de esta calculemos el
182
+
183
+ 00:03:34.965 --> 00:03:37.665
184
+ término f z, que es el primer término
185
+
186
+ 00:03:37.685 --> 00:03:40.225
187
+ constante al escalar dentro de la aproximación de
188
+
189
+ 00:03:40.245 --> 00:03:42.885
190
+ Taylor, y luego dentro de esta misma calculemos
191
+
192
+ 00:03:42.885 --> 00:03:46.810
193
+ el gradiente de f respecto al vector z,
194
+
195
+ 00:03:47.269 --> 00:03:49.109
196
+ y al final lo que nos va a
197
+
198
+ 00:03:49.109 --> 00:03:51.810
199
+ regresar va a ser f z más g
200
+
201
+ 00:03:51.909 --> 00:03:58.675
202
+ z, que es nuestro gradiente, por z menos
203
+
204
+ 00:03:59.055 --> 00:04:02.255
205
+ por x menos z, que es justamente la
206
+
207
+ 00:04:02.255 --> 00:04:05.795
208
+ función afín que representa la aproximación de Taylor.
209
+
210
+ 00:04:06.815 --> 00:04:10.815
211
+ Ahora la evaluaremos. Para corroborar que nuestra aproximación
212
+
213
+ 00:04:10.815 --> 00:04:14.580
214
+ es correcta, si nosotros evaluamos la aproximación de
215
+
216
+ 00:04:14.580 --> 00:04:18.100
217
+ Taylor en x igual a z, deberíamos de
218
+
219
+ 00:04:18.100 --> 00:04:22.840
220
+ obtener únicamente f z. Nosotros sabemos que FZ0
221
+
222
+ 00:04:22.926 --> 00:04:25.620
223
+ bien f uno coma dos, f valor en
224
+
225
+ 00:04:25.620 --> 00:04:27.300
226
+ uno coma dos es tres punto setenta y
227
+
228
+ 00:04:27.300 --> 00:04:31.354
229
+ uno. Si nosotros evaluamos nuestra aproximación de taylor
230
+
231
+ 00:04:31.354 --> 00:04:37.115
232
+ en z, deberíamos de recobrar eso, evaluémosla. Y
233
+
234
+ 00:04:37.115 --> 00:04:39.115
235
+ nos damos cuenta que, en efecto, lo que
236
+
237
+ 00:04:39.115 --> 00:04:41.675
238
+ recobramos es el tres punto setenta y uno
239
+
240
+ 00:04:41.675 --> 00:04:44.490
241
+ ochenta y dos, es decir, nuestra aproximación es
242
+
243
+ 00:04:44.490 --> 00:04:49.069
244
+ correcta. Con lo cual, nuestra función, nuestra aproximación
245
+
246
+ 00:04:49.089 --> 00:04:52.409
247
+ de Taylor, nuestra función afín, vendrá dada por
248
+
249
+ 00:04:52.409 --> 00:04:54.975
250
+ tres punto setenta y uno ochenta y tres,
251
+
252
+ 00:04:56.015 --> 00:04:59.075
253
+ más el vector uno punto setenta y dos
254
+
255
+ 00:04:59.535 --> 00:05:01.535
256
+ dos punto setenta y dos, que es el
257
+
258
+ 00:05:01.535 --> 00:05:09.520
259
+ que obtuvimos, devaluar nuestro gradiente por x cero
260
+
261
+ 00:05:09.580 --> 00:05:13.900
262
+ menos uno, x uno menos dos, y está
263
+
264
+ 00:05:13.900 --> 00:05:15.419
265
+ a la espera de que lo volemos en
266
+
267
+ 00:05:15.419 --> 00:05:19.099
268
+ algún vector x. Ahora, eso está muy bien,
269
+
270
+ 00:05:19.099 --> 00:05:22.665
271
+ pero para entender realmente qué es una aproximación
272
+
273
+ 00:05:22.665 --> 00:05:28.185
274
+ de Taylor, lo que tenemos que hacer es
275
+
276
+ 00:05:28.185 --> 00:05:33.705
277
+ hacer un ejemplo unidimensional. Consideramos la función f
278
+
279
+ 00:05:33.705 --> 00:05:38.130
280
+ de x, x cuadrada menos x cúbica, y
281
+
282
+ 00:05:38.130 --> 00:05:40.130
283
+ es una función que va de r en
284
+
285
+ 00:05:40.130 --> 00:05:43.570
286
+ r, es decir, este es un uno vector
287
+
288
+ 00:05:43.570 --> 00:05:45.650
289
+ y, como habíamos dicho, el uno vector era
290
+
291
+ 00:05:45.650 --> 00:05:49.705
292
+ un escalar, con lo cual vamos a obtener
293
+
294
+ 00:05:49.705 --> 00:05:52.265
295
+ que su derivada parcial, o en este caso
296
+
297
+ 00:05:52.265 --> 00:05:54.825
298
+ lo que correspondería a su vector gradiente evaluado
299
+
300
+ 00:05:54.825 --> 00:05:58.025
301
+ en z, es dos z menos tres z
302
+
303
+ 00:05:58.025 --> 00:06:00.680
304
+ cuadrada. Eso es la derivada de este. El
305
+
306
+ 00:06:00.680 --> 00:06:03.240
307
+ primer término derivándolo respecto a x nos da
308
+
309
+ 00:06:03.240 --> 00:06:06.120
310
+ dos x, y evaluándolo en z nos da
311
+
312
+ 00:06:06.120 --> 00:06:10.039
313
+ dos z. El segundo término es tres x
314
+
315
+ 00:06:10.039 --> 00:06:13.495
316
+ cuadrada, y aquí nos da tres z cuadrada
317
+
318
+ 00:06:13.495 --> 00:06:16.215
319
+ después de valorarlo en z. Ahora, lo que
320
+
321
+ 00:06:16.215 --> 00:06:19.755
322
+ nosotros queremos hacer es calcular la aproximación alrededor
323
+
324
+ 00:06:19.815 --> 00:06:22.775
325
+ de z igual a cero punto cuatro. Para
326
+
327
+ 00:06:22.775 --> 00:06:26.760
328
+ eso, primero vaya vamos a escribir la función
329
+
330
+ 00:06:26.760 --> 00:06:29.639
331
+ del gradiente de z, que es esta de
332
+
333
+ 00:06:29.639 --> 00:06:34.780
334
+ aquí, dos por z menos tres por z
335
+
336
+ 00:06:34.919 --> 00:06:39.340
337
+ al cuadrado. En Python, la potencia se denota
338
+
339
+ 00:06:39.479 --> 00:06:45.071
340
+ por dos por juntos. Luego, sabemos que nuestra
341
+
342
+ 00:06:45.071 --> 00:06:49.555
343
+ aproximación de Taylor viene dada por f evaluado
344
+
345
+ 00:06:49.695 --> 00:06:53.955
346
+ en z más la derivada evaluada en z
347
+
348
+ 00:06:54.335 --> 00:06:59.379
349
+ por x menos z. Corremos esta celda y,
350
+
351
+ 00:06:59.379 --> 00:07:02.419
352
+ por último, vamos a aclarar nuestra función f.
353
+
354
+ 00:07:02.419 --> 00:07:06.360
355
+ F es simplemente x cuadrada menos x cúbica.
356
+
357
+ 00:07:07.460 --> 00:07:12.485
358
+ Aquí está. Así, pues, vamos a evaluar f
359
+
360
+ 00:07:12.485 --> 00:07:15.145
361
+ en cero punto cuatro, con lo cual obtenemos
362
+
363
+ 00:07:15.205 --> 00:07:19.365
364
+ cero punto cero nueve seis. Vamos a evaluar
365
+
366
+ 00:07:19.365 --> 00:07:24.085
367
+ la derivada, es decir, ese vector gradiente. Con
368
+
369
+ 00:07:24.085 --> 00:07:27.260
370
+ eso obtenemos que evaluado el vector gradiente en
371
+
372
+ 00:07:27.260 --> 00:07:29.180
373
+ cero punto cuatro es cero punto treinta y
374
+
375
+ 00:07:29.180 --> 00:07:32.960
376
+ uno nueve. Con esto, tenemos que la aproximación
377
+
378
+ 00:07:33.180 --> 00:07:35.660
379
+ de Taylor va a hacer toda esta función
380
+
381
+ 00:07:35.660 --> 00:07:38.140
382
+ de aquí en espera que lo evaluemos en
383
+
384
+ 00:07:38.140 --> 00:07:42.195
385
+ algún punto x. Pero, ya llegados aquí, es
386
+
387
+ 00:07:42.195 --> 00:07:44.675
388
+ necesario entender qué es lo que está haciendo
389
+
390
+ 00:07:44.675 --> 00:07:47.634
391
+ la aproximación de Taylor. Para eso vamos a
392
+
393
+ 00:07:47.634 --> 00:07:51.955
394
+ hacer de nuestras primeras visualizaciones en Python. Esta
395
+
396
+ 00:07:51.955 --> 00:07:57.470
397
+ librería de aquí es una biblioteca que contiene
398
+
399
+ 00:08:01.210 --> 00:08:13.675
400
+ funciones biblioteca con funciones para visualizar. Corremos esta
401
+
402
+ 00:08:13.675 --> 00:08:19.135
403
+ celda para importar nuestra biblioteca. Vamos a utilizar
404
+
405
+ 00:08:19.275 --> 00:08:22.335
406
+ este comando de aquí y vamos a declarar
407
+
408
+ 00:08:22.715 --> 00:08:26.800
409
+ esta serie de instrucciones. Aquí vamos a declarar
410
+
411
+ 00:08:27.660 --> 00:08:31.280
412
+ un arreglo, ya habíamos hablado de los linkspace,
413
+
414
+ 00:08:31.900 --> 00:08:34.059
415
+ entre el cero y el uno en mil
416
+
417
+ 00:08:34.059 --> 00:08:38.620
418
+ cachos, y este estos puntos los vamos a
419
+
420
+ 00:08:38.620 --> 00:08:42.884
421
+ evaluar en la función de aproximación de Taylor.
422
+
423
+ 00:08:44.704 --> 00:08:49.504
424
+ Veamos cómo nos queda. Lo que nosotros obtenemos
425
+
426
+ 00:08:49.504 --> 00:08:53.524
427
+ para este momento es que nuestra función original,
428
+
429
+ 00:08:54.320 --> 00:08:57.360
430
+ la función original viene dada por x cuadrada
431
+
432
+ 00:08:57.360 --> 00:09:00.720
433
+ menos x cúbica, es esta de aquí, la
434
+
435
+ 00:09:00.720 --> 00:09:06.820
436
+ azul, y nuestra aproximación es esta línea anaranjada.
437
+
438
+ 00:09:08.135 --> 00:09:11.495
439
+ Ahora, si nos damos cuenta, muy cerca de
440
+
441
+ 00:09:11.495 --> 00:09:13.655
442
+ este punto rojo, este punto rojo es el
443
+
444
+ 00:09:13.655 --> 00:09:16.615
445
+ uno coma dos, las funciones se parecen mucho.
446
+
447
+ 00:09:16.615 --> 00:09:19.735
448
+ De hecho, hasta una vecindad muy pequeña se
449
+
450
+ 00:09:19.735 --> 00:09:23.370
451
+ parecen bastante las funciones, van bastante pegaditas, pero
452
+
453
+ 00:09:23.370 --> 00:09:26.690
454
+ conforme nos vamos alejando del punto del que
455
+
456
+ 00:09:26.690 --> 00:09:31.110
457
+ queríamos aproximar, la función original y la aproximación
458
+
459
+ 00:09:31.570 --> 00:09:34.130
460
+ se dejan de parecer cada vez más, y
461
+
462
+ 00:09:34.130 --> 00:09:36.221
463
+ lo mismo pasa hacia el otro lado. Primero
464
+
465
+ 00:09:36.221 --> 00:09:39.575
466
+ se parecen muchísimo y conforme nos vamos alejando
467
+
468
+ 00:09:40.275 --> 00:09:43.395
469
+ se dejan de parecer. En este sentido, sí
470
+
471
+ 00:09:43.395 --> 00:09:47.095
472
+ trabajan las aproximaciones. Muy cerca del punto que
473
+
474
+ 00:09:47.235 --> 00:09:49.795
475
+ queremos aproximar, la función original y la función
476
+
477
+ 00:09:49.795 --> 00:09:52.680
478
+ aproximada, la la aproximación de Taylor van a
479
+
480
+ 00:09:52.680 --> 00:09:56.040
481
+ ser muy similares, pero conforme nos alejemos de
482
+
483
+ 00:09:56.040 --> 00:09:59.480
484
+ ese punto, vamos a encontrar un error. Para
485
+
486
+ 00:09:59.480 --> 00:10:02.280
487
+ eso vamos a introducir lo siguiente, y es
488
+
489
+ 00:10:02.280 --> 00:10:04.815
490
+ una forma de poder medir el error. El
491
+
492
+ 00:10:04.815 --> 00:10:06.975
493
+ error lo vamos a medir como el valor
494
+
495
+ 00:10:06.975 --> 00:10:11.695
496
+ absoluto de el de la función evaluada en
497
+
498
+ 00:10:11.695 --> 00:10:14.975
499
+ ese punto x menos lo que la función
500
+
501
+ 00:10:14.975 --> 00:10:18.015
502
+ de Taylor nos arroja evaluada en ese mismo
503
+
504
+ 00:10:18.015 --> 00:10:22.710
505
+ punto x. Por ejemplo, si nosotros tenemos x
506
+
507
+ 00:10:22.710 --> 00:10:25.910
508
+ igual a cero punto tres, f de x
509
+
510
+ 00:10:25.910 --> 00:10:28.150
511
+ en esta x cero punto tres es cero
512
+
513
+ 00:10:28.150 --> 00:10:31.029
514
+ punto cero sesenta y tres, mientras que la
515
+
516
+ 00:10:31.029 --> 00:10:33.110
517
+ función de Taylor nos dice que es cero
518
+
519
+ 00:10:33.110 --> 00:10:35.295
520
+ punto sesenta y cuatro. Si nos damos cuenta,
521
+
522
+ 00:10:35.755 --> 00:10:38.315
523
+ no está tan lejos, entonces el error que
524
+
525
+ 00:10:38.315 --> 00:10:41.435
526
+ tenemos es un error muy pequeño, pero sí
527
+
528
+ 00:10:41.435 --> 00:10:44.795
529
+ existe el error. Ahora, como siguiente ejemplo, si
530
+
531
+ 00:10:44.795 --> 00:10:47.135
532
+ lo evaluamos en cero punto treinta y cinco,
533
+
534
+ 00:10:48.210 --> 00:10:50.850
535
+ el valor de fdx es cero punto cero
536
+
537
+ 00:10:50.850 --> 00:10:53.490
538
+ siete y más decimales, mientras que el de
539
+
540
+ 00:10:53.490 --> 00:10:56.130
541
+ Taylor es cero punto cero ocho. Si nos
542
+
543
+ 00:10:56.130 --> 00:10:58.530
544
+ damos cuenta, este valor y este valor son
545
+
546
+ 00:10:58.530 --> 00:11:02.545
547
+ muy similares, pero existe un error, a pesar
548
+
549
+ 00:11:02.545 --> 00:11:05.904
550
+ de ser muy, muy pequeñito. Y ahora veamos
551
+
552
+ 00:11:05.904 --> 00:11:09.745
553
+ un nuevo ejemplo. Si lo evaluamos en cero
554
+
555
+ 00:11:09.745 --> 00:11:11.904
556
+ punto cuatro, que es el punto del cual
557
+
558
+ 00:11:11.904 --> 00:11:15.150
559
+ alrededor del cual nos queremos aproximar, del cual
560
+
561
+ 00:11:15.150 --> 00:11:18.190
562
+ alrededor del cual estamos aproximando, fdx es cero
563
+
564
+ 00:11:18.190 --> 00:11:20.430
565
+ punto noventa y seis, y la aproximación de
566
+
567
+ 00:11:20.430 --> 00:11:22.270
568
+ Taylor también nos da cero punto noventa y
569
+
570
+ 00:11:22.270 --> 00:11:25.230
571
+ seis, y esto nos da un error de
572
+
573
+ 00:11:25.230 --> 00:11:28.430
574
+ cero. Ahora, si nos damos cuenta, este cero
575
+
576
+ 00:11:28.430 --> 00:11:31.925
577
+ punto tres está por acá, y entonces el
578
+
579
+ 00:11:31.925 --> 00:11:34.105
580
+ cero punto treinta y cinco está por aquí.
581
+
582
+ 00:11:34.644 --> 00:11:38.325
583
+ Conforme nos vamos acercando al punto del que
584
+
585
+ 00:11:38.325 --> 00:11:42.165
586
+ iniciamos la aproximación, del que del que iniciamos
587
+
588
+ 00:11:42.165 --> 00:11:45.240
589
+ la aproximación alrededor, notemos que el error va
590
+
591
+ 00:11:45.240 --> 00:11:48.120
592
+ reduciendo. Este es el error en cero punto
593
+
594
+ 00:11:48.120 --> 00:11:51.080
595
+ tres, ese es el error en cero punto
596
+
597
+ 00:11:51.080 --> 00:11:53.880
598
+ treinta y cinco, y este es el error
599
+
600
+ 00:11:53.880 --> 00:11:57.420
601
+ en cero punto cuatro. Entonces, conforme nos acerquemos
602
+
603
+ 00:11:58.225 --> 00:12:00.785
604
+ hacia el punto que queremos aproximar, nuestro error
605
+
606
+ 00:12:00.785 --> 00:12:02.565
607
+ se va a ser más y más pequeño.
608
+
609
+ 00:12:03.505 --> 00:12:06.225
610
+ Y conforme nos alejemos también por este lado,
611
+
612
+ 00:12:06.225 --> 00:12:09.205
613
+ notaremos que el error va creciendo. Por ejemplo,
614
+
615
+ 00:12:09.265 --> 00:12:12.405
616
+ evaluemos ahora en cero punto cuarenta y cinco.
617
+
618
+ 00:12:12.500 --> 00:12:14.760
619
+ Si evaluamos en cero punto cuarenta y cinco,
620
+
621
+ 00:12:14.980 --> 00:12:17.720
622
+ obtenemos cero punto once, y eso nos da,
623
+
624
+ 00:12:18.260 --> 00:12:20.019
625
+ en la función original y en Taylor nos
626
+
627
+ 00:12:20.019 --> 00:12:22.839
628
+ da cero punto once con algunos decimales distintos.
629
+
630
+ 00:12:23.380 --> 00:12:26.339
631
+ Cuando sacamos el error, obtenemos este error de
632
+
633
+ 00:12:26.339 --> 00:12:31.135
634
+ aquí. Si seguimos creciendo, en cero punto cinco
635
+
636
+ 00:12:31.135 --> 00:12:33.375
637
+ obtenemos que f es igual a cero punto
638
+
639
+ 00:12:33.375 --> 00:12:36.515
640
+ veinticinco y Taylor nos dice cero punto veintiocho.
641
+
642
+ 00:12:37.375 --> 00:12:39.535
643
+ Esto nos da al final un error de
644
+
645
+ 00:12:39.535 --> 00:12:41.875
646
+ cero punto cero tres, y vamos a alejarnos
647
+
648
+ 00:12:41.935 --> 00:12:44.170
649
+ un punto más. Si nos alejamos un punto
650
+
651
+ 00:12:44.630 --> 00:12:47.990
652
+ más, por ejemplo, cero punto ocho, tenemos que
653
+
654
+ 00:12:47.990 --> 00:12:51.130
655
+ Taylor nos dice, tenemos que la función original
656
+
657
+ 00:12:51.589 --> 00:12:53.829
658
+ evaluada en ese punto es cero punto ciento
659
+
660
+ 00:12:53.829 --> 00:12:56.390
661
+ veintiocho, mientras que Taylor nos dice que es
662
+
663
+ 00:12:56.390 --> 00:12:59.095
664
+ cero punto veintidós y otros decimales, lo cual
665
+
666
+ 00:12:59.095 --> 00:13:04.215
667
+ es un error bastante grande. Ahora, lo que
668
+
669
+ 00:13:04.215 --> 00:13:06.055
670
+ se va a quedar como ejercicio para ti
671
+
672
+ 00:13:06.055 --> 00:13:08.375
673
+ es que yo calculé el error de de
674
+
675
+ 00:13:08.375 --> 00:13:12.660
676
+ la aproximación de Taylor alrededor del punto para
677
+
678
+ 00:13:12.660 --> 00:13:17.980
679
+ este ejemplo unidimensional. Puedes extrapolar esto que hemos
680
+
681
+ 00:13:17.980 --> 00:13:22.240
682
+ visto hasta ahora para aproximar los errores alrededor
683
+
684
+ 00:13:22.300 --> 00:13:25.995
685
+ de algunos puntos en esta aproximación. Si te
686
+
687
+ 00:13:25.995 --> 00:13:28.714
688
+ perdiste dentro de esta clase, te aconsejo que
689
+
690
+ 00:13:28.714 --> 00:13:31.435
691
+ revisas los cursos de cálculo básico y los
692
+
693
+ 00:13:31.435 --> 00:13:35.295
694
+ cursos de programación básica en Python. Ahí obtendrás
695
+
696
+ 00:13:35.355 --> 00:13:38.394
697
+ los fundamentos para seguir y para poder llenar
698
+
699
+ 00:13:38.394 --> 00:13:41.701
700
+ esos gaps que pudieras tener. Cualquier duda, déjala
701
+
702
+ 00:13:41.701 --> 00:13:44.461
703
+ en los comentarios y la comunidad Platzi o
704
+
705
+ 00:13:44.461 --> 00:13:47.360
706
+ yo la responderemos. Nos vemos la próxima clase.
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Lecturas recomendadas.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ https://matplotlib.org/3.3.1/api/_as_gen/matplotlib.pyplot.html
2
+ https://platzi.com/cursos/calculo-data-science/
3
+ https://platzi.com/cursos/python
4
+ https://colab.research.google.com/drive/1qqJ0suSucs3B7ePEHsBrJ6EKz8YUv7X5?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/06-aproximacion_taylor_ce137460-6fd8-44ff-8cd4-d5d1cde0972c.ipynb ADDED
@@ -0,0 +1,481 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 6. Aproximación de Taylor"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "La mayoría de los fenómenos de la realidad solo pueden ser aproximados a través de funciones no-lineales y algunas veces es más sencillo aproximarnos con funciones afines o lineales. "
15
+ ]
16
+ },
17
+ {
18
+ "cell_type": "markdown",
19
+ "metadata": {},
20
+ "source": [
21
+ "En este caso nos referiremos a la aproximación como *modelo* para recordar que la aproximación es solamente eso, una aproximación."
22
+ ]
23
+ },
24
+ {
25
+ "cell_type": "markdown",
26
+ "metadata": {},
27
+ "source": [
28
+ "Ahora, el cálculo diferencial nos otorga una forma organizada de encontrar ese modelo. Supongamos entonces que $f:\\mathbf{R}^{n} \\to \\mathbf{R}$ es una función diferenciable, sea también $\\mathbf{z}$ un $n$-vector. La aproximación de Taylor de primer orden de $f$ cerca del punto $\\mathbf{z}$ es la función\n",
29
+ "\n",
30
+ "$$\n",
31
+ "\\hat{f}(\\mathbf{x}) = f(\\mathbf{z}) + \\displaystyle\\frac{\\partial}{\\partial x_{0}} f(\\mathbf{z})(x_{0}-z_{0}) + \\displaystyle\\frac{\\partial}{\\partial x_{1}} f(\\mathbf{z})(x_{1}-z_{1}) + \\cdots + \\displaystyle\\frac{\\partial}{\\partial x_{n-1}} f(\\mathbf{z})(x_{n-1}-z_{n-1})\n",
32
+ "$$\n",
33
+ "\n",
34
+ "Donde $\\displaystyle\\frac{\\partial}{\\partial x_{i}}f(\\mathbf{z})$ denota la derivada parcial de $f$ evaluada en el vector $\\mathbf{z}$ respecto al i-ésimo argumento. "
35
+ ]
36
+ },
37
+ {
38
+ "cell_type": "markdown",
39
+ "metadata": {},
40
+ "source": [
41
+ "Algunas veces $\\hat{f}(\\mathbf{z})$ también se escribe como $\\hat{f}(\\mathbf{x};\\mathbf{z})$ o también $\\hat{f}_{\\mathbf{z}}(\\mathbf{x})$ para mostrar en qué punto se evalúa o respecto al que se está desarrollando. "
42
+ ]
43
+ },
44
+ {
45
+ "cell_type": "markdown",
46
+ "metadata": {},
47
+ "source": [
48
+ "Notemos que \n",
49
+ "\n",
50
+ "$$\n",
51
+ "\\hat{f}(\\mathbf{x}) = f(\\mathbf{z}) + \\nabla f(\\mathbf{z})^{T} (\\mathbf{x}-\\mathbf{z})\n",
52
+ "$$\n",
53
+ "\n",
54
+ "Donde $\\nabla f(\\mathbf{z})$ representa el vector gradiente\n",
55
+ "\n",
56
+ "$$\n",
57
+ "\\nabla f(\\mathbf{z}) = \\begin{bmatrix}\\displaystyle\\frac{\\partial f}{\\partial x_{0}}(\\mathbf{z}) \\\\ \\displaystyle\\frac{\\partial f}{\\partial x_{1}}(\\mathbf{z})\\\\ \\vdots \\\\ \\displaystyle\\frac{\\partial f}{\\partial x_{n-1}}(\\mathbf{z}) \\end{bmatrix}\n",
58
+ "$$\n",
59
+ "\n",
60
+ "Notemos que le primer término de la aproximación es la constante $f(\\mathbf{z})$ (esto es la función $f(\\mathbf{x})$ evaluada en $\\mathbf{z}$). El segundo término es el prodcuto itnerno del vector gradiente de $f$ en $\\mathbf{z}$ y la *desviación* o *perturbación* de $\\mathbf{x}$ por parte de $\\mathbf{z}$, el $n$-vector $(\\mathbf{x}-\\mathbf{z})$."
61
+ ]
62
+ },
63
+ {
64
+ "cell_type": "markdown",
65
+ "metadata": {},
66
+ "source": [
67
+ "La aproximación de primer orden de Taylor nos da una forma de consturir una función afín que aproximará la función $f: \\mathbf{R}^{n} \\to \\mathbf{R}$ alrededor del punto $\\mathbf{z}$, siempre y cuando exista una forma explícita de la función $f$ y sea diferenciable. "
68
+ ]
69
+ },
70
+ {
71
+ "cell_type": "markdown",
72
+ "metadata": {},
73
+ "source": [
74
+ "## 6.1 Breves ejemplos"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "markdown",
79
+ "metadata": {},
80
+ "source": [
81
+ "**Ejemplo 1.** Considera la función $f:\\mathbf{R}^{2}\\to \\mathbf{R}$ dada por $f(\\mathbf{x}) = x_{0}+\\exp{(x_{1}-x_{0})}$ la cual no es lineal ni afín. Para encontrar una aproximación de Taylor $\\hat{f}$ cerca del punto $\\mathbf{z}^{T} = [1 \\; 2]$. Tenemos que el vector gradiente en este caso será:\n",
82
+ "\n",
83
+ "$$\n",
84
+ "\\nabla f(\\mathbf{z}) = \\begin{bmatrix}\\displaystyle\\frac{\\partial f}{\\partial x_{0}}(\\mathbf{z}) \\\\ \\displaystyle\\frac{\\partial f}{\\partial x_{1}}(\\mathbf{z})\\end{bmatrix} = \\begin{bmatrix} 1 - \\exp{(z_{1}-z_{0})} \\\\ \\exp{(z_{1}-z_{0})} \\end{bmatrix}\n",
85
+ "$$\n",
86
+ "\n",
87
+ "Ahora vamos a evaluar $\\nabla f(\\mathbf{z})$ en el vector $\\mathbf{z}^{T} = [1 \\; 2]$"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "code",
92
+ "execution_count": 3,
93
+ "metadata": {},
94
+ "outputs": [],
95
+ "source": [
96
+ "import numpy as np"
97
+ ]
98
+ },
99
+ {
100
+ "cell_type": "code",
101
+ "execution_count": 4,
102
+ "metadata": {},
103
+ "outputs": [],
104
+ "source": [
105
+ "def gradF(z):\n",
106
+ " return np.array([1-np.exp(z[1]-z[0]),np.exp(z[1]-z[0])])"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "code",
111
+ "execution_count": 5,
112
+ "metadata": {},
113
+ "outputs": [
114
+ {
115
+ "name": "stdout",
116
+ "output_type": "stream",
117
+ "text": [
118
+ "grad(f)[1,2] = [-1.71828183 2.71828183]\n"
119
+ ]
120
+ }
121
+ ],
122
+ "source": [
123
+ "z = np.array([1,2])\n",
124
+ "print('grad(f)[1,2] = ', gradF(z))"
125
+ ]
126
+ },
127
+ {
128
+ "cell_type": "markdown",
129
+ "metadata": {},
130
+ "source": [
131
+ "Ahora vamos a programar la función $f$."
132
+ ]
133
+ },
134
+ {
135
+ "cell_type": "code",
136
+ "execution_count": 6,
137
+ "metadata": {},
138
+ "outputs": [],
139
+ "source": [
140
+ "def F(x):\n",
141
+ " return x[0] + np.exp(x[1]-x[0])"
142
+ ]
143
+ },
144
+ {
145
+ "cell_type": "code",
146
+ "execution_count": 7,
147
+ "metadata": {},
148
+ "outputs": [
149
+ {
150
+ "name": "stdout",
151
+ "output_type": "stream",
152
+ "text": [
153
+ "f([1,2]) = 3.718281828459045\n"
154
+ ]
155
+ }
156
+ ],
157
+ "source": [
158
+ "print('f([1,2]) =',F(z))"
159
+ ]
160
+ },
161
+ {
162
+ "cell_type": "markdown",
163
+ "metadata": {},
164
+ "source": [
165
+ "Así pues, nuestro aproximación de Taylor a primer orden será:"
166
+ ]
167
+ },
168
+ {
169
+ "cell_type": "code",
170
+ "execution_count": 8,
171
+ "metadata": {},
172
+ "outputs": [],
173
+ "source": [
174
+ "def taylor_F(x,z):\n",
175
+ " fz = F(z)\n",
176
+ " gz = gradF(z)\n",
177
+ " return fz + gz@(x-z)"
178
+ ]
179
+ },
180
+ {
181
+ "cell_type": "markdown",
182
+ "metadata": {},
183
+ "source": [
184
+ "Para corroborar que nuestra aproximación es correcta si la evaluamos en $x=z$ deberíamos de obtener que $\\hat{f}(\\mathbf{z})=f(\\mathbf{z})$"
185
+ ]
186
+ },
187
+ {
188
+ "cell_type": "code",
189
+ "execution_count": 9,
190
+ "metadata": {},
191
+ "outputs": [
192
+ {
193
+ "name": "stdout",
194
+ "output_type": "stream",
195
+ "text": [
196
+ "taylor_F([1,2],[1,2]) = 3.718281828459045\n"
197
+ ]
198
+ }
199
+ ],
200
+ "source": [
201
+ "print('taylor_F([1,2],[1,2]) = ',taylor_F(z,z))"
202
+ ]
203
+ },
204
+ {
205
+ "cell_type": "markdown",
206
+ "metadata": {},
207
+ "source": [
208
+ "Esto significa que lo hicimos bien, nuestra aproximación viene dada por\n",
209
+ "\n",
210
+ "$$\n",
211
+ "\\hat{f}(\\mathbf{x}) = 3.7183 + [-1.72\\; 2.72]\\begin{bmatrix}x_{0}-1\\\\ x_{1}-2\\end{bmatrix}\n",
212
+ "$$"
213
+ ]
214
+ },
215
+ {
216
+ "cell_type": "markdown",
217
+ "metadata": {},
218
+ "source": [
219
+ "**Ejercicio 2.** Para tener un mejor idea de lo que significa hacer una aproximación lineal vamos a realizar la aproximación de una función unidimensional\n",
220
+ "\n",
221
+ "$$\n",
222
+ "f(x) = x^{2} - x^{3}\n",
223
+ "$$\n",
224
+ "\n",
225
+ "Con lo que obtenemos\n",
226
+ "\n",
227
+ "$$\n",
228
+ "\\nabla f(z) = 2z - 3z^{2}\n",
229
+ "$$\n",
230
+ "\n",
231
+ "Ahora, si lo aproximamos en $z=0.4$. "
232
+ ]
233
+ },
234
+ {
235
+ "cell_type": "code",
236
+ "execution_count": 10,
237
+ "metadata": {},
238
+ "outputs": [],
239
+ "source": [
240
+ "def df(z):\n",
241
+ " return 2*z - 3*z**2"
242
+ ]
243
+ },
244
+ {
245
+ "cell_type": "code",
246
+ "execution_count": 11,
247
+ "metadata": {},
248
+ "outputs": [],
249
+ "source": [
250
+ "def tf(x,z):\n",
251
+ " return f(z) + df(z)*(x-z)"
252
+ ]
253
+ },
254
+ {
255
+ "cell_type": "code",
256
+ "execution_count": 12,
257
+ "metadata": {},
258
+ "outputs": [],
259
+ "source": [
260
+ "def f(x):\n",
261
+ " return x**2 - x**3"
262
+ ]
263
+ },
264
+ {
265
+ "cell_type": "code",
266
+ "execution_count": 13,
267
+ "metadata": {},
268
+ "outputs": [
269
+ {
270
+ "name": "stdout",
271
+ "output_type": "stream",
272
+ "text": [
273
+ "f(0.4) = 0.09600000000000002\n"
274
+ ]
275
+ }
276
+ ],
277
+ "source": [
278
+ "print('f(0.4) =',f(0.4))"
279
+ ]
280
+ },
281
+ {
282
+ "cell_type": "code",
283
+ "execution_count": 14,
284
+ "metadata": {},
285
+ "outputs": [
286
+ {
287
+ "name": "stdout",
288
+ "output_type": "stream",
289
+ "text": [
290
+ "Df(0.4) = 0.31999999999999995\n"
291
+ ]
292
+ }
293
+ ],
294
+ "source": [
295
+ "print('Df(0.4) =',df(0.4))"
296
+ ]
297
+ },
298
+ {
299
+ "cell_type": "markdown",
300
+ "metadata": {},
301
+ "source": [
302
+ "Usando los resultados anteriores tenemos que la aproximación de Taylor es\n",
303
+ "\n",
304
+ "$$\n",
305
+ "\\hat{f}(x) = 0.09600000000000002 + 0.31999999999999995 * (x - 0.4)\n",
306
+ "$$\n"
307
+ ]
308
+ },
309
+ {
310
+ "cell_type": "code",
311
+ "execution_count": 15,
312
+ "metadata": {},
313
+ "outputs": [],
314
+ "source": [
315
+ "import matplotlib.pyplot as plt #Biblioteca con funciones para visualizar"
316
+ ]
317
+ },
318
+ {
319
+ "cell_type": "code",
320
+ "execution_count": 16,
321
+ "metadata": {},
322
+ "outputs": [
323
+ {
324
+ "data": {
325
+ "image/png": "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W2jWrBlAM2vtlpz215ppuWyxsbEXjL3xxhuA87hwERERkRx98+b5IB0YBkOXFHqQ9oaWechlmzdvHlOnTqVr166EhISwdu1a5syZQ6dOnbj55pvdbk9ERESKui//DV+84rwOKg9Dl0LV5u72lEsK03LZmjdvjq+vL+PGjePMmTPpb0p85ZVX3G5NREREijJr4Yt/wlepN0EoUwmGLoPKTdztKw8UpuWyXXvttXz22WdutyEiIiLFibXw2Rj4xlkaSkgVGLYcKl3palt5pTAtIiIiIoXLWlj1LHz7jlOHVneCdIX67vblBYVpERERESk8KSnwyWjnFngAYbVg+HIIr+NqW95SmBYRERGRwpGSAh89ApumO3V4XWdGulxNd/u6DArTIiIiIlLwUpJh6V/h5zlOXaGBE6RDq7nb12VSmBYRERGRgpWcBB/eD5sXOXWlRs5dO8pWdrevfKAwLSIiIiIFJykBFt0Dvy1z6srNnPtIl6nobl/5RGFaRERERApGUjzMHwa/f+LUVa+GIUsguLy7feUjPU5cpJAsXryYV199leTkZLdbERERKXiJsTB34PkgXf16Z2lHCQrSoDAtxUS7du1o166d221c1PDhw6lTp85Ft69bt45BgwbRpEkTPB5P4TUmIiLihoQYmH0X7Ex9qFvNv8CQDyGonLt9FQAt8xApYCdOnKB///689dZbdO3a1e12REREClZ8tBOk96116jptYMBcCAhxt68CojAtxcLq1avdbuGS3n//fVJSUrLd9uOPP/LKK68wdOjQQu5KRESkkMVFway+sH+DU9drD/1ng3+wu30VIIVpyVfWWuLi4ggKCsrX8/r7++fr+fKbn5/fRbd17NixEDsRERFxSewpmHEnHNzk1Fd0gn4zwC/Q3b4KmNZMlyL79u1j1KhRNGzYkKCgICpUqEDfvn3Zu3dvpv2mTp2KMYavvvqKkSNHUqFCBUJDQxk6dCinTp3KtG+dOnXo3r07q1at4vrrrycoKIhJkyYBsHv3bvr27Uv58uUJDg7mL3/5Cx9//HH6sb/99htBQUEXzNiuXbsWj8fDU089lT6Wdc30mjVrMMYwf/58XnrpJapXr07ZsmXp06cPUVFRxMfH8+ijjxIREUFISAgjRowgPj4+03WmTJnCrbfeSkREBAEBATRp0oSJEydm+7X75JNPaNu2LWXLliU0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\n",
326
+ "text/plain": [
327
+ "<Figure size 840x840 with 1 Axes>"
328
+ ]
329
+ },
330
+ "metadata": {
331
+ "needs_background": "light"
332
+ },
333
+ "output_type": "display_data"
334
+ }
335
+ ],
336
+ "source": [
337
+ "%matplotlib inline\n",
338
+ "fig, ax = plt.subplots(1,1,figsize=(7,7),dpi=120)\n",
339
+ "\n",
340
+ "x = np.linspace(0,1,1000)\n",
341
+ "taf = lambda x:tf(x,0.4)\n",
342
+ "\n",
343
+ "ax.plot(x,f(x),label='original')\n",
344
+ "ax.plot(x,taf(x),label='aproximación')\n",
345
+ "ax.scatter(0.4,f(0.4),color='red')\n",
346
+ "ax.legend()\n",
347
+ "plt.show()"
348
+ ]
349
+ },
350
+ {
351
+ "cell_type": "markdown",
352
+ "metadata": {},
353
+ "source": [
354
+ "Ahora vamos a calcular algunas diferencias y errores de la aproximación"
355
+ ]
356
+ },
357
+ {
358
+ "cell_type": "code",
359
+ "execution_count": 17,
360
+ "metadata": {},
361
+ "outputs": [
362
+ {
363
+ "name": "stdout",
364
+ "output_type": "stream",
365
+ "text": [
366
+ "x = 0.3, f(x) = 0.063, Taylor f(x) = 0.064, |f(x) - Taylor f(x)| = 0.0010000000000000009\n"
367
+ ]
368
+ }
369
+ ],
370
+ "source": [
371
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.3,f(0.3),taf(0.3),np.abs(f(0.3)-taf(0.3))))"
372
+ ]
373
+ },
374
+ {
375
+ "cell_type": "code",
376
+ "execution_count": 18,
377
+ "metadata": {},
378
+ "outputs": [
379
+ {
380
+ "name": "stdout",
381
+ "output_type": "stream",
382
+ "text": [
383
+ "x = 0.35, f(x) = 0.079625, Taylor f(x) = 0.08, |f(x) - Taylor f(x)| = 0.00037500000000000033\n"
384
+ ]
385
+ }
386
+ ],
387
+ "source": [
388
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.35,f(0.35),taf(0.35),np.abs(f(0.35)-taf(0.35))))"
389
+ ]
390
+ },
391
+ {
392
+ "cell_type": "code",
393
+ "execution_count": 19,
394
+ "metadata": {},
395
+ "outputs": [
396
+ {
397
+ "name": "stdout",
398
+ "output_type": "stream",
399
+ "text": [
400
+ "x = 0.4, f(x) = 0.09600000000000002, Taylor f(x) = 0.09600000000000002, |f(x) - Taylor f(x)| = 0.0\n"
401
+ ]
402
+ }
403
+ ],
404
+ "source": [
405
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.4,f(0.4),taf(0.4),np.abs(f(0.4)-taf(0.4))))"
406
+ ]
407
+ },
408
+ {
409
+ "cell_type": "code",
410
+ "execution_count": 20,
411
+ "metadata": {},
412
+ "outputs": [
413
+ {
414
+ "name": "stdout",
415
+ "output_type": "stream",
416
+ "text": [
417
+ "x = 0.45, f(x) = 0.111375, Taylor f(x) = 0.11200000000000002, |f(x) - Taylor f(x)| = 0.0006250000000000144\n"
418
+ ]
419
+ }
420
+ ],
421
+ "source": [
422
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.45,f(0.45),taf(0.45),np.abs(f(0.45)-taf(0.45))))"
423
+ ]
424
+ },
425
+ {
426
+ "cell_type": "code",
427
+ "execution_count": 21,
428
+ "metadata": {},
429
+ "outputs": [
430
+ {
431
+ "name": "stdout",
432
+ "output_type": "stream",
433
+ "text": [
434
+ "x = 0.5, f(x) = 0.125, Taylor f(x) = 0.128, |f(x) - Taylor f(x)| = 0.0030000000000000027\n"
435
+ ]
436
+ }
437
+ ],
438
+ "source": [
439
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.5,f(0.5),taf(0.5),np.abs(f(0.5)-taf(0.5))))"
440
+ ]
441
+ },
442
+ {
443
+ "cell_type": "code",
444
+ "execution_count": 22,
445
+ "metadata": {},
446
+ "outputs": [
447
+ {
448
+ "name": "stdout",
449
+ "output_type": "stream",
450
+ "text": [
451
+ "x = 0.8, f(x) = 0.128, Taylor f(x) = 0.22399999999999998, |f(x) - Taylor f(x)| = 0.09599999999999997\n"
452
+ ]
453
+ }
454
+ ],
455
+ "source": [
456
+ "print('x = {}, f(x) = {}, Taylor f(x) = {}, |f(x) - Taylor f(x)| = {}'.format(0.8,f(0.8),taf(0.8),np.abs(f(0.8)-taf(0.8))))"
457
+ ]
458
+ }
459
+ ],
460
+ "metadata": {
461
+ "kernelspec": {
462
+ "display_name": "Python 3",
463
+ "language": "python",
464
+ "name": "python3"
465
+ },
466
+ "language_info": {
467
+ "codemirror_mode": {
468
+ "name": "ipython",
469
+ "version": 3
470
+ },
471
+ "file_extension": ".py",
472
+ "mimetype": "text/x-python",
473
+ "name": "python",
474
+ "nbconvert_exporter": "python",
475
+ "pygments_lexer": "ipython3",
476
+ "version": "3.7.3"
477
+ }
478
+ },
479
+ "nbformat": 4,
480
+ "nbformat_minor": 4
481
+ }
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Lecturas recomendadas.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ https://pandas.pydata.org/
2
+ https://platzi.com/cursos/pandas/
3
+ https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.pyplot.scatter.html
4
+ https://colab.research.google.com/drive/1a9z-u3RUndOQYqAe_J1-JfdCzHNo5pWM?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Regresión Lineal con Datos Geográficos y Socioeconómicos.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:16f35955a2e1714317f0c3cc8c00610259a58972d6de89ba4de11910fb9baa35
3
+ size 208308772
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Regresión Lineal con Datos Geográficos y Socioeconómicos.vtt ADDED
@@ -0,0 +1,1084 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:03.840 --> 00:00:06.960
4
+ Hola. En esta clase vamos a ver una
5
+
6
+ 00:00:06.960 --> 00:00:09.760
7
+ regresión lineal, vamos a ver cómo a partir
8
+
9
+ 00:00:09.760 --> 00:00:14.900
10
+ de funciones afines podemos construir aproximaciones hacia datos.
11
+
12
+ 00:00:15.264 --> 00:00:16.965
13
+ Este va a ser uno de los proyectos
14
+
15
+ 00:00:17.105 --> 00:00:19.425
16
+ más fuertes que vamos a utilizar hacia el
17
+
18
+ 00:00:19.425 --> 00:00:22.625
19
+ futuro. Recuerda que este curso se divide en
20
+
21
+ 00:00:22.625 --> 00:00:25.285
22
+ tres módulos, el de vectores, el de matrices
23
+
24
+ 00:00:25.744 --> 00:00:28.890
25
+ y uno de aplicaciones del algebra lineal. En
26
+
27
+ 00:00:28.890 --> 00:00:31.449
28
+ las aplicaciones del algebra lineal vamos a retomar
29
+
30
+ 00:00:31.449 --> 00:00:32.970
31
+ este ejemplo y lo vamos a hacer con
32
+
33
+ 00:00:32.970 --> 00:00:35.450
34
+ muchísimo más detalle y vamos a hacerlo mucho
35
+
36
+ 00:00:35.450 --> 00:00:38.329
37
+ más profundidad explicando detalles que aquí nos vamos
38
+
39
+ 00:00:38.329 --> 00:00:40.809
40
+ a saltar. Si te sientes perdido de dónde
41
+
42
+ 00:00:40.809 --> 00:00:44.445
43
+ vienen algunos coeficientes, no te preocupes, esos los
44
+
45
+ 00:00:44.445 --> 00:00:49.085
46
+ explicaremos en dos cursos adelante. Sin más, vamos
47
+
48
+ 00:00:49.085 --> 00:00:52.765
49
+ a la computadora. Este es un nuevo notebook,
50
+
51
+ 00:00:52.765 --> 00:00:55.245
52
+ pero no te preocupes, como siempre lo tendrás
53
+
54
+ 00:00:55.245 --> 00:00:57.565
55
+ a la mano en los recursos, podrás hacer
56
+
57
+ 00:00:57.565 --> 00:01:00.550
58
+ una copia y trabajar con él. Ahora, vamos
59
+
60
+ 00:01:00.550 --> 00:01:04.069
61
+ a empezar considerando esta función afín. Este tipo
62
+
63
+ 00:01:04.069 --> 00:01:06.470
64
+ de funciones ya la hemos visto, y ahora
65
+
66
+ 00:01:06.470 --> 00:01:09.430
67
+ les vamos a llamar modelos de regresión. Le
68
+
69
+ 00:01:09.430 --> 00:01:12.325
70
+ vamos a llamar modelos de regresión y a
71
+
72
+ 00:01:12.325 --> 00:01:15.284
73
+ los elementos del vector x le vamos a
74
+
75
+ 00:01:15.284 --> 00:01:19.845
76
+ llamar regresores. De igual manera, a y el
77
+
78
+ 00:01:19.845 --> 00:01:23.860
79
+ gorrito le vamos a llamar predicción. Hay que
80
+
81
+ 00:01:23.860 --> 00:01:26.340
82
+ notar que la regresión es un modelo, es
83
+
84
+ 00:01:26.340 --> 00:01:29.700
85
+ decir, que nos estamos aproximando a estimar una
86
+
87
+ 00:01:29.700 --> 00:01:34.340
88
+ variable dependiente y, y algunas veces, a esta
89
+
90
+ 00:01:34.340 --> 00:01:37.594
91
+ variable dependiente y también se le llama label,
92
+
93
+ 00:01:37.814 --> 00:01:43.414
94
+ etiqueta o resultado esperado. Al vector b se
95
+
96
+ 00:01:43.414 --> 00:01:46.375
97
+ le denomina el vector de los pesos, mientras
98
+
99
+ 00:01:46.375 --> 00:01:49.115
100
+ que al escalar b se le llama offset
101
+
102
+ 00:01:49.335 --> 00:01:53.890
103
+ o bias. En conjunto, b y beta son
104
+
105
+ 00:01:53.890 --> 00:01:57.650
106
+ los parámetros de la regresión. Recordamos que la
107
+
108
+ 00:01:57.650 --> 00:02:00.370
109
+ notación y, y es muy importante hacer este
110
+
111
+ 00:02:00.370 --> 00:02:04.675
112
+ énfasis, nos hace alusión a que es un
113
+
114
+ 00:02:04.675 --> 00:02:09.095
115
+ estimado o una predicción esperada respecto al resultado
116
+
117
+ 00:02:09.475 --> 00:02:14.455
118
+ y. Ahora bien, vamos a la notación simplificada
119
+
120
+ 00:02:14.515 --> 00:02:18.620
121
+ para un modelo de regresión. Cuando hacemos la
122
+
123
+ 00:02:18.620 --> 00:02:22.880
124
+ concatenación de vectores, esta nos puede servir para
125
+
126
+ 00:02:23.100 --> 00:02:27.440
127
+ expresar, cuando tenemos muchos vectores, bloques de vectores
128
+
129
+ 00:02:27.660 --> 00:02:31.120
130
+ y tener vectores comprimidos, y así tener notación
131
+
132
+ 00:02:31.260 --> 00:02:36.365
133
+ más sencilla. En el caso de esta ecuación
134
+
135
+ 00:02:36.365 --> 00:02:40.205
136
+ nos ayudará muchísimo. Notemos que podemos definir el
137
+
138
+ 00:02:40.205 --> 00:02:45.200
139
+ n más un vector beta como en la
140
+
141
+ 00:02:45.220 --> 00:02:50.380
142
+ primer componente ponemos el escalar v y después
143
+
144
+ 00:02:50.380 --> 00:02:54.860
145
+ concatenamos el vector beta que teníamos anteriormente. Y
146
+
147
+ 00:02:54.860 --> 00:02:58.240
148
+ de igual forma tenemos el n más uno
149
+
150
+ 00:02:58.540 --> 00:03:02.275
151
+ vector x transpuesta, como poniendo un uno en
152
+
153
+ 00:03:02.275 --> 00:03:05.735
154
+ la primer componente y concatenamos con el vector
155
+
156
+ 00:03:05.795 --> 00:03:09.395
157
+ x que ya conocíamos. De esta manera, nosotros
158
+
159
+ 00:03:09.395 --> 00:03:12.355
160
+ podemos expresar esta ecuación afín, esta ecuación de
161
+
162
+ 00:03:12.355 --> 00:03:17.100
163
+ acá, como la multiplicación de estos dos bloques
164
+
165
+ 00:03:17.100 --> 00:03:21.280
166
+ de vectores, y esto lo podemos expresar simplemente
167
+
168
+ 00:03:21.420 --> 00:03:28.895
169
+ como x traspuesta por beta. Por simplicidad, algunas
170
+
171
+ 00:03:28.895 --> 00:03:35.215
172
+ veces simplemente se escribe la predicción llego rito
173
+
174
+ 00:03:35.215 --> 00:03:39.540
175
+ igual a x transpuesta por b, por beta,
176
+
177
+ 00:03:39.540 --> 00:03:43.220
178
+ donde estamos sobreentendiendo que esta es la construcción
179
+
180
+ 00:03:43.220 --> 00:03:46.200
181
+ que estamos utilizando. Va a estar sobre entendido
182
+
183
+ 00:03:46.260 --> 00:03:48.340
184
+ que aquí ya está incluido el offset, el
185
+
186
+ 00:03:48.340 --> 00:03:53.075
187
+ BIOS. Ahora entendido esto, vamos a pasar a
188
+
189
+ 00:03:53.075 --> 00:03:59.315
190
+ un ejemplo de regresión. Ahora, vamos a comenzar
191
+
192
+ 00:03:59.315 --> 00:04:02.034
193
+ con un ejemplo de regresión. Para este ejemplo,
194
+
195
+ 00:04:02.034 --> 00:04:04.915
196
+ vamos a considerar los datos del Golden Oak
197
+
198
+ 00:04:04.915 --> 00:04:07.940
199
+ Research Group. El Golden Oak Research Group, y
200
+
201
+ 00:04:07.940 --> 00:04:09.620
202
+ sobre todo la base de datos que vamos
203
+
204
+ 00:04:09.620 --> 00:04:13.300
205
+ a estar utilizando, correlaciona los ingresos por casa
206
+
207
+ 00:04:13.300 --> 00:04:16.420
208
+ promedio con la latitud y la longitud, al
209
+
210
+ 00:04:16.420 --> 00:04:20.274
211
+ igual que los códigos postales. Tú vas a
212
+
213
+ 00:04:20.274 --> 00:04:24.835
214
+ encontrar en esta clase anexo al notebook una
215
+
216
+ 00:04:24.835 --> 00:04:28.195
217
+ serie de documentos. Dentro de ellos vas a
218
+
219
+ 00:04:28.195 --> 00:04:37.410
220
+ poder encontrar incomedb G0RG. Si nosotros lo abrimos,
221
+
222
+ 00:04:37.410 --> 00:04:39.330
223
+ veremos que es una base en donde está
224
+
225
+ 00:04:39.330 --> 00:04:42.210
226
+ un ID, el el código del estado, el
227
+
228
+ 00:04:42.210 --> 00:04:46.195
229
+ nombre del estado, la abreviación de ese estado,
230
+
231
+ 00:04:46.195 --> 00:04:56.035
232
+ el country, la ciudad, el lugar de el
233
+
234
+ 00:04:56.035 --> 00:04:57.735
235
+ lugar de donde es dentro de esa ciudad,
236
+
237
+ 00:05:00.140 --> 00:05:03.340
238
+ El tipo, o sea, si es una ciudad,
239
+
240
+ 00:05:03.340 --> 00:05:04.860
241
+ si es un pueblo, si es una gran
242
+
243
+ 00:05:04.860 --> 00:05:09.040
244
+ urbe. Vamos a encontrar también los códigos postales,
245
+
246
+ 00:05:09.340 --> 00:05:13.765
247
+ vamos a encontrar los códigos de área, vamos
248
+
249
+ 00:05:13.765 --> 00:05:16.565
250
+ a encontrar la latitud y la longitud, vamos
251
+
252
+ 00:05:16.565 --> 00:05:19.465
253
+ a encontrar el salario promedio que se registró,
254
+
255
+ 00:05:20.565 --> 00:05:23.764
256
+ la mediana del salario de de ingreso por
257
+
258
+ 00:05:23.764 --> 00:05:29.000
259
+ casa y la desviación estándar. Dentro de esta
260
+
261
+ 00:05:29.000 --> 00:05:32.200
262
+ misma o vas a encontrar esta carpeta, y
263
+
264
+ 00:05:32.200 --> 00:05:36.040
265
+ esta carpeta tiene este PDF de definitions. Aquí
266
+
267
+ 00:05:36.040 --> 00:05:40.205
268
+ están definidos cada una de las columnas de
269
+
270
+ 00:05:40.745 --> 00:05:43.865
271
+ este dataset. Por ejemplo, el ID te dice
272
+
273
+ 00:05:43.865 --> 00:05:46.105
274
+ que es tipo carácter y es el ID
275
+
276
+ 00:05:46.105 --> 00:05:49.005
277
+ de la locación donde fue analizado la data.
278
+
279
+ 00:05:50.345 --> 00:05:53.145
280
+ Otro ejemplo sería, por ejemplo, el área code.
281
+
282
+ 00:05:53.145 --> 00:05:55.440
283
+ El área code es un carácter, te dice
284
+
285
+ 00:05:55.440 --> 00:05:59.360
286
+ que es de tipo carácter, y tiene el
287
+
288
+ 00:05:59.360 --> 00:06:02.560
289
+ ZIP code reportado por el censo de Estados
290
+
291
+ 00:06:02.560 --> 00:06:07.440
292
+ Unidos, y es el ZIP más cercano a
293
+
294
+ 00:06:07.440 --> 00:06:11.785
295
+ la longitud donde se hizo la encuesta. O,
296
+
297
+ 00:06:11.785 --> 00:06:14.264
298
+ por ejemplo, la latitud, en donde te dice
299
+
300
+ 00:06:14.264 --> 00:06:16.525
301
+ que es un double, y esto te dice
302
+
303
+ 00:06:16.825 --> 00:06:21.305
304
+ que es el salario promedio que reciben dada
305
+
306
+ 00:06:21.305 --> 00:06:28.470
307
+ una locación específica. Ahora, aquí podrás encontrar la
308
+
309
+ 00:06:28.470 --> 00:06:31.110
310
+ descripción de cada una de las columnas. Las
311
+
312
+ 00:06:31.110 --> 00:06:34.310
313
+ que nosotros vamos a utilizar más adelante será
314
+
315
+ 00:06:34.310 --> 00:06:37.430
316
+ lat, que representa la latitud, long, que representa
317
+
318
+ 00:06:37.430 --> 00:06:41.765
319
+ la longitud, min, que representa el salario promedio
320
+
321
+ 00:06:41.765 --> 00:06:45.445
322
+ que se está registrando en ese lugar. Más
323
+
324
+ 00:06:45.445 --> 00:06:48.825
325
+ adelante también, para cerrar, usaremos el zip code.
326
+
327
+ 00:06:49.125 --> 00:06:51.525
328
+ Si tienes alguna duda con este dataset, puedes
329
+
330
+ 00:06:51.525 --> 00:06:53.970
331
+ venir a revisarlo aquí totalmente y están todas
332
+
333
+ 00:06:53.970 --> 00:06:56.969
334
+ las definiciones por columna. De igual manera, vas
335
+
336
+ 00:06:56.969 --> 00:07:00.210
337
+ a ver con Metodology, y es en donde
338
+
339
+ 00:07:00.210 --> 00:07:03.750
340
+ explican cómo hicieron este estudio. Si tienes curiosidad,
341
+
342
+ 00:07:03.810 --> 00:07:07.835
343
+ puedes venir a revisarlo aquí. Ahora bien, regresando
344
+
345
+ 00:07:07.835 --> 00:07:11.995
346
+ a nuestro notebook, lo primero que vamos a
347
+
348
+ 00:07:11.995 --> 00:07:14.955
349
+ hacer va a ser cargar nuestras bibliotecas. En
350
+
351
+ 00:07:14.955 --> 00:07:18.795
352
+ esta ocasión, vamos a utilizar Matplotlib porque queremos
353
+
354
+ 00:07:18.795 --> 00:07:23.440
355
+ visualizar. Vamos a utilizar Pandas para poder acceder
356
+
357
+ 00:07:23.900 --> 00:07:26.060
358
+ a un tipo especial de objetos, que son
359
+
360
+ 00:07:26.060 --> 00:07:30.800
361
+ los data frames. Pandas nos permite manipular conjuntos
362
+
363
+ 00:07:31.020 --> 00:07:34.395
364
+ de información, data sets de información de una
365
+
366
+ 00:07:34.395 --> 00:07:38.555
367
+ forma muy sencilla. Y también vamos a utilizar
368
+
369
+ 00:07:38.555 --> 00:07:42.795
370
+ NumPy, como siempre. Ahora, la notación estándar o
371
+
372
+ 00:07:42.795 --> 00:07:46.175
373
+ la nomenclatura estándar para cargar un CS un
374
+
375
+ 00:07:46.315 --> 00:07:49.680
376
+ CSV es este, y aquí vamos a ejecutar
377
+
378
+ 00:07:49.680 --> 00:07:55.700
379
+ estas instrucciones. Ejecutamos esta y ejecutamos también esta.
380
+
381
+ 00:07:55.760 --> 00:07:57.520
382
+ Aquí lo que estoy haciendo es que estoy
383
+
384
+ 00:07:57.520 --> 00:08:00.260
385
+ creando un data frame después de leer estos
386
+
387
+ 00:08:00.400 --> 00:08:03.255
388
+ este archivo, este CSV, y va a quedar
389
+
390
+ 00:08:03.315 --> 00:08:05.795
391
+ en DF. Vamos a ver cómo se ve
392
+
393
+ 00:08:05.795 --> 00:08:08.995
394
+ DF. DF luce así, es casi como si
395
+
396
+ 00:08:08.995 --> 00:08:15.255
397
+ viéramos SCSV. Podemos sacar funciones interesantes como solamente
398
+
399
+ 00:08:15.385 --> 00:08:19.039
400
+ imprimir el head, y nos nos regresa los
401
+
402
+ 00:08:19.039 --> 00:08:23.780
403
+ primeros cinco resultados, o también podemos reproducir, imprimir
404
+
405
+ 00:08:24.000 --> 00:08:28.720
406
+ únicamente la cola. Notemos que la longitud de
407
+
408
+ 00:08:28.720 --> 00:08:31.379
409
+ este dataset es de treinta y dos mil
410
+
411
+ 00:08:31.919 --> 00:08:35.475
412
+ quinientos veinticinco, Es decir, si nosotros calculamos la
413
+
414
+ 00:08:35.475 --> 00:08:42.595
415
+ longitud nos daremos cuenta que tiene treinta y
416
+
417
+ 00:08:42.595 --> 00:08:46.950
418
+ dos mil quinientos veintiséis renglones de datos, Y
419
+
420
+ 00:08:46.950 --> 00:08:51.210
421
+ también podemos nosotros calcular las columnas diez columns,
422
+
423
+ 00:08:52.150 --> 00:08:57.430
424
+ y nos dice qué columnas tiene. Nos dice
425
+
426
+ 00:08:57.430 --> 00:08:59.350
427
+ que esté el ID, el state code, el
428
+
429
+ 00:08:59.350 --> 00:09:01.995
430
+ state name, etcétera. Y, de hecho, nos dice
431
+
432
+ 00:09:01.995 --> 00:09:04.415
433
+ que tiene, vamos a ver cuántas columnas tiene.
434
+
435
+ 00:09:07.035 --> 00:09:10.575
436
+ Tiene diecinueve columnas. Ahora, cada una de estas
437
+
438
+ 00:09:10.954 --> 00:09:12.954
439
+ columnas, voy a regresar rapidísimo al a la
440
+
441
+ 00:09:12.954 --> 00:09:18.139
442
+ visión del data frame, y vamos a ponerle
443
+
444
+ 00:09:18.139 --> 00:09:22.880
445
+ el head. Cada una de estas columnas la
446
+
447
+ 00:09:23.180 --> 00:09:27.260
448
+ podemos pensar como un vector, y entonces, más
449
+
450
+ 00:09:27.260 --> 00:09:29.420
451
+ adelante vamos a poder acceder a cada una
452
+
453
+ 00:09:29.420 --> 00:09:31.545
454
+ de estas y poder operar con cada una
455
+
456
+ 00:09:31.545 --> 00:09:40.505
457
+ de ellas. Ahora, para responder las preguntas de
458
+
459
+ 00:09:40.505 --> 00:09:43.160
460
+ qué data contiene la base de datos, basta
461
+
462
+ 00:09:43.160 --> 00:09:45.960
463
+ con que hagamos un data frame o un
464
+
465
+ 00:09:45.960 --> 00:09:49.080
466
+ DF. Head, y ya nos arroja y podemos
467
+
468
+ 00:09:49.080 --> 00:09:51.320
469
+ visualizar qué tipo de datos contiene para poder
470
+
471
+ 00:09:51.320 --> 00:09:54.780
472
+ responder eso. Para poder responder qué tamaño tiene,
473
+
474
+ 00:09:54.920 --> 00:09:57.880
475
+ deberíamos de pensar qué significa que qué tamaño
476
+
477
+ 00:09:57.880 --> 00:10:02.515
478
+ tenga. Si nos, si queremos saber cuál es
479
+
480
+ 00:10:02.515 --> 00:10:06.035
481
+ la cantidad de datos que contiene, entonces esa
482
+
483
+ 00:10:06.035 --> 00:10:09.495
484
+ pregunta sería la longitud que tiene el data
485
+
486
+ 00:10:10.115 --> 00:10:13.800
487
+ frame por la longitud del número de columnas.
488
+
489
+ 00:10:14.760 --> 00:10:20.200
490
+ Dif dot columns. Y eso nos diría que
491
+
492
+ 00:10:20.200 --> 00:10:23.959
493
+ tiene seiscientos diecisiete mil novecientos noventa y cuatro
494
+
495
+ 00:10:23.959 --> 00:10:27.019
496
+ datos. Pero si lo que queremos es responder
497
+
498
+ 00:10:27.535 --> 00:10:31.615
499
+ cuántas renglones tiene, es decir, cuántos elementos va
500
+
501
+ 00:10:31.615 --> 00:10:35.215
502
+ a tener cada uno de esos vectores, tiene
503
+
504
+ 00:10:35.215 --> 00:10:39.390
505
+ treinta y dos mil quinientos veintiséis. Ahora bien,
506
+
507
+ 00:10:39.710 --> 00:10:42.670
508
+ para este ejemplo, nuestros regresores van a ser
509
+
510
+ 00:10:42.670 --> 00:10:47.730
511
+ la latitud y la longitud, mientras que nuestra
512
+
513
+ 00:10:48.110 --> 00:10:53.170
514
+ nuestra variable dependiente, la que nosotros queremos predecir,
515
+
516
+ 00:10:54.190 --> 00:10:56.185
517
+ va a ser el MIN, que es el
518
+
519
+ 00:10:56.185 --> 00:10:59.625
520
+ salario promedio que se recibe en esas, o
521
+
522
+ 00:10:59.625 --> 00:11:01.785
523
+ que se reporta en esa latitud y en
524
+
525
+ 00:11:01.785 --> 00:11:07.464
526
+ esa longitud. Ahora, calcular el vector de predicciones
527
+
528
+ 00:11:07.464 --> 00:11:10.710
529
+ y, lo lo que hay que hacer es
530
+
531
+ 00:11:10.710 --> 00:11:14.470
532
+ calcular el el vector de predicciones y, ya
533
+
534
+ 00:11:14.470 --> 00:11:16.230
535
+ que a cada uno de esos valores de
536
+
537
+ 00:11:16.230 --> 00:11:19.450
538
+ latitud y de longitud les vamos a asignar
539
+
540
+ 00:11:19.510 --> 00:11:22.275
541
+ o van a tener asignados un valor de
542
+
543
+ 00:11:22.275 --> 00:11:25.555
544
+ mil. Entonces, este de aquí va a ser
545
+
546
+ 00:11:25.555 --> 00:11:29.155
547
+ nuestra etiqueta o nuestro valor esperado, y gorrito,
548
+
549
+ 00:11:29.155 --> 00:11:31.975
550
+ va a ser nuestra predicción, y nuestros regresores
551
+
552
+ 00:11:32.035 --> 00:11:34.295
553
+ van a ser la latitud y la longitud.
554
+
555
+ 00:11:34.900 --> 00:11:37.700
556
+ Un problema que tenemos aquí es que no
557
+
558
+ 00:11:37.700 --> 00:11:40.580
559
+ tenemos la forma de calcular los valores de
560
+
561
+ 00:11:40.580 --> 00:11:44.200
562
+ los parámetros o del vector de pesos, beta,
563
+
564
+ 00:11:44.660 --> 00:11:48.824
565
+ y del offset. Estos parámetros de aquí vamos
566
+
567
+ 00:11:48.824 --> 00:11:51.545
568
+ a asumir que ya vienen dados. Más adelante,
569
+
570
+ 00:11:51.545 --> 00:11:54.105
571
+ en próximas clases, sobre todo en el módulo
572
+
573
+ 00:11:54.105 --> 00:11:56.345
574
+ tres, vamos a estar tratando muchos problemas como
575
+
576
+ 00:11:56.345 --> 00:12:00.480
577
+ este y ahí quedará mucho más claro. Ahora,
578
+
579
+ 00:12:00.620 --> 00:12:03.899
580
+ ya asumiendo que esos son nuestros parámetros, podemos
581
+
582
+ 00:12:03.899 --> 00:12:06.940
583
+ empezar a hacer las predicciones. Para hacer las
584
+
585
+ 00:12:06.940 --> 00:12:10.079
586
+ predicciones, basta con que carguemos nuestra función afín.
587
+
588
+ 00:12:10.620 --> 00:12:15.014
589
+ Aquí tenemos def predicciones igual a beta, Cargamos
590
+
591
+ 00:12:15.035 --> 00:12:17.954
592
+ estos valores de beta aquí, setenta y cuatro
593
+
594
+ 00:12:17.954 --> 00:12:20.274
595
+ punto ochenta y tres, setecientos cuarenta y cuatro
596
+
597
+ 00:12:20.274 --> 00:12:23.475
598
+ punto ochenta y tres y menos ochenta y
599
+
600
+ 00:12:23.475 --> 00:12:27.589
601
+ tres punto cuarenta y cinco. De igual manera,
602
+
603
+ 00:12:27.589 --> 00:12:30.470
604
+ cargamos el offset. El offset es igual a
605
+
606
+ 00:12:30.470 --> 00:12:34.330
607
+ treinta mil novecientos ochenta punto cuarenta y ocho.
608
+
609
+ 00:12:35.830 --> 00:12:39.430
610
+ Y nosotros sabemos que la función para hacer
611
+
612
+ 00:12:39.430 --> 00:12:45.085
613
+ la predicción es x y prima transpuesta por
614
+
615
+ 00:12:45.085 --> 00:12:49.005
616
+ el vector de pesos más el offset. Entonces,
617
+
618
+ 00:12:49.005 --> 00:12:51.485
619
+ aquí lo que tenemos es eso, el vector
620
+
621
+ 00:12:51.485 --> 00:12:54.855
622
+ en el que evaluamos es x, entonces es
623
+
624
+ 00:12:54.855 --> 00:12:59.970
625
+ x por beta más nuestro offset. Ejecutamos esta
626
+
627
+ 00:12:59.970 --> 00:13:04.930
628
+ celda. Ahora, nosotros queremos sacar la la longitud
629
+
630
+ 00:13:04.930 --> 00:13:08.545
631
+ y la latitud del data frame. Notemos que
632
+
633
+ 00:13:08.545 --> 00:13:11.045
634
+ una forma para poder acceder a esas columnas
635
+
636
+ 00:13:11.345 --> 00:13:14.385
637
+ únicamente es a través de la instrucción d
638
+
639
+ 00:13:14.385 --> 00:13:18.325
640
+ f, corchetes cuadrados, y le ponemos el nombre
641
+
642
+ 00:13:18.705 --> 00:13:21.025
643
+ de la columna. Por ejemplo, si quisiéramos la
644
+
645
+ 00:13:21.025 --> 00:13:26.320
646
+ latitud, tenemos nada más lat, y nos arroja
647
+
648
+ 00:13:26.380 --> 00:13:29.520
649
+ exactamente esto de aquí. Pero si nos damos
650
+
651
+ 00:13:29.900 --> 00:13:33.020
652
+ cuenta, yo le voy a preguntar qué tipo
653
+
654
+ 00:13:33.020 --> 00:13:38.795
655
+ es, y esto nos da que es un
656
+
657
+ 00:13:38.795 --> 00:13:46.315
658
+ tipo Pandas.core.Series.Series. Nosotros hasta el momento hemos trabajado
659
+
660
+ 00:13:46.315 --> 00:13:50.480
661
+ únicamente con numpy array y nos gustaría poder
662
+
663
+ 00:13:50.480 --> 00:13:53.600
664
+ convertir esto en un numpy array. La forma
665
+
666
+ 00:13:53.600 --> 00:13:55.680
667
+ de poder hacer eso es a través de
668
+
669
+ 00:13:55.680 --> 00:14:00.560
670
+ la instrucción punto values, y lo que ya
671
+
672
+ 00:14:00.560 --> 00:14:02.880
673
+ nos regresa es un numpy array de esos
674
+
675
+ 00:14:02.880 --> 00:14:05.625
676
+ valores en orden, así que hay que comprobarlo.
677
+
678
+ 00:14:06.005 --> 00:14:10.085
679
+ Le vamos a preguntar el tipo y nos
680
+
681
+ 00:14:10.085 --> 00:14:13.785
682
+ dice, hola, soy un numpy array. Eso está
683
+
684
+ 00:14:14.165 --> 00:14:16.645
685
+ perfecto, pero ahora lo que nosotros queremos son
686
+
687
+ 00:14:16.645 --> 00:14:19.380
688
+ los vectores x, en donde la primera entrada
689
+
690
+ 00:14:19.380 --> 00:14:21.380
691
+ es la latitud y la segunda es la
692
+
693
+ 00:14:21.380 --> 00:14:25.400
694
+ longitud. Para poder acceder a eso, podemos utilizar
695
+
696
+ 00:14:25.460 --> 00:14:30.600
697
+ ahora la instrucción de f, corchetes cuadrados, y
698
+
699
+ 00:14:31.884 --> 00:14:34.444
700
+ lo que la intuición nos diría es que
701
+
702
+ 00:14:34.444 --> 00:14:39.024
703
+ nosotros podemos meter aquí el lat coma long
704
+
705
+ 00:14:39.565 --> 00:14:43.725
706
+ de la longitud. Y esto nos da un
707
+
708
+ 00:14:43.725 --> 00:14:47.190
709
+ error, porque Pandas no sabe cómo interpretar esto.
710
+
711
+ 00:14:47.590 --> 00:14:53.350
712
+ La sintaxis correcta sería que estos corchetes tuvieran
713
+
714
+ 00:14:53.350 --> 00:14:55.850
715
+ adentro este vector, el vector de los nombres.
716
+
717
+ 00:14:56.630 --> 00:14:59.370
718
+ Ahora, si nos damos cuenta, vamos a preguntar
719
+
720
+ 00:14:59.830 --> 00:15:05.524
721
+ qué tipo de dato nos está arrojando, qué
722
+
723
+ 00:15:05.524 --> 00:15:07.765
724
+ tipo de objeto. Y esto de aquí es
725
+
726
+ 00:15:07.765 --> 00:15:10.865
727
+ un data frame, igual que DF completo, y
728
+
729
+ 00:15:10.964 --> 00:15:15.240
730
+ nos gustaría poder convertir esto, pero donde las
731
+
732
+ 00:15:15.240 --> 00:15:17.960
733
+ estas entradas estén dentro de un mismo vector,
734
+
735
+ 00:15:17.960 --> 00:15:20.440
736
+ dentro de un mismo numpy array, a un
737
+
738
+ 00:15:20.440 --> 00:15:23.800
739
+ vector que tenga todos estos vectores. Para hacer
740
+
741
+ 00:15:23.800 --> 00:15:27.180
742
+ eso, bastará con que ejecutemos la la instrucción
743
+
744
+ 00:15:27.400 --> 00:15:34.695
745
+ value. Values con la s. Y ya nos
746
+
747
+ 00:15:34.695 --> 00:15:38.454
748
+ regresa vectores de manera ordenada, en donde el
749
+
750
+ 00:15:38.454 --> 00:15:40.935
751
+ primero corresponde al primer valor de la longitud
752
+
753
+ 00:15:40.935 --> 00:15:42.910
754
+ de la latitud y el otro es el
755
+
756
+ 00:15:42.910 --> 00:15:44.750
757
+ primer valor de la longitud, y este es
758
+
759
+ 00:15:44.750 --> 00:15:47.870
760
+ el primer renglón, el segundo renglón, el tercer
761
+
762
+ 00:15:47.870 --> 00:15:51.070
763
+ renglón, y así hasta el n menos uno
764
+
765
+ 00:15:51.070 --> 00:15:52.670
766
+ renglón, que en este caso es treinta y
767
+
768
+ 00:15:52.670 --> 00:15:56.405
769
+ dos mil y algo. Ahora, esto lo podemos
770
+
771
+ 00:15:56.405 --> 00:15:59.465
772
+ guardar de manera completa aquí en esta variable
773
+
774
+ 00:15:59.605 --> 00:16:04.905
775
+ x mayúscula, entonces la ejecutamos. Y ahora, evaluar
776
+
777
+ 00:16:05.005 --> 00:16:08.325
778
+ nuestras predicciones va a ser tan sencillo como
779
+
780
+ 00:16:08.325 --> 00:16:12.320
781
+ evaluar el vector de predicciones, la función de
782
+
783
+ 00:16:12.540 --> 00:16:17.100
784
+ predicciones en el vector XYA esto, esto de
785
+
786
+ 00:16:17.100 --> 00:16:22.060
787
+ aquí, esta función nos va a regresar un
788
+
789
+ 00:16:22.060 --> 00:16:24.060
790
+ un n vector, que es de tamaño treinta
791
+
792
+ 00:16:24.060 --> 00:16:27.035
793
+ y dos mil y algo, y este lo
794
+
795
+ 00:16:27.035 --> 00:16:29.615
796
+ vamos a asignar a la variable yeh hat.
797
+
798
+ 00:16:33.755 --> 00:16:37.305
799
+ Ejecutado. Ahora veamos cómo se ve yeh hat.
800
+
801
+ 00:16:39.389 --> 00:16:42.350
802
+ JHot es un conjunto, es un es un
803
+
804
+ 00:16:42.350 --> 00:16:47.170
805
+ numpy array, miren, el type, es numpy array.
806
+
807
+ 00:16:49.755 --> 00:16:53.595
808
+ Y además, le podemos preguntar también su longitud,
809
+
810
+ 00:16:53.595 --> 00:16:56.415
811
+ y tiene treinta y dos mil quinientos veintiséis.
812
+
813
+ 00:16:57.035 --> 00:17:01.435
814
+ Vamos a preguntarle la longitud que tiene a
815
+
816
+ 00:17:01.435 --> 00:17:04.190
817
+ x, porque para cada una de las entradas
818
+
819
+ 00:17:04.190 --> 00:17:06.589
820
+ de este vector x tiene que corresponder un
821
+
822
+ 00:17:06.589 --> 00:17:08.750
823
+ valor de yehad, y vemos que sí, en
824
+
825
+ 00:17:08.750 --> 00:17:11.390
826
+ efecto, tienen el mismo tamaño. Al menos ya
827
+
828
+ 00:17:11.390 --> 00:17:13.890
829
+ sabemos que hay una correspondencia uno a uno.
830
+
831
+ 00:17:15.015 --> 00:17:19.095
832
+ Ahora, nuestro valor al que queríamos aproximarnos era
833
+
834
+ 00:17:19.095 --> 00:17:22.075
835
+ el valor de mil, que era el salario
836
+
837
+ 00:17:22.215 --> 00:17:26.075
838
+ promedio reportado en cada uno de los hogares,
839
+
840
+ 00:17:26.215 --> 00:17:29.420
841
+ en esa latitud y en esa longitud. Como
842
+
843
+ 00:17:29.420 --> 00:17:31.360
844
+ queremos que eso sea un un p array,
845
+
846
+ 00:17:31.580 --> 00:17:36.320
847
+ ejecutamos data frame o diez corchetes min dot
848
+
849
+ 00:17:36.380 --> 00:17:39.360
850
+ values, y esto va a generar en y
851
+
852
+ 00:17:42.345 --> 00:17:47.005
853
+ justamente ese vector. Ahora, vamos a ir rapidísimo
854
+
855
+ 00:17:47.385 --> 00:17:51.865
856
+ a ejecutar la idea. Vamos a partir de
857
+
858
+ 00:17:51.865 --> 00:17:59.460
859
+ aquí. Si yo tengo mis datos y en
860
+
861
+ 00:17:59.460 --> 00:18:03.460
862
+ este voy a graficar los datos reales, y
863
+
864
+ 00:18:03.460 --> 00:18:08.455
865
+ en este voy a graficar las predicciones, Lo
866
+
867
+ 00:18:08.455 --> 00:18:11.195
868
+ ideal es que si yo gráfico las predicciones,
869
+
870
+ 00:18:13.255 --> 00:18:15.255
871
+ le voy a poner a este una p
872
+
873
+ 00:18:15.255 --> 00:18:19.815
874
+ de predicciones o una y, gorrito. Y a
875
+
876
+ 00:18:19.815 --> 00:18:26.580
877
+ este tengo y. Si yo gráfico, vamos a
878
+
879
+ 00:18:26.580 --> 00:18:29.940
880
+ ponerlos al revés. Simplemente le quito de aquí
881
+
882
+ 00:18:29.940 --> 00:18:33.240
883
+ el gorrito y se lo pongo a k.
884
+
885
+ 00:18:34.340 --> 00:18:38.200
886
+ Ahora, si nosotros pensamos graficar en este eje
887
+
888
+ 00:18:38.625 --> 00:18:42.784
889
+ el valor que nosotros sabemos que medimos de
890
+
891
+ 00:18:42.784 --> 00:18:46.325
892
+ los de los incoming mensuales de los salarios
893
+
894
+ 00:18:47.345 --> 00:18:50.065
895
+ mensuales promedio de las personas, y en este
896
+
897
+ 00:18:50.065 --> 00:18:53.150
898
+ tenemos lo que nosotros predecimos que debería de
899
+
900
+ 00:18:53.150 --> 00:18:54.990
901
+ ser a partir de la latitud y la
902
+
903
+ 00:18:54.990 --> 00:19:00.030
904
+ longitud, en el mejor de los casos, este
905
+
906
+ 00:19:00.030 --> 00:19:06.855
907
+ debería de quedar como una línea recta. Así,
908
+
909
+ 00:19:07.955 --> 00:19:10.675
910
+ porque eso significaría que a cada valor que
911
+
912
+ 00:19:10.675 --> 00:19:17.795
913
+ yo tomé de aquí, supongamos aquí, se le
914
+
915
+ 00:19:17.795 --> 00:19:22.170
916
+ asignó exactamente el mismo valor o el valor
917
+
918
+ 00:19:22.170 --> 00:19:28.090
919
+ que debería de ser en la predicción. Entonces,
920
+
921
+ 00:19:28.090 --> 00:19:30.090
922
+ en el mejor de los escenarios y cuando
923
+
924
+ 00:19:30.090 --> 00:19:33.050
925
+ no hay ningún error, esto debería de corresponder
926
+
927
+ 00:19:33.050 --> 00:19:35.965
928
+ o debería de tener alguna recta. En la
929
+
930
+ 00:19:35.965 --> 00:19:38.764
931
+ realidad, lo que nosotros vamos a ver es
932
+
933
+ 00:19:38.764 --> 00:19:42.605
934
+ que se forman ciertos puntos alrededor de esta
935
+
936
+ 00:19:42.605 --> 00:19:44.365
937
+ recta o alrededor de lo que sería la
938
+
939
+ 00:19:44.365 --> 00:19:49.005
940
+ mejor recta. Pero siempre y cuando sigan este
941
+
942
+ 00:19:49.005 --> 00:19:54.600
943
+ comportamiento de recta, significa que nuestra predicción estuvo
944
+
945
+ 00:19:54.899 --> 00:19:57.539
946
+ bien, y a esta le podemos medir el
947
+
948
+ 00:19:57.539 --> 00:20:01.299
949
+ error. Ahora, si todos los puntos aparecen súper
950
+
951
+ 00:20:01.299 --> 00:20:02.980
952
+ lejos de lo que debería de ser la
953
+
954
+ 00:20:02.980 --> 00:20:07.695
955
+ recta, como por ejemplo hasta acá, eso significa
956
+
957
+ 00:20:07.695 --> 00:20:10.015
958
+ que nuestros parámetros están mal y hay que
959
+
960
+ 00:20:10.015 --> 00:20:13.475
961
+ reajustar los parámetros, esto es reentrenar el modelo
962
+
963
+ 00:20:13.535 --> 00:20:17.940
964
+ para volver a hacerlo bien. Ahora, eso es
965
+
966
+ 00:20:17.940 --> 00:20:20.020
967
+ lo que vamos a hacer aquí. Vamos a
968
+
969
+ 00:20:20.020 --> 00:20:22.660
970
+ plottear puntos, Scatter lo que nos hace es
971
+
972
+ 00:20:22.660 --> 00:20:25.460
973
+ hacer plot de puntitos, de y hat en
974
+
975
+ 00:20:25.460 --> 00:20:28.340
976
+ el eje x, de y, que son los
977
+
978
+ 00:20:28.340 --> 00:20:32.485
979
+ valores que esperábamos, y vamos a ponerlos un
980
+
981
+ 00:20:32.485 --> 00:20:34.885
982
+ marker con una bolita y que sean de
983
+
984
+ 00:20:34.885 --> 00:20:40.405
985
+ color rojo. Ahora, por otro lado, vamos a
986
+
987
+ 00:20:40.405 --> 00:20:43.205
988
+ plotear una línea punteada que sea y coma
989
+
990
+ 00:20:43.205 --> 00:20:45.190
991
+ y. Y coma y es el mejor de
992
+
993
+ 00:20:45.190 --> 00:20:48.250
994
+ los escenarios, a donde deberíamos de haber llegado.
995
+
996
+ 00:20:48.470 --> 00:20:50.870
997
+ Los puntos deberían de estar alrededor de esta
998
+
999
+ 00:20:50.870 --> 00:20:56.890
1000
+ línea si nuestros parámetros están bien. Y bueno,
1001
+
1002
+ 00:20:57.725 --> 00:21:00.125
1003
+ gran decepción aquí, eso significa que hay que
1004
+
1005
+ 00:21:00.125 --> 00:21:03.485
1006
+ reentrenar nuestros parámetros. Si se dan cuenta, solamente
1007
+
1008
+ 00:21:03.485 --> 00:21:05.805
1009
+ hay una pequeña zona de parámetros que están
1010
+
1011
+ 00:21:05.805 --> 00:21:08.125
1012
+ cerca de aquí, una pequeña zona de parámetros
1013
+
1014
+ 00:21:08.125 --> 00:21:10.365
1015
+ que están cerca de aquí y otra pequeña
1016
+
1017
+ 00:21:10.365 --> 00:21:12.545
1018
+ zona de parámetros que están cerca de aquí.
1019
+
1020
+ 00:21:12.900 --> 00:21:14.740
1021
+ Nosotros nos gustaría que para cada una de
1022
+
1023
+ 00:21:14.740 --> 00:21:17.780
1024
+ las latitudes y longitudes que escogimos hubiera un
1025
+
1026
+ 00:21:17.780 --> 00:21:22.680
1027
+ vector de householding correspondiendo exactamente con ese main.
1028
+
1029
+ 00:21:25.635 --> 00:21:27.715
1030
+ Ahora, lo que te queda a ti para
1031
+
1032
+ 00:21:27.715 --> 00:21:32.035
1033
+ hacer es repetir todo este proceso, y lo
1034
+
1035
+ 00:21:32.035 --> 00:21:36.195
1036
+ vas a repetir con estos nuevos parámetros, y
1037
+
1038
+ 00:21:36.195 --> 00:21:39.820
1039
+ aquí vamos a introducir zip code. Entonces, no
1040
+
1041
+ 00:21:39.820 --> 00:21:43.019
1042
+ vamos a utilizar como regresores únicamente latitud y
1043
+
1044
+ 00:21:43.019 --> 00:21:46.399
1045
+ longitud, sino vamos a introducir también zip code
1046
+
1047
+ 00:21:46.460 --> 00:21:49.259
1048
+ dentro de los regresores. Los parámetros con los
1049
+
1050
+ 00:21:49.259 --> 00:21:50.940
1051
+ que vas a ajustar el modelo van a
1052
+
1053
+ 00:21:50.940 --> 00:21:54.425
1054
+ ser estos de aquí. La pregunta que me
1055
+
1056
+ 00:21:54.425 --> 00:21:58.125
1057
+ gustaría que respondiera es si mejoras, si mejora
1058
+
1059
+ 00:21:58.265 --> 00:22:01.065
1060
+ la predicción introduciendo el nuevo regresor y con
1061
+
1062
+ 00:22:01.065 --> 00:22:06.320
1063
+ los nuevos parámetros. Si te sentiste perdido en
1064
+
1065
+ 00:22:06.779 --> 00:22:08.299
1066
+ esta clase, te invito a que tomes el
1067
+
1068
+ 00:22:08.299 --> 00:22:10.380
1069
+ curso de introducción a Python que tenemos en
1070
+
1071
+ 00:22:10.380 --> 00:22:13.019
1072
+ Platzi. De igual manera, si te interesó el
1073
+
1074
+ 00:22:13.019 --> 00:22:16.539
1075
+ manejo de datos usando Pandas, tenemos un curso
1076
+
1077
+ 00:22:16.539 --> 00:22:19.497
1078
+ de análisis de datos con Pandas también en
1079
+
1080
+ 00:22:19.497 --> 00:22:21.997
1081
+ Platzi. Seguro que te será muy útil aprenderlo.
1082
+
1083
+ 00:22:23.096 --> 00:22:24.637
1084
+ Nos vemos en la siguiente clase.
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-definitions_7d274da2-c190-43fe-9c19-8f10487943ee.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0c4db2b297bfff02ef22133c1c7276a59feb984d749f791ecc1aa23a162029cf
3
+ size 176858
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-income_db_gorg_283cf1bb-74a9-4cf5-9255-da690e2b3e64.csv ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-income_methodology_f503f6ab-8d26-417d-946f-a4c86f70bc87.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8d37270ff38c77e11ac0bbfa62051e8207958f107d10322980f4ecffe88c81d0
3
+ size 647958
a/Curso de Introducción al Álgebra Lineal Vectores/03-Funciones lineales/07-regresion_lineal_306f23ad-b398-409f-a70f-32fc99b2cb56.ipynb ADDED
@@ -0,0 +1,487 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 7. Regresión lineal"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "Usaremos la función afín:\n",
15
+ "\n",
16
+ "$$\n",
17
+ "\\hat{y} = \\mathbf{x}^{T}\\boldsymbol{\\beta} + v\n",
18
+ "$$\n",
19
+ "\n",
20
+ "Esta función es llamada un **modelo de regresión**. En este caso las entradas de $\\mathbf{x}$ son llamadas *regresores* y a $\\hat{y}$ se le llama *predicción*. Hay que notar que la regresión es un modelo, nos estamos aproximando a estimar nuestra variable dependiente $y$, algunas veces llamada también *label*, *etiqueta* o *resultado esperado*. "
21
+ ]
22
+ },
23
+ {
24
+ "cell_type": "markdown",
25
+ "metadata": {},
26
+ "source": [
27
+ "Al vector $\\mathbf{\\beta}$ se le denomina el *vector de pesos* mientras que el escalar $v$ es llamado el offset o bias. En conjunto $v$ y $\\beta$ son los parámetros de la regresión. Recordamos que la notación $\\hat{y}$ es usando para enfatizar que es un estimado o prediccción del resultado esperado $y$. "
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "markdown",
32
+ "metadata": {},
33
+ "source": [
34
+ "## 7.1 Notación simplificada de un modelo de regresión. "
35
+ ]
36
+ },
37
+ {
38
+ "cell_type": "markdown",
39
+ "metadata": {},
40
+ "source": [
41
+ "La concatenación de vectores nos puede ayudar a expresar de manera más sencilla la ecuación de regresión. Notemos que podemos definir el $(n+1)$-vector $\\boldsymbol{\\tilde{\\beta}}^{T} = [v\\; \\boldsymbol{\\beta}]$ y de igual forma el $(n+1)$-vector $\\mathbf{\\widetilde{x}}^{T} = [1 \\; \\boldsymbol{x}]$ de manera que:\n",
42
+ "\n",
43
+ "$$\n",
44
+ "\\hat{y} = \\mathbf{x}^{T}\\boldsymbol{\\beta} + v = \\begin{bmatrix}1\\\\ \\mathbf{x}\\end{bmatrix}^{T} \\begin{bmatrix} v\\\\\\boldsymbol{\\beta} \\end{bmatrix} = \\mathbf{\\widetilde{x}}^{T} \\boldsymbol{\\widetilde{\\beta}}\n",
45
+ "$$\n",
46
+ "\n",
47
+ "Por simplicidad algunas veces solamente se escribe $\\hat{y}=\\mathbf{x}^{T}\\boldsymbol{\\beta}$ sobreentendiendo nuestra construcción. "
48
+ ]
49
+ },
50
+ {
51
+ "cell_type": "markdown",
52
+ "metadata": {},
53
+ "source": [
54
+ "## 7.2 Un ejemplo de regresión. "
55
+ ]
56
+ },
57
+ {
58
+ "cell_type": "markdown",
59
+ "metadata": {},
60
+ "source": [
61
+ "Vamos a considerar el siguiente ejemplo donde vamos a analizar una base de datos del *GOLDEN OAK RESEARCH GROUP*. Nuestra variable dependiente serán el ingreso promedio por casa y nuestros regresores serán simplemente la latitud y la longitud. \n",
62
+ "\n",
63
+ "Para poder cargar la base vamos a importar en conjunto a numpy también **pandas** la cual es una biblioteca de manejo y manipulación de bases de datos tomando como bases sus objetos *dataframe*. "
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "code",
68
+ "execution_count": 1,
69
+ "metadata": {},
70
+ "outputs": [],
71
+ "source": [
72
+ "import matplotlib.pyplot as plt # Para poder realizar visualizaciones\n",
73
+ "import pandas as pd # Para poder acceder a pandas\n",
74
+ "import numpy as np # Para poder tener vectores"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "code",
79
+ "execution_count": 2,
80
+ "metadata": {},
81
+ "outputs": [],
82
+ "source": [
83
+ "df = pd.read_csv('income_db_GORG.csv')"
84
+ ]
85
+ },
86
+ {
87
+ "cell_type": "code",
88
+ "execution_count": 10,
89
+ "metadata": {},
90
+ "outputs": [
91
+ {
92
+ "data": {
93
+ "text/html": [
94
+ "<div>\n",
95
+ "<style scoped>\n",
96
+ " .dataframe tbody tr th:only-of-type {\n",
97
+ " vertical-align: middle;\n",
98
+ " }\n",
99
+ "\n",
100
+ " .dataframe tbody tr th {\n",
101
+ " vertical-align: top;\n",
102
+ " }\n",
103
+ "\n",
104
+ " .dataframe thead th {\n",
105
+ " text-align: right;\n",
106
+ " }\n",
107
+ "</style>\n",
108
+ "<table border=\"1\" class=\"dataframe\">\n",
109
+ " <thead>\n",
110
+ " <tr style=\"text-align: right;\">\n",
111
+ " <th></th>\n",
112
+ " <th>id</th>\n",
113
+ " <th>State_Code</th>\n",
114
+ " <th>State_Name</th>\n",
115
+ " <th>State_ab</th>\n",
116
+ " <th>County</th>\n",
117
+ " <th>City</th>\n",
118
+ " <th>Place</th>\n",
119
+ " <th>Type</th>\n",
120
+ " <th>Primary</th>\n",
121
+ " <th>Zip_Code</th>\n",
122
+ " <th>Area_Code</th>\n",
123
+ " <th>ALand</th>\n",
124
+ " <th>AWater</th>\n",
125
+ " <th>Lat</th>\n",
126
+ " <th>Lon</th>\n",
127
+ " <th>Mean</th>\n",
128
+ " <th>Median</th>\n",
129
+ " <th>Stdev</th>\n",
130
+ " <th>sum_w</th>\n",
131
+ " </tr>\n",
132
+ " </thead>\n",
133
+ " <tbody>\n",
134
+ " <tr>\n",
135
+ " <th>0</th>\n",
136
+ " <td>1011000</td>\n",
137
+ " <td>1</td>\n",
138
+ " <td>Alabama</td>\n",
139
+ " <td>AL</td>\n",
140
+ " <td>Mobile County</td>\n",
141
+ " <td>Chickasaw</td>\n",
142
+ " <td>Chickasaw city</td>\n",
143
+ " <td>City</td>\n",
144
+ " <td>place</td>\n",
145
+ " <td>36611</td>\n",
146
+ " <td>251</td>\n",
147
+ " <td>10894952</td>\n",
148
+ " <td>909156</td>\n",
149
+ " <td>30.771450</td>\n",
150
+ " <td>-88.079697</td>\n",
151
+ " <td>38773</td>\n",
152
+ " <td>30506</td>\n",
153
+ " <td>33101</td>\n",
154
+ " <td>1638.260513</td>\n",
155
+ " </tr>\n",
156
+ " <tr>\n",
157
+ " <th>1</th>\n",
158
+ " <td>1011010</td>\n",
159
+ " <td>1</td>\n",
160
+ " <td>Alabama</td>\n",
161
+ " <td>AL</td>\n",
162
+ " <td>Barbour County</td>\n",
163
+ " <td>Louisville</td>\n",
164
+ " <td>Clio city</td>\n",
165
+ " <td>City</td>\n",
166
+ " <td>place</td>\n",
167
+ " <td>36048</td>\n",
168
+ " <td>334</td>\n",
169
+ " <td>26070325</td>\n",
170
+ " <td>23254</td>\n",
171
+ " <td>31.708516</td>\n",
172
+ " <td>-85.611039</td>\n",
173
+ " <td>37725</td>\n",
174
+ " <td>19528</td>\n",
175
+ " <td>43789</td>\n",
176
+ " <td>258.017685</td>\n",
177
+ " </tr>\n",
178
+ " <tr>\n",
179
+ " <th>2</th>\n",
180
+ " <td>1011020</td>\n",
181
+ " <td>1</td>\n",
182
+ " <td>Alabama</td>\n",
183
+ " <td>AL</td>\n",
184
+ " <td>Shelby County</td>\n",
185
+ " <td>Columbiana</td>\n",
186
+ " <td>Columbiana city</td>\n",
187
+ " <td>City</td>\n",
188
+ " <td>place</td>\n",
189
+ " <td>35051</td>\n",
190
+ " <td>205</td>\n",
191
+ " <td>44835274</td>\n",
192
+ " <td>261034</td>\n",
193
+ " <td>33.191452</td>\n",
194
+ " <td>-86.615618</td>\n",
195
+ " <td>54606</td>\n",
196
+ " <td>31930</td>\n",
197
+ " <td>57348</td>\n",
198
+ " <td>926.031000</td>\n",
199
+ " </tr>\n",
200
+ " <tr>\n",
201
+ " <th>3</th>\n",
202
+ " <td>1011030</td>\n",
203
+ " <td>1</td>\n",
204
+ " <td>Alabama</td>\n",
205
+ " <td>AL</td>\n",
206
+ " <td>Mobile County</td>\n",
207
+ " <td>Satsuma</td>\n",
208
+ " <td>Creola city</td>\n",
209
+ " <td>City</td>\n",
210
+ " <td>place</td>\n",
211
+ " <td>36572</td>\n",
212
+ " <td>251</td>\n",
213
+ " <td>36878729</td>\n",
214
+ " <td>2374530</td>\n",
215
+ " <td>30.874343</td>\n",
216
+ " <td>-88.009442</td>\n",
217
+ " <td>63919</td>\n",
218
+ " <td>52814</td>\n",
219
+ " <td>47707</td>\n",
220
+ " <td>378.114619</td>\n",
221
+ " </tr>\n",
222
+ " <tr>\n",
223
+ " <th>4</th>\n",
224
+ " <td>1011040</td>\n",
225
+ " <td>1</td>\n",
226
+ " <td>Alabama</td>\n",
227
+ " <td>AL</td>\n",
228
+ " <td>Mobile County</td>\n",
229
+ " <td>Dauphin Island</td>\n",
230
+ " <td>Dauphin Island</td>\n",
231
+ " <td>Town</td>\n",
232
+ " <td>place</td>\n",
233
+ " <td>36528</td>\n",
234
+ " <td>251</td>\n",
235
+ " <td>16204185</td>\n",
236
+ " <td>413605152</td>\n",
237
+ " <td>30.250913</td>\n",
238
+ " <td>-88.171268</td>\n",
239
+ " <td>77948</td>\n",
240
+ " <td>67225</td>\n",
241
+ " <td>54270</td>\n",
242
+ " <td>282.320328</td>\n",
243
+ " </tr>\n",
244
+ " </tbody>\n",
245
+ "</table>\n",
246
+ "</div>"
247
+ ],
248
+ "text/plain": [
249
+ " id State_Code State_Name State_ab County City \\\n",
250
+ "0 1011000 1 Alabama AL Mobile County Chickasaw \n",
251
+ "1 1011010 1 Alabama AL Barbour County Louisville \n",
252
+ "2 1011020 1 Alabama AL Shelby County Columbiana \n",
253
+ "3 1011030 1 Alabama AL Mobile County Satsuma \n",
254
+ "4 1011040 1 Alabama AL Mobile County Dauphin Island \n",
255
+ "\n",
256
+ " Place Type Primary Zip_Code Area_Code ALand AWater \\\n",
257
+ "0 Chickasaw city City place 36611 251 10894952 909156 \n",
258
+ "1 Clio city City place 36048 334 26070325 23254 \n",
259
+ "2 Columbiana city City place 35051 205 44835274 261034 \n",
260
+ "3 Creola city City place 36572 251 36878729 2374530 \n",
261
+ "4 Dauphin Island Town place 36528 251 16204185 413605152 \n",
262
+ "\n",
263
+ " Lat Lon Mean Median Stdev sum_w \n",
264
+ "0 30.771450 -88.079697 38773 30506 33101 1638.260513 \n",
265
+ "1 31.708516 -85.611039 37725 19528 43789 258.017685 \n",
266
+ "2 33.191452 -86.615618 54606 31930 57348 926.031000 \n",
267
+ "3 30.874343 -88.009442 63919 52814 47707 378.114619 \n",
268
+ "4 30.250913 -88.171268 77948 67225 54270 282.320328 "
269
+ ]
270
+ },
271
+ "execution_count": 10,
272
+ "metadata": {},
273
+ "output_type": "execute_result"
274
+ }
275
+ ],
276
+ "source": [
277
+ "df.head()"
278
+ ]
279
+ },
280
+ {
281
+ "cell_type": "markdown",
282
+ "metadata": {},
283
+ "source": [
284
+ "¿Qué data contiene la base de datos?"
285
+ ]
286
+ },
287
+ {
288
+ "cell_type": "markdown",
289
+ "metadata": {},
290
+ "source": [
291
+ "¿Qué tamaño tiene?"
292
+ ]
293
+ },
294
+ {
295
+ "cell_type": "code",
296
+ "execution_count": 11,
297
+ "metadata": {},
298
+ "outputs": [
299
+ {
300
+ "data": {
301
+ "text/plain": [
302
+ "617994"
303
+ ]
304
+ },
305
+ "execution_count": 11,
306
+ "metadata": {},
307
+ "output_type": "execute_result"
308
+ }
309
+ ],
310
+ "source": [
311
+ "len(df)*len(df.columns)"
312
+ ]
313
+ },
314
+ {
315
+ "cell_type": "code",
316
+ "execution_count": 12,
317
+ "metadata": {},
318
+ "outputs": [
319
+ {
320
+ "data": {
321
+ "text/plain": [
322
+ "32526"
323
+ ]
324
+ },
325
+ "execution_count": 12,
326
+ "metadata": {},
327
+ "output_type": "execute_result"
328
+ }
329
+ ],
330
+ "source": [
331
+ "len(df)"
332
+ ]
333
+ },
334
+ {
335
+ "cell_type": "markdown",
336
+ "metadata": {},
337
+ "source": [
338
+ "Ahora bien, como comenté nuestros regresores en términos de columnas son:\n",
339
+ "* Lat\n",
340
+ "* Lon\n",
341
+ "\n",
342
+ "Mientras que nuestra variable dependiente es:\n",
343
+ "* Mean "
344
+ ]
345
+ },
346
+ {
347
+ "cell_type": "markdown",
348
+ "metadata": {},
349
+ "source": [
350
+ "Ahora, calcular el vector predicciones $\\hat{y}$ ya que cada valor de Lat y Lon tendrá asociado un valor de Mean y es justo el que queremos aproximar con $\\hat{y}$. Ahora, como no forma parte de este curso ya tenemos unos parámetros dados:\n",
351
+ "\n",
352
+ "$$\n",
353
+ "v = 30980.48, \\qquad \\boldsymbol{\\beta} = \\begin{bmatrix}744.83 \\\\ -83.45\\end{bmatrix}\n",
354
+ "$$\n",
355
+ "\n",
356
+ "Con lo cual ya podemos realizar las predicciones $\\hat{y}_{i} = \\mathbf{x}^{T}_{i} \\boldsymbol{\\beta} + v$"
357
+ ]
358
+ },
359
+ {
360
+ "cell_type": "code",
361
+ "execution_count": 13,
362
+ "metadata": {},
363
+ "outputs": [],
364
+ "source": [
365
+ "def pred(x):\n",
366
+ " beta = np.array([744.83,-83.45])\n",
367
+ " v = 30980.48\n",
368
+ " return x@beta + v"
369
+ ]
370
+ },
371
+ {
372
+ "cell_type": "code",
373
+ "execution_count": 18,
374
+ "metadata": {},
375
+ "outputs": [
376
+ {
377
+ "data": {
378
+ "text/plain": [
379
+ "numpy.ndarray"
380
+ ]
381
+ },
382
+ "execution_count": 18,
383
+ "metadata": {},
384
+ "output_type": "execute_result"
385
+ }
386
+ ],
387
+ "source": [
388
+ "type(df['Lat'].values)"
389
+ ]
390
+ },
391
+ {
392
+ "cell_type": "code",
393
+ "execution_count": 25,
394
+ "metadata": {},
395
+ "outputs": [],
396
+ "source": [
397
+ "X = df[['Lat','Lon']].values"
398
+ ]
399
+ },
400
+ {
401
+ "cell_type": "code",
402
+ "execution_count": 26,
403
+ "metadata": {},
404
+ "outputs": [],
405
+ "source": [
406
+ "Y_hat = pred(X)"
407
+ ]
408
+ },
409
+ {
410
+ "cell_type": "code",
411
+ "execution_count": 31,
412
+ "metadata": {},
413
+ "outputs": [],
414
+ "source": [
415
+ "Y = df['Mean'].values"
416
+ ]
417
+ },
418
+ {
419
+ "cell_type": "code",
420
+ "execution_count": 32,
421
+ "metadata": {},
422
+ "outputs": [
423
+ {
424
+ "data": {
425
+ "image/png": "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\n",
426
+ "text/plain": [
427
+ "<Figure size 840x840 with 1 Axes>"
428
+ ]
429
+ },
430
+ "metadata": {
431
+ "needs_background": "light"
432
+ },
433
+ "output_type": "display_data"
434
+ }
435
+ ],
436
+ "source": [
437
+ "fig, ax = plt.subplots(1,1,figsize=(7,7),dpi=120)\n",
438
+ "\n",
439
+ "ax.scatter(Y_hat,Y,marker ='o',color='red')\n",
440
+ "ax.plot(Y,Y,ls='--')\n",
441
+ "plt.show()"
442
+ ]
443
+ },
444
+ {
445
+ "cell_type": "markdown",
446
+ "metadata": {},
447
+ "source": [
448
+ "¿Cómo calculamos el error?"
449
+ ]
450
+ },
451
+ {
452
+ "cell_type": "markdown",
453
+ "metadata": {},
454
+ "source": [
455
+ "## 7.3 Ejercicio. \n",
456
+ "\n",
457
+ "Considera que ya no solamente usamos Lat y Lon como regresores sino también comenzamos a usar Zip_Code como regresor, ajustar ese modelo nos deja con los siguientes parámetros:\n",
458
+ "$$\n",
459
+ "v = 4152.02, \\qquad \\boldsymbol{\\beta} = \\begin{bmatrix}6.55490348e+02 \\\\ 5.75918372e+02 \\\\ -2.94216316e-01\\end{bmatrix}\n",
460
+ "$$\n",
461
+ "\n",
462
+ "¿Mejora la preducción al introducir un nuevo regresor?"
463
+ ]
464
+ }
465
+ ],
466
+ "metadata": {
467
+ "kernelspec": {
468
+ "display_name": "Python 3",
469
+ "language": "python",
470
+ "name": "python3"
471
+ },
472
+ "language_info": {
473
+ "codemirror_mode": {
474
+ "name": "ipython",
475
+ "version": 3
476
+ },
477
+ "file_extension": ".py",
478
+ "mimetype": "text/x-python",
479
+ "name": "python",
480
+ "nbconvert_exporter": "python",
481
+ "pygments_lexer": "ipython3",
482
+ "version": "3.7.3"
483
+ }
484
+ },
485
+ "nbformat": 4,
486
+ "nbformat_minor": 4
487
+ }
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Lecturas recomendadas.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ https://colab.research.google.com/drive/1pg6fxVEmEDlpou3JbEtnlZzcVckPGS8F?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Propiedades y Cálculo de la Norma de Vectores.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3ad6650957a636a9329ffa037a876b8d5b659bf54dd4842d15677757aa05c8ec
3
+ size 140716199
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Propiedades y Cálculo de la Norma de Vectores.vtt ADDED
@@ -0,0 +1,763 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:03.120 --> 00:00:07.460
4
+ Hola. Hasta el momento hemos aprendido bastante. Sabemos
5
+
6
+ 00:00:07.520 --> 00:00:09.920
7
+ cómo interactúan los vectores entre ellos y cómo
8
+
9
+ 00:00:09.920 --> 00:00:12.799
10
+ operar entre vectores, sabemos hacer sumas y producto
11
+
12
+ 00:00:12.799 --> 00:00:16.795
13
+ punto. También sabemos cómo multiplicar escalares con vectores,
14
+
15
+ 00:00:17.095 --> 00:00:20.135
16
+ y sabemos que los vectores escalan, es decir,
17
+
18
+ 00:00:20.135 --> 00:00:21.895
19
+ se hacen más grandes o se hacen más
20
+
21
+ 00:00:21.895 --> 00:00:27.270
22
+ pequeños, e incluso cambian de sentido. También hemos
23
+
24
+ 00:00:27.270 --> 00:00:30.470
25
+ aprendido cómo interactúan los vectores con funciones, y
26
+
27
+ 00:00:30.470 --> 00:00:33.190
28
+ hemos aprendido cómo utilizar los vectores para poder
29
+
30
+ 00:00:33.190 --> 00:00:36.489
31
+ hacer regresiones lineales. E incluso, a este momento
32
+
33
+ 00:00:36.550 --> 00:00:38.870
34
+ ya hemos realizado un modelo muy básico y
35
+
36
+ 00:00:38.870 --> 00:00:41.934
37
+ rudimentario, pero ya hicimos un primer modelo de
38
+
39
+ 00:00:41.934 --> 00:00:45.215
40
+ análisis de sentimientos, utilizando únicamente lo que has
41
+
42
+ 00:00:45.215 --> 00:00:49.135
43
+ aprendido hasta estas clases. Hasta este momento, hemos
44
+
45
+ 00:00:49.135 --> 00:00:51.535
46
+ utilizado algunas palabras para los vectores que no
47
+
48
+ 00:00:51.535 --> 00:00:54.260
49
+ he definido, como la magnitud, como tampoco he
50
+
51
+ 00:00:54.260 --> 00:00:57.379
52
+ definido el sentido ni la orientación. El sentido
53
+
54
+ 00:00:57.379 --> 00:01:00.659
55
+ quedó muy claro cuando utilizamos la multiplicación con
56
+
57
+ 00:01:00.659 --> 00:01:03.699
58
+ escalares, donde vimos que se invertía el sentido,
59
+
60
+ 00:01:03.699 --> 00:01:08.024
61
+ hacia dónde apuntaba la flecha. En este caso,
62
+
63
+ 00:01:09.045 --> 00:01:13.284
64
+ vamos a tratar la magnitud, y entonces, con
65
+
66
+ 00:01:13.284 --> 00:01:16.164
67
+ la magnitud vamos a introducir el concepto de
68
+
69
+ 00:01:16.164 --> 00:01:19.204
70
+ la norma para después poder introducir el concepto
71
+
72
+ 00:01:19.204 --> 00:01:22.979
73
+ de la distancia entre vectores. Sin más, vamos
74
+
75
+ 00:01:22.979 --> 00:01:27.140
76
+ a la computadora. Ahora, en esta clase tenemos
77
+
78
+ 00:01:27.140 --> 00:01:29.780
79
+ un notebook nuevo. Como siempre, no te preocupes,
80
+
81
+ 00:01:29.780 --> 00:01:31.539
82
+ este notebook va a estar disponible para ti
83
+
84
+ 00:01:31.539 --> 00:01:34.805
85
+ los recursos. Lo que vamos a empezar definiendo
86
+
87
+ 00:01:34.865 --> 00:01:37.745
88
+ es una nueva operación para los vectores. Esta
89
+
90
+ 00:01:37.745 --> 00:01:40.225
91
+ operación se va a llamar norma, y la
92
+
93
+ 00:01:40.225 --> 00:01:41.665
94
+ norma lo que nos va a dar es
95
+
96
+ 00:01:41.665 --> 00:01:44.805
97
+ la longitud del vector, la magnitud que tiene.
98
+
99
+ 00:01:45.585 --> 00:01:49.170
100
+ En este caso, nosotros vamos a partir de
101
+
102
+ 00:01:49.170 --> 00:01:52.790
103
+ la norma euclidiana, así se denomina esta operación,
104
+
105
+ 00:01:53.050 --> 00:01:55.250
106
+ y eso se debe a que es la
107
+
108
+ 00:01:55.250 --> 00:01:57.410
109
+ forma en la que se sienta en los
110
+
111
+ 00:01:57.410 --> 00:02:00.230
112
+ tratados de Euclides cómo se mide la distancia.
113
+
114
+ 00:02:02.095 --> 00:02:05.455
115
+ Ahora, la anotación de la norma de un
116
+
117
+ 00:02:05.455 --> 00:02:07.715
118
+ vector se va a denotar por dos barritas,
119
+
120
+ 00:02:08.294 --> 00:02:11.135
121
+ un dos a cada lado. Esto va a
122
+
123
+ 00:02:11.135 --> 00:02:13.440
124
+ denotar que es la norma de un vector.
125
+
126
+ 00:02:13.680 --> 00:02:16.160
127
+ Cuando sea solamente una barra simple a cada
128
+
129
+ 00:02:16.160 --> 00:02:19.440
130
+ lado, estaremos hablando del valor absoluto. En el
131
+
132
+ 00:02:19.440 --> 00:02:21.120
133
+ caso de la norma del vector, vamos a
134
+
135
+ 00:02:21.120 --> 00:02:23.200
136
+ definir la norma como la suma de los
137
+
138
+ 00:02:23.200 --> 00:02:26.915
139
+ cuadrados de sus elementos. O lo podemos definir
140
+
141
+ 00:02:26.975 --> 00:02:29.955
142
+ también, si recuerdan esta operación de aquí al
143
+
144
+ 00:02:30.255 --> 00:02:33.455
145
+ centro, sin la raíz cuadrada, es el producto
146
+
147
+ 00:02:33.455 --> 00:02:37.935
148
+ punto entre XYX, entonces podemos definirlo como x
149
+
150
+ 00:02:37.935 --> 00:02:41.315
151
+ traspuesta por x y la raíz de eso.
152
+
153
+ 00:02:41.640 --> 00:02:44.360
154
+ Recordemos que esto nos da un escalar, entonces
155
+
156
+ 00:02:44.360 --> 00:02:46.459
157
+ estaríamos hablando de la raíz de un número.
158
+
159
+ 00:02:46.599 --> 00:02:51.099
160
+ Por ejemplo, vamos a empezar con un nvector,
161
+
162
+ 00:02:51.640 --> 00:02:53.400
163
+ en este caso un tres vector, y que
164
+
165
+ 00:02:53.400 --> 00:02:55.400
166
+ ese tres vector sea el uno coma dos
167
+
168
+ 00:02:55.400 --> 00:02:59.345
169
+ coma tres. La magnitud de este vector será
170
+
171
+ 00:02:59.345 --> 00:03:02.305
172
+ entonces uno al cuadrado más dos al cuadrado
173
+
174
+ 00:03:02.305 --> 00:03:04.305
175
+ más tres al cuadrado, que es catorce al
176
+
177
+ 00:03:04.305 --> 00:03:07.505
178
+ cuadrado, y eso aproximadamente es tres punto setenta
179
+
180
+ 00:03:07.505 --> 00:03:13.380
181
+ y cuatro. Vamos con otro ejemplo. Empecemos con
182
+
183
+ 00:03:13.380 --> 00:03:16.820
184
+ el vector, el tres vector dos coma menos
185
+
186
+ 00:03:16.820 --> 00:03:19.620
187
+ uno coma dos. La magnitud de ese vector
188
+
189
+ 00:03:19.620 --> 00:03:23.860
190
+ será entonces dos al cuadrado más menos uno
191
+
192
+ 00:03:23.860 --> 00:03:28.565
193
+ al cuadrado más dos al cuadrado. Esto me
194
+
195
+ 00:03:28.565 --> 00:03:31.205
196
+ da un cuatro aquí, un cuatro aquí, esto
197
+
198
+ 00:03:31.205 --> 00:03:33.444
199
+ es un ocho, y uno al cuadrado es
200
+
201
+ 00:03:33.444 --> 00:03:36.185
202
+ uno, entonces me da un nueve, y tengo
203
+
204
+ 00:03:36.245 --> 00:03:39.065
205
+ raíz de nueve, raíz de nueve es tres.
206
+
207
+ 00:03:42.000 --> 00:03:46.560
208
+ Una cosa muy importante es que puedes llegar
209
+
210
+ 00:03:46.560 --> 00:03:51.440
211
+ al resultado de tres siendo tres negativo o
212
+
213
+ 00:03:51.440 --> 00:03:54.739
214
+ positivo. Si tú elevas tres negativo al cuadrado,
215
+
216
+ 00:03:55.195 --> 00:03:59.055
217
+ vas a obtener un número positivo. Si elevas
218
+
219
+ 00:03:59.275 --> 00:04:03.295
220
+ tres obtendrías nueve positivo. Si elevas tres positivo
221
+
222
+ 00:04:03.355 --> 00:04:06.020
223
+ al cuadrado, también obtendrías nueve. Entonces, una restricción
224
+
225
+ 00:04:06.020 --> 00:04:06.087
226
+ que vamos a tener, y que lo vamos
227
+
228
+ 00:04:06.087 --> 00:04:06.155
229
+ a ver dentro de las propiedades de la
230
+
231
+ 00:04:06.155 --> 00:04:09.193
232
+ norma, es una restricción que vamos a tener
233
+
234
+ 00:04:09.193 --> 00:04:10.080
235
+ y que lo vamos a ver dentro de
236
+
237
+ 00:04:10.080 --> 00:04:10.966
238
+ las propiedades de la norma, es que vamos
239
+
240
+ 00:04:10.966 --> 00:04:12.480
241
+ a elegir siempre la raíz positiva. Ahora, vamos
242
+
243
+ 00:04:12.480 --> 00:04:13.076
244
+ a ver las propiedades de la norma. Como
245
+
246
+ 00:04:13.076 --> 00:04:22.035
247
+ todas las operaciones que hemos trabajado hasta ahora,
248
+
249
+ 00:04:22.035 --> 00:04:24.035
250
+ la norma también va a cumplir una serie
251
+
252
+ 00:04:24.035 --> 00:04:26.354
253
+ de propiedades, y en este caso vamos a
254
+
255
+ 00:04:26.354 --> 00:04:29.395
256
+ definir dos vectores XYY, vamos a definirlos como
257
+
258
+ 00:04:29.395 --> 00:04:31.715
259
+ n vectores, y vamos a definir también a
260
+
261
+ 00:04:31.715 --> 00:04:35.070
262
+ beta como un escalar cualquiera. Las propiedades que
263
+
264
+ 00:04:35.070 --> 00:04:38.130
265
+ compran la norma son las siguientes, la homogeneidad
266
+
267
+ 00:04:38.830 --> 00:04:42.510
268
+ no negativa, eso quiere decir que yo puedo
269
+
270
+ 00:04:42.510 --> 00:04:46.290
271
+ separar, puedo sacar este beta de la norma,
272
+
273
+ 00:04:47.325 --> 00:04:49.905
274
+ pero va a salir como un escalar positivo.
275
+
276
+ 00:04:52.045 --> 00:04:55.325
277
+ No importa si aquí adentro era menos uno
278
+
279
+ 00:04:55.325 --> 00:04:57.805
280
+ o uno, va a salir siempre como el
281
+
282
+ 00:04:57.805 --> 00:05:01.980
283
+ valor absoluto de ese valor. Luego, tenemos que
284
+
285
+ 00:05:01.980 --> 00:05:06.060
286
+ también este cumpla la desigualdad del triángulo. Esto
287
+
288
+ 00:05:06.060 --> 00:05:09.600
289
+ significa que cuando nosotros sumamos un vector XYY,
290
+
291
+ 00:05:09.740 --> 00:05:12.800
292
+ la magnitud de XYY es a lo más
293
+
294
+ 00:05:12.940 --> 00:05:17.845
295
+ la suma de las magnitudes individuales. Y cumple
296
+
297
+ 00:05:17.845 --> 00:05:21.045
298
+ con el criterio de la no negatividad, y
299
+
300
+ 00:05:21.045 --> 00:05:24.025
301
+ es que el valor de una magnitud siempre
302
+
303
+ 00:05:24.165 --> 00:05:26.265
304
+ va a ser mayor o igual que cero,
305
+
306
+ 00:05:26.645 --> 00:05:30.025
307
+ y solamente va a ser cero si solamente
308
+
309
+ 00:05:30.085 --> 00:05:33.560
310
+ si x es igual al vector cero, al
311
+
312
+ 00:05:33.560 --> 00:05:39.900
313
+ nvector cero. Ahora, la norma es ampliamente usada,
314
+
315
+ 00:05:39.960 --> 00:05:43.775
316
+ en particular podemos señalar estos ejemplos. El valor
317
+
318
+ 00:05:43.775 --> 00:05:48.195
319
+ cuadrático medio, que se define como sigue. RMS
320
+
321
+ 00:05:48.655 --> 00:05:51.135
322
+ es por sus siglas en inglés Root Min
323
+
324
+ 00:05:51.135 --> 00:05:54.575
325
+ Square. Le metemos un vector, le damos de
326
+
327
+ 00:05:54.575 --> 00:05:56.940
328
+ comer a esta función un vector y va
329
+
330
+ 00:05:56.940 --> 00:05:59.900
331
+ a sumar el cuadrado de las componentes del
332
+
333
+ 00:05:59.900 --> 00:06:03.100
334
+ vector y lo va a dividir entre la
335
+
336
+ 00:06:03.100 --> 00:06:06.700
337
+ longitud entre la dimensión del vector. Lo podemos
338
+
339
+ 00:06:06.700 --> 00:06:11.745
340
+ expresar de manera más comprimida así. Otro también
341
+
342
+ 00:06:11.885 --> 00:06:13.645
343
+ es la norma de la suma de dos
344
+
345
+ 00:06:13.645 --> 00:06:18.765
346
+ vectores. Si tenemos dos vectores XYY, entonces decimos
347
+
348
+ 00:06:18.765 --> 00:06:20.525
349
+ que la norma de la suma de esos
350
+
351
+ 00:06:20.525 --> 00:06:23.570
352
+ vectores se puede expresar como sigue. La norma
353
+
354
+ 00:06:23.570 --> 00:06:26.250
355
+ de x más y será igual a x
356
+
357
+ 00:06:26.250 --> 00:06:31.470
358
+ cuadrada más dos x traspuesta por y más
359
+
360
+ 00:06:31.610 --> 00:06:34.190
361
+ dos veces la norma de y al cuadrado.
362
+
363
+ 00:06:34.890 --> 00:06:37.845
364
+ Este te lo voy a dejar como ejercicio
365
+
366
+ 00:06:38.065 --> 00:06:41.185
367
+ para que lo demuestres. Demostrar esta propiedad no
368
+
369
+ 00:06:41.185 --> 00:06:44.465
370
+ es trivial, pero con un poco de ejercicio
371
+
372
+ 00:06:44.465 --> 00:06:46.405
373
+ y un poco de intentos verás que lo
374
+
375
+ 00:06:46.785 --> 00:06:50.259
376
+ podrás lograr. Y por último, una norma interesante
377
+
378
+ 00:06:50.479 --> 00:06:52.580
379
+ es la norma de un bloque de vectores.
380
+
381
+ 00:06:53.039 --> 00:06:55.280
382
+ Como hemos visto, los bloques de vectores los
383
+
384
+ 00:06:55.280 --> 00:06:58.720
385
+ hemos utilizado hasta ahora. Poder obtener también la
386
+
387
+ 00:06:58.720 --> 00:07:00.879
388
+ norma o la magnitud de un bloque de
389
+
390
+ 00:07:00.879 --> 00:07:04.285
391
+ vectores será algo muy importante hacia el futuro,
392
+
393
+ 00:07:05.225 --> 00:07:08.985
394
+ y resulta que la norma del bloque de
395
+
396
+ 00:07:08.985 --> 00:07:12.025
397
+ vectores, si consideramos que tenemos, por ejemplo, d
398
+
399
+ 00:07:12.025 --> 00:07:14.985
400
+ un k vector con componentes de I, donde
401
+
402
+ 00:07:14.985 --> 00:07:18.330
403
+ las componentes son n vectores, tendremos que la
404
+
405
+ 00:07:18.330 --> 00:07:21.450
406
+ norma del d vector de del d k
407
+
408
+ 00:07:21.450 --> 00:07:25.450
409
+ vector será el cuadrado de la suma de
410
+
411
+ 00:07:25.450 --> 00:07:28.110
412
+ las normas de cada una de las componentes.
413
+
414
+ 00:07:29.770 --> 00:07:33.345
415
+ Ahora, vamos a poner un ejemplo concreto. Vamos
416
+
417
+ 00:07:33.345 --> 00:07:35.585
418
+ a ir otra vez hacia Geogebra y vamos
419
+
420
+ 00:07:35.585 --> 00:07:38.545
421
+ a dibujar un vector. Supongamos que tenemos el
422
+
423
+ 00:07:38.545 --> 00:07:45.905
424
+ vector uno coma uno. La longitud que este
425
+
426
+ 00:07:45.905 --> 00:07:50.080
427
+ vector tendría, según lo que vimos, es uno
428
+
429
+ 00:07:50.080 --> 00:07:53.200
430
+ al cuadrado más uno al cuadrado. Eso nos
431
+
432
+ 00:07:53.200 --> 00:07:55.780
433
+ da dos y la longitud de este vector
434
+
435
+ 00:07:56.000 --> 00:07:59.460
436
+ es raíz de dos. Si esto es cierto,
437
+
438
+ 00:07:59.865 --> 00:08:03.505
439
+ eso significa que si nosotros multiplicamos este por
440
+
441
+ 00:08:03.505 --> 00:08:09.065
442
+ un escalar, supongamos que es un escalar de
443
+
444
+ 00:08:09.065 --> 00:08:11.885
445
+ dos, por ejemplo, lo que deberíamos de obtener
446
+
447
+ 00:08:12.345 --> 00:08:16.229
448
+ es que obtenemos una magnitud de dos. Entonces,
449
+
450
+ 00:08:16.449 --> 00:08:18.770
451
+ vamos a poner el u vector y vamos
452
+
453
+ 00:08:18.770 --> 00:08:25.810
454
+ a multiplicarlo por dos. Y ahora vamos a
455
+
456
+ 00:08:25.810 --> 00:08:29.969
457
+ calcular la norma de este vector. Regresemos a
458
+
459
+ 00:08:29.969 --> 00:08:37.534
460
+ Python. Entonces, vamos a empezar expresando los vectores
461
+
462
+ 00:08:37.534 --> 00:08:40.255
463
+ aquí en Python. Vamos a empezar con el
464
+
465
+ 00:08:40.255 --> 00:08:43.714
466
+ import numpy as np, como siempre lo hacemos,
467
+
468
+ 00:08:44.010 --> 00:08:47.290
469
+ y vamos a declarar nuestro vector u. U
470
+
471
+ 00:08:47.290 --> 00:08:54.670
472
+ es igual a np, array uno coma uno.
473
+
474
+ 00:08:55.850 --> 00:08:59.005
475
+ Ahora, vamos a comprobar esas propiedades para poder
476
+
477
+ 00:08:59.005 --> 00:09:02.685
478
+ llegar al resultado que obtuvimos desde Geogebra. Si
479
+
480
+ 00:09:02.685 --> 00:09:08.065
481
+ nosotros multiplicamos Antes de eso, hay que desarrollar,
482
+
483
+ 00:09:08.125 --> 00:09:11.185
484
+ por cierto, una función para poder calcular esto
485
+
486
+ 00:09:11.270 --> 00:09:14.810
487
+ y de hecho nuestra función está aquí. Entonces,
488
+
489
+ 00:09:15.350 --> 00:09:17.830
490
+ fíjense lo que haremos, vamos a hacer def
491
+
492
+ 00:09:17.830 --> 00:09:19.910
493
+ y vamos a sacar una función que se
494
+
495
+ 00:09:19.910 --> 00:09:22.710
496
+ llame norma, y norma va a consumir un
497
+
498
+ 00:09:22.710 --> 00:09:25.610
499
+ vector x, y lo que vamos a regresar
500
+
501
+ 00:09:28.085 --> 00:09:33.125
502
+ va a ser exactamente x por x, porque
503
+
504
+ 00:09:33.125 --> 00:09:34.485
505
+ sabemos que eso nos va a dar la
506
+
507
+ 00:09:34.485 --> 00:09:38.245
508
+ suma de los cuadrados, pero necesitamos ahora sacar
509
+
510
+ 00:09:38.245 --> 00:09:41.190
511
+ la raíz. NumPy también tiene una función para
512
+
513
+ 00:09:41.190 --> 00:09:46.090
514
+ eso y es n p.sqrt por squirt. Así,
515
+
516
+ 00:09:50.150 --> 00:09:53.610
517
+ pues, veamos qué nos da la norma de
518
+
519
+ 00:09:54.315 --> 00:10:01.355
520
+ La norma du es uno punto cuarenta y
521
+
522
+ 00:10:01.355 --> 00:10:04.015
523
+ uno. Vamos a ver cuánto es n p
524
+
525
+ 00:10:04.395 --> 00:10:10.060
526
+ dot square de dos. Es exactamente esto, entonces
527
+
528
+ 00:10:10.060 --> 00:10:12.140
529
+ obtenemos que la norma de u es la
530
+
531
+ 00:10:12.140 --> 00:10:15.980
532
+ raíz de dos. Veamos qué pasa si nosotros
533
+
534
+ 00:10:15.980 --> 00:10:19.660
535
+ escalamos esto. Según la propiedad de homogeneidad no
536
+
537
+ 00:10:19.660 --> 00:10:26.005
538
+ negativa, si nosotros multiplicamos esto, nosotros deberíamos de
539
+
540
+ 00:10:26.005 --> 00:10:34.580
541
+ obtener la siguiente norma, norma de u, y
542
+
543
+ 00:10:34.580 --> 00:10:38.420
544
+ lo multiplicaremos por dos aquí, nos da dos
545
+
546
+ 00:10:38.420 --> 00:10:44.180
547
+ punto ochenta y cuatro. Si nosotros calculamos, en
548
+
549
+ 00:10:44.180 --> 00:10:47.465
550
+ este caso, a mano, la norma de dos
551
+
552
+ 00:10:47.465 --> 00:10:54.745
553
+ veces u, obtendremos lo siguiente. Sabemos que u
554
+
555
+ 00:10:54.745 --> 00:11:04.490
556
+ transpuesto es igual al vector uno coma uno.
557
+
558
+ 00:11:07.750 --> 00:11:18.325
559
+ Entonces, la norma será vamos a multiplicar de
560
+
561
+ 00:11:18.325 --> 00:11:21.045
562
+ una vez el dos aquí, eso significa que
563
+
564
+ 00:11:21.045 --> 00:11:23.465
565
+ tenemos aquí un dos y aquí un dos.
566
+
567
+ 00:11:24.485 --> 00:11:30.910
568
+ La norma de dos veces u, dos veces
569
+
570
+ 00:11:32.329 --> 00:11:39.389
571
+ u será igual a el squirt, la raíz,
572
+
573
+ 00:11:51.235 --> 00:11:54.115
574
+ de este vector en componentes que tenemos dos
575
+
576
+ 00:11:54.115 --> 00:12:00.980
577
+ al cuadrado más dos al cuadrado. Esto de
578
+
579
+ 00:12:00.980 --> 00:12:22.185
580
+ aquí nos da igual a Dos al cuadrado
581
+
582
+ 00:12:22.325 --> 00:12:24.885
583
+ es cuatro, y esto nos da dos veces
584
+
585
+ 00:12:24.885 --> 00:12:27.770
586
+ cuatro, que sería ocho, la raíz de ocho.
587
+
588
+ 00:12:28.150 --> 00:12:30.550
589
+ Vamos a comprobar cuánto es la raíz de
590
+
591
+ 00:12:30.550 --> 00:12:37.110
592
+ ocho. Np dot square, raíz de ocho. Y,
593
+
594
+ 00:12:37.110 --> 00:12:41.125
595
+ en efecto, lo tenemos bien. Ahora, ya para
596
+
597
+ 00:12:41.125 --> 00:12:44.404
598
+ comprobar la propiedad de la no homogeneidad, vamos
599
+
600
+ 00:12:44.404 --> 00:12:50.165
601
+ a comprobar que dos por la norma de
602
+
603
+ 00:12:50.165 --> 00:12:53.845
604
+ u es exactamente igual a dos punto ochenta
605
+
606
+ 00:12:53.845 --> 00:12:58.130
607
+ y dos, y así lo tenemos. Entonces, esto
608
+
609
+ 00:12:58.130 --> 00:13:02.310
610
+ dice cómo estamos escalando nuestros vectores. Por último,
611
+
612
+ 00:13:02.370 --> 00:13:08.145
613
+ vamos a comprobar la propiedad del triángulo. Para
614
+
615
+ 00:13:08.145 --> 00:13:10.785
616
+ eso ya tenemos un vector u declarado, vamos
617
+
618
+ 00:13:10.785 --> 00:13:13.745
619
+ a declarar un nuevo vector. Digamos que este
620
+
621
+ 00:13:13.745 --> 00:13:16.065
622
+ nuevo vector se va a llamar v, y
623
+
624
+ 00:13:16.065 --> 00:13:22.320
625
+ este nuevo vector será numpy array, y a
626
+
627
+ 00:13:22.320 --> 00:13:30.880
628
+ este le pondremos menos uno coma uno. Y
629
+
630
+ 00:13:30.880 --> 00:13:36.204
631
+ ahora vamos a ver qué sucede. Vamos a
632
+
633
+ 00:13:36.204 --> 00:13:40.444
634
+ declarar como No, no declararemos un nuevo vector,
635
+
636
+ 00:13:40.444 --> 00:13:43.745
637
+ lo haremos directo. Vamos a aclarar el print
638
+
639
+ 00:13:45.485 --> 00:13:59.019
640
+ de u más v es igual, la norma
641
+
642
+ 00:13:59.019 --> 00:14:04.185
643
+ de u más v es igual a coma,
644
+
645
+ 00:14:04.404 --> 00:14:10.105
646
+ simplemente ponemos norm, norma de u más v,
647
+
648
+ 00:14:10.645 --> 00:14:15.860
649
+ y obtenemos el valor de dos. Ahora, vamos
650
+
651
+ 00:14:15.860 --> 00:14:17.800
652
+ a ver cuál es la norma de b,
653
+
654
+ 00:14:18.340 --> 00:14:22.440
655
+ porque esa es una norma que no hemos
656
+
657
+ 00:14:23.180 --> 00:14:26.340
658
+ calculado. La norma de b es uno punto
659
+
660
+ 00:14:26.340 --> 00:14:29.265
661
+ cuarenta y uno cuarenta y dos. Esto le
662
+
663
+ 00:14:29.265 --> 00:14:33.105
664
+ recuerda algo, es exactamente la misma norma que
665
+
666
+ 00:14:33.105 --> 00:14:37.024
667
+ la norma de u, pero el vector es
668
+
669
+ 00:14:37.024 --> 00:14:40.464
670
+ un vector totalmente distinto, está orientado hacia otro
671
+
672
+ 00:14:40.464 --> 00:14:42.930
673
+ lado. ¿Cuál es la diferencia entre estos dos
674
+
675
+ 00:14:42.930 --> 00:14:47.170
676
+ vectores? Bueno, el vector u está hacia este
677
+
678
+ 00:14:47.170 --> 00:14:50.450
679
+ lado, mientras que el otro vector, el vector
680
+
681
+ 00:14:50.450 --> 00:14:58.175
682
+ v, está apuntando hacia otra dirección. Sin embargo,
683
+
684
+ 00:14:58.714 --> 00:15:02.815
685
+ tiene el mismo tamaño, la misma magnitud. Pareciera
686
+
687
+ 00:15:03.675 --> 00:15:07.755
688
+ guiño guiño que lo rotaron. Más adelante veremos
689
+
690
+ 00:15:07.755 --> 00:15:16.960
691
+ esto. Regresamos al notebook. Ahora, para terminar de
692
+
693
+ 00:15:16.960 --> 00:15:20.560
694
+ comprobar esto, a lo más este número debería
695
+
696
+ 00:15:20.560 --> 00:15:23.280
697
+ de ser igual, este número no puede ser
698
+
699
+ 00:15:23.280 --> 00:15:34.535
700
+ mayor. Entonces, vamos a preguntarle a Python, print.
701
+
702
+ 00:15:34.835 --> 00:15:41.170
703
+ ¿Es verdad que esta expresión de aquí es
704
+
705
+ 00:15:48.430 --> 00:15:56.235
706
+ menor o igual que la suma de los
707
+
708
+ 00:15:56.235 --> 00:16:12.650
709
+ individuales. Coma, ahora, ¿cómo le preguntamos esto? Pues,
710
+
711
+ 00:16:12.650 --> 00:16:15.610
712
+ fíjense que lo que haremos es preguntarle a
713
+
714
+ 00:16:15.610 --> 00:16:20.815
715
+ Python la siguiente expresión lógica. Vamos a llamar
716
+
717
+ 00:16:20.815 --> 00:16:25.695
718
+ a norma, norma de u más v, y
719
+
720
+ 00:16:25.695 --> 00:16:28.175
721
+ le vamos a poner la condición de que
722
+
723
+ 00:16:28.175 --> 00:16:33.980
724
+ sea menor o igual, menor o igual, y
725
+
726
+ 00:16:33.980 --> 00:16:37.740
727
+ a eso le vamos a poner norma de
728
+
729
+ 00:16:37.740 --> 00:16:44.540
730
+ b más norma de u. Cerramos paréntesis y
731
+
732
+ 00:16:44.540 --> 00:16:48.135
733
+ veamos qué nos dice Python. Nos dice que
734
+
735
+ 00:16:48.135 --> 00:16:51.175
736
+ es verdad, la norma de v es menor
737
+
738
+ 00:16:51.175 --> 00:16:53.975
739
+ o igual que u más v, por lo
740
+
741
+ 00:16:53.975 --> 00:16:57.335
742
+ tanto, hemos comprobado las propiedades que tiene la
743
+
744
+ 00:16:57.335 --> 00:17:00.870
745
+ norma. En la próxima clase vamos a ver
746
+
747
+ 00:17:00.870 --> 00:17:03.290
748
+ cómo a partir de la norma y recordando
749
+
750
+ 00:17:03.430 --> 00:17:06.230
751
+ la operación de suma, vamos a poder definir
752
+
753
+ 00:17:06.230 --> 00:17:08.630
754
+ la distancia entre dos vectores y va a
755
+
756
+ 00:17:08.630 --> 00:17:12.089
757
+ ser totalmente necesario revisitar la suma entre vectores
758
+
759
+ 00:17:12.150 --> 00:17:16.616
760
+ para entenderla como una operación también geométrica. Nos
761
+
762
+ 00:17:16.616 --> 00:17:17.996
763
+ vemos en la próxima clase.
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/01-distancias_9e4fe5f7-c830-455a-8f38-ca9850246cef.ipynb ADDED
@@ -0,0 +1,534 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 8. Distancia y Norma"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "En clases pasadas hablamos de la magnitud de un vector pero no dimos una forma de poder medirla, esa magnitud la podremos calcular a través de la *norma Euclidiana*:\n",
15
+ "\n",
16
+ "$$\n",
17
+ "||x|| = \\displaystyle\\sqrt{x_{0}^2 + x_{1}^2 + \\cdots + x_{n-1}^{2}} = \\displaystyle\\sqrt(x^Tx)\n",
18
+ "$$\n",
19
+ "\n",
20
+ "Hay que notar que $x$ en la expresión anterior es un $n$-vector. \n",
21
+ "Pongamos un ejemplo con $x^T = [1,2,3]$\n",
22
+ "\n",
23
+ "$$\n",
24
+ "||x|| = \\displaystyle\\sqrt{1^2 + 2^2 + 3^2} = \\sqrt{14} \\approx 3.74\n",
25
+ "$$\n",
26
+ "\n",
27
+ "Realizaremos otro con $x^T = [2,-1,2]$\n",
28
+ "\n",
29
+ "$$\n",
30
+ "||x|| = \\displaystyle\\sqrt{2^2 + (-1)^2 + 2^2} = \\sqrt{9} = 3\n",
31
+ "$$"
32
+ ]
33
+ },
34
+ {
35
+ "cell_type": "markdown",
36
+ "metadata": {},
37
+ "source": [
38
+ "## 8.1 Propieades de la norma"
39
+ ]
40
+ },
41
+ {
42
+ "cell_type": "markdown",
43
+ "metadata": {},
44
+ "source": [
45
+ "Como todas las operaciones con las que trabajamos hasta ahora la norma también cumple una serie de propiedades. Sean $x$, $y$ son $n$-vectores y $\\beta$ un escalar cualquiera, tenemos que la norma cumple:\n",
46
+ "* Homogeneídad no negativa: $||\\beta x|| = |\\beta|\\cdot ||x||$\n",
47
+ "\n",
48
+ "* Desigualdad del triángulo: $||x+y|| \\le ||x|| + ||y||$ \n",
49
+ "\n",
50
+ "* No-negatividad: $||x||\\ge 0$ y además $||x|| = 0$ si y solamente si $x = \\mathbf{0}$"
51
+ ]
52
+ },
53
+ {
54
+ "cell_type": "markdown",
55
+ "metadata": {},
56
+ "source": [
57
+ "La norma es ampliamente usada, en particular podemos señalar los siguientes ejemplos:\n",
58
+ "\n",
59
+ "**Valor cuadrático medio.** Algunas veces también es llamado simplemente **RMS** y se define como sigue:\n",
60
+ "\n",
61
+ "$$\n",
62
+ "rms(x) = \\displaystyle\\sqrt{\\frac{x_{0}^2 + x_{1}^2 + \\cdots + x_{n-1}^{2}}{n}} = \\frac{||x||}{\\sqrt{n}}\n",
63
+ "$$"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "markdown",
68
+ "metadata": {},
69
+ "source": [
70
+ "**Norma de una suma.** Si tenemos dos vectores $x$ y $y$ entonces la norma de la suma es\n",
71
+ "\n",
72
+ "$$\n",
73
+ "||x+y|| = \\displaystyle\\sqrt{||x||^{2} + 2x^{T}y + ||y||^{2}}\n",
74
+ "$$"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "markdown",
79
+ "metadata": {},
80
+ "source": [
81
+ "**Norma de una bloque de vectores.** La norma de bloque de vectores será simplemente la raíz cuadrada de la suma de sus componentes. Si tenemos $d$ un $k$-vector con componentes $d_{i}$ que son $n$-vectores entonces tenemos que:\n",
82
+ "\n",
83
+ "$$\n",
84
+ "||d|| = \\displaystyle\\sqrt{||d_{0}||^{2}+||d_{1}||^{2}+\\cdots + ||d_{n-1}||^{2}}\n",
85
+ "$$"
86
+ ]
87
+ },
88
+ {
89
+ "cell_type": "code",
90
+ "execution_count": 1,
91
+ "metadata": {},
92
+ "outputs": [],
93
+ "source": [
94
+ "import numpy as np"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 2,
100
+ "metadata": {},
101
+ "outputs": [],
102
+ "source": [
103
+ "u = np.array([1,1])"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": 3,
109
+ "metadata": {},
110
+ "outputs": [],
111
+ "source": [
112
+ "def norma(x):\n",
113
+ " return np.sqrt(x@x)"
114
+ ]
115
+ },
116
+ {
117
+ "cell_type": "code",
118
+ "execution_count": 4,
119
+ "metadata": {},
120
+ "outputs": [
121
+ {
122
+ "data": {
123
+ "text/plain": [
124
+ "1.4142135623730951"
125
+ ]
126
+ },
127
+ "execution_count": 4,
128
+ "metadata": {},
129
+ "output_type": "execute_result"
130
+ }
131
+ ],
132
+ "source": [
133
+ "norma(u)"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "markdown",
138
+ "metadata": {},
139
+ "source": [
140
+ "$2*u^T = [2,2]$ entonces la norma será $||2u|| = \\displaystyle\\sqrt{2^2 + 2^2} = \\displaystyle\\sqrt{8}$"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": 5,
146
+ "metadata": {},
147
+ "outputs": [
148
+ {
149
+ "data": {
150
+ "text/plain": [
151
+ "2.8284271247461903"
152
+ ]
153
+ },
154
+ "execution_count": 5,
155
+ "metadata": {},
156
+ "output_type": "execute_result"
157
+ }
158
+ ],
159
+ "source": [
160
+ "norma(2*u)"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 6,
166
+ "metadata": {},
167
+ "outputs": [
168
+ {
169
+ "data": {
170
+ "text/plain": [
171
+ "2.8284271247461903"
172
+ ]
173
+ },
174
+ "execution_count": 6,
175
+ "metadata": {},
176
+ "output_type": "execute_result"
177
+ }
178
+ ],
179
+ "source": [
180
+ "2*norma(u)"
181
+ ]
182
+ },
183
+ {
184
+ "cell_type": "code",
185
+ "execution_count": 7,
186
+ "metadata": {},
187
+ "outputs": [],
188
+ "source": [
189
+ "v = np.array([-1,1])"
190
+ ]
191
+ },
192
+ {
193
+ "cell_type": "code",
194
+ "execution_count": 8,
195
+ "metadata": {},
196
+ "outputs": [
197
+ {
198
+ "name": "stdout",
199
+ "output_type": "stream",
200
+ "text": [
201
+ "||u+v|| = 2.0\n"
202
+ ]
203
+ }
204
+ ],
205
+ "source": [
206
+ "print('||u+v|| = ',norma(u+v))"
207
+ ]
208
+ },
209
+ {
210
+ "cell_type": "code",
211
+ "execution_count": 9,
212
+ "metadata": {},
213
+ "outputs": [
214
+ {
215
+ "name": "stdout",
216
+ "output_type": "stream",
217
+ "text": [
218
+ "||v|| = 1.4142135623730951\n"
219
+ ]
220
+ }
221
+ ],
222
+ "source": [
223
+ "print('||v|| = ',norma(v))"
224
+ ]
225
+ },
226
+ {
227
+ "cell_type": "code",
228
+ "execution_count": 10,
229
+ "metadata": {},
230
+ "outputs": [
231
+ {
232
+ "name": "stdout",
233
+ "output_type": "stream",
234
+ "text": [
235
+ "¿Es verdad que ||u+v|| menor o igual que ||u||+||v|| True\n"
236
+ ]
237
+ }
238
+ ],
239
+ "source": [
240
+ "print('¿Es verdad que ||u+v|| menor o igual que ||u||+||v||', norma(u+v) <= norma(v)+norma(u))"
241
+ ]
242
+ },
243
+ {
244
+ "cell_type": "markdown",
245
+ "metadata": {},
246
+ "source": [
247
+ " "
248
+ ]
249
+ },
250
+ {
251
+ "cell_type": "markdown",
252
+ "metadata": {},
253
+ "source": [
254
+ "## 8.1 Distancia entre vectores"
255
+ ]
256
+ },
257
+ {
258
+ "cell_type": "markdown",
259
+ "metadata": {},
260
+ "source": [
261
+ "Podemos usar la norma pora definir la distancia entre dos vectores $\\mathbf{a}$ y $\\mathbf{b}$ como la norma de la diferencia de los vectores\n",
262
+ "\n",
263
+ "$$\n",
264
+ "dist(\\mathbf{a},\\mathbf{b}) = ||\\mathbf{a} - \\mathbf{b}|| = \\displaystyle\\sqrt{(a_{0}-b_{0})^2 + (a_{1}-b_{1})^2 + \\cdots + (a_{n-1}-b_{n-1})^2}\n",
265
+ "$$"
266
+ ]
267
+ },
268
+ {
269
+ "cell_type": "code",
270
+ "execution_count": 11,
271
+ "metadata": {},
272
+ "outputs": [],
273
+ "source": [
274
+ "a = np.array([1,1])\n",
275
+ "b = np.array([-2,3])"
276
+ ]
277
+ },
278
+ {
279
+ "cell_type": "code",
280
+ "execution_count": 12,
281
+ "metadata": {},
282
+ "outputs": [],
283
+ "source": [
284
+ "c = a - b"
285
+ ]
286
+ },
287
+ {
288
+ "cell_type": "code",
289
+ "execution_count": 15,
290
+ "metadata": {},
291
+ "outputs": [
292
+ {
293
+ "data": {
294
+ "text/plain": [
295
+ "3.605551275463989"
296
+ ]
297
+ },
298
+ "execution_count": 15,
299
+ "metadata": {},
300
+ "output_type": "execute_result"
301
+ }
302
+ ],
303
+ "source": [
304
+ "norma(a-b)"
305
+ ]
306
+ },
307
+ {
308
+ "cell_type": "code",
309
+ "execution_count": 16,
310
+ "metadata": {},
311
+ "outputs": [
312
+ {
313
+ "data": {
314
+ "text/plain": [
315
+ "3.605551275463989"
316
+ ]
317
+ },
318
+ "execution_count": 16,
319
+ "metadata": {},
320
+ "output_type": "execute_result"
321
+ }
322
+ ],
323
+ "source": [
324
+ "np.linalg.norm(a-b)"
325
+ ]
326
+ },
327
+ {
328
+ "cell_type": "markdown",
329
+ "metadata": {},
330
+ "source": [
331
+ "A esto se el llama _norma Euclidiana_ o *distancia Euclidiana* y tiene ese nombre porque es como se infiere la forma de medir distancias de los [postulados de Euclides](https://es.wikipedia.org/wiki/Postulados_de_Euclides). Ahora, la realidad es que siempre que nuestro espacio admita una $\\mathbf{L^p}$-norma entonces podremos generalizar la norma anterior como\n",
332
+ "\n",
333
+ "$$\n",
334
+ "||x||_{p} = \\left(|x_{0}|^p + |x_{1}|^p + \\cdots + |x_{n-1}|^p\\right)^{1/p} \\qquad con \\;\\; 1\\le p\n",
335
+ "$$"
336
+ ]
337
+ },
338
+ {
339
+ "cell_type": "markdown",
340
+ "metadata": {},
341
+ "source": [
342
+ "Por eso es que la norma Euclidiana también es conocida como la *norma $L_{2}$*. Hay otras normas que recibe nombres. Por ejemplo, si $p=1$ tenemos la norma $L_{1}$ y esta es llamada _la métrica del taxista_ o _la métrica de Manhattan_. Si tomamos $p \\to \\infty$ entonces tenemos $L_{\\infty}$ y esta es llamada _la métrica del máximo_. Es muy importante saber qué métrica estamos usando para medir distancias ya que la forma en la que medimos distancias está en total correspondencia en con configuración y la percepción el espacio. Por ejemplo, mientras que en la métrica Euclidiana la distancia corresponde a la más corta entre los dos vectores en el espacio planeo en el caso de la métrica del taxista es la más corta pero no será es segmento más directo sino por _bloques_."
343
+ ]
344
+ },
345
+ {
346
+ "cell_type": "markdown",
347
+ "metadata": {},
348
+ "source": [
349
+ "Para poder simplificar las cosas tomemos dos vectores $\\mathbf{x}$ y $\\mathbf{y}$ en $\\mathbb{R}^2$\n",
350
+ "\n",
351
+ "$$\n",
352
+ "\\mathbf{x} = \\begin{bmatrix} 2\\\\1 \\end{bmatrix},\\; \\qquad \\mathbf{y} = \\begin{bmatrix} 1\\\\2 \\end{bmatrix}\n",
353
+ "$$\n",
354
+ "\n",
355
+ "La distancia en el caso de norma $L_{2}$ tenemos que la distancia entre los vectores es $||\\mathbf{x}-\\mathbf{y}||_{2} = \\displaystyle\\sqrt{(2-1)^{2} + (1-2)^{2}} = \\displaystyle\\sqrt{2}$ mientras que bajo la norma $L_{1}$ obtenemos que $||\\mathbf{x}-\\mathbf{y}||_{1} = |2-1|+|1-2| = 2$. "
356
+ ]
357
+ },
358
+ {
359
+ "cell_type": "markdown",
360
+ "metadata": {},
361
+ "source": [
362
+ "Ahora, si $\\mathbf{x}$ y $\\mathbf{y}$ son $n$-vectores hay una medida quer después cobrará importancia, *la desviación cuadrática media*\n",
363
+ "\n",
364
+ "$$\n",
365
+ "rms_{dev}(\\mathbf{x},\\mathbf{y}) = \\displaystyle\\frac{||\\mathbf{x}-\\mathbf{y}||}{\\sqrt{n}}\n",
366
+ "$$"
367
+ ]
368
+ },
369
+ {
370
+ "cell_type": "markdown",
371
+ "metadata": {},
372
+ "source": [
373
+ " "
374
+ ]
375
+ },
376
+ {
377
+ "cell_type": "markdown",
378
+ "metadata": {},
379
+ "source": [
380
+ "Algo muy imporante es que a pesar de que medimos distancias no existen propiamente nociones de *cerca* y *lejos*. Si tomamos los siguientes $4$-vectores\n",
381
+ "\n",
382
+ "$$\n",
383
+ "\\mathbf{u} = \\begin{bmatrix}1.8 \\\\ 2.8 \\\\ -3.7 \\\\ 4.7 \\end{bmatrix}, \\qquad \\mathbf{v} = \\begin{bmatrix}0.6 \\\\ 2.1 \\\\ 1.9 \\\\ -1.4 \\end{bmatrix}, \\qquad \\mathbf{w} = \\begin{bmatrix}2.0 \\\\ 1.9 \\\\ -4.0 \\\\ 4.6 \\end{bmatrix}\n",
384
+ "$$\n",
385
+ "\n",
386
+ "Tenemos que las distancia entre los vectores es:\n",
387
+ "\n",
388
+ "$$\n",
389
+ "||\\mathbf{u}-\\mathbf{v}|| = 8.36, \\qquad ||\\mathbf{u}-\\mathbf{w}|| = 0.38, \\qquad ||\\mathbf{v}-\\mathbf{w}|| = 8.63\n",
390
+ "$$\n",
391
+ "\n",
392
+ "Entonces así ya tenemos noción de cercanía o lontanaza, de no ser porque comparamos no tendríamos estas nociones. "
393
+ ]
394
+ },
395
+ {
396
+ "cell_type": "markdown",
397
+ "metadata": {},
398
+ "source": [
399
+ " "
400
+ ]
401
+ },
402
+ {
403
+ "cell_type": "markdown",
404
+ "metadata": {},
405
+ "source": [
406
+ "**Desigualdad del triángulo.** Debido a que la distancia la definimos a partir de la norma entonces la distancia también está sujeta a cumplir la desigualdad del triángulo. Considemos entonces tres $n$-vectores $\\mathbf{a}$,$\\mathbf{b}$ y $\\mathbf{c}$ entonces tenemos\n",
407
+ "\n",
408
+ "$$\n",
409
+ "||\\mathbf{a}-\\mathbf{c}|| = ||\\mathbf{a}-\\mathbf{b}+\\mathbf{b}-\\mathbf{c}|| \\le ||\\mathbf{a}-\\mathbf{b}|| + ||\\mathbf{b}-\\mathbf{c}||\n",
410
+ "$$"
411
+ ]
412
+ },
413
+ {
414
+ "cell_type": "markdown",
415
+ "metadata": {},
416
+ "source": [
417
+ "Vamos a partir de los siguientes $2$-vectores:\n",
418
+ "$$\n",
419
+ "\\mathbf{a} = \\begin{bmatrix} 1\\\\ 1 \\end{bmatrix}, \\qquad \\mathbf{b} = \\begin{bmatrix} 2\\\\ 3 \\end{bmatrix}, \\qquad \\mathbf{c} = \\begin{bmatrix} 4\\\\ 2 \\end{bmatrix}\n",
420
+ "$$"
421
+ ]
422
+ },
423
+ {
424
+ "cell_type": "markdown",
425
+ "metadata": {},
426
+ "source": [
427
+ " "
428
+ ]
429
+ },
430
+ {
431
+ "cell_type": "markdown",
432
+ "metadata": {},
433
+ "source": [
434
+ "## 8.3 Una aplicación"
435
+ ]
436
+ },
437
+ {
438
+ "cell_type": "markdown",
439
+ "metadata": {},
440
+ "source": [
441
+ "**Visita óptima de apartamentos para arrendar.** Supongamos que estamos en búsqueda de alquilar un apartamento. Comenzamos buscando caracacterísticas como cantidad de recámaras, cantidad de baños, estacionamientos, zona y tamaño. Un problema es que algunas veces llegamos a colectar una gran cantidad de anuncios y contactos y organizarnos para ir a las visitas puede parecer prácticamte imposible y puede que dejemos escapar una gran oportunidad. Afortunadamente en este curso vamos a proponer una solución: vamos a partir de nuestro departamento ideal y vamos a representarlo como un vector de caracteristicas, construimos el mismo vector para los apartamentos que ya tengamos localizados y calculamos la distancia entre estos vectores y el vector que representa al departamento ideal. Los ordenamos por de manera ascendente y ya tendríamos una lista ordenada en prioridad de contacto y visita de apartamentos según nuestro apartamento ideal. \n",
442
+ "\n",
443
+ "Para esto, supongamos que las características que queremos tomar en cuenta son tamaño del apartamento, número de recámaras, número de baños y número de estacionamientos. Notemos que en el caso de tamaño del apartamento regularmente se nos da en metros cuadrados (área) pero el gran problema es que puede variar mucho y usar estos números *tan grandes* puede introducir una gran cantidad de ruido. Para resolver el problema anterior vamos a catalogar los tamaños de apartametos en categorias:\n",
444
+ "1. Si el área es menor que 60 metros cuadrados\n",
445
+ "2. Si el área es mayor o igual que 60 metros cuadrados pero menor que 80 metros cuadrados\n",
446
+ "3. Si el área es mayor o igual que 80 metros cuadrados pero menor que 110 metros cuadrados\n",
447
+ "4. Si el área es mayor o igual que 110 metros cuadrados pero menor que 130 metros cuadrados\n",
448
+ "5. Si el área es mayor o igual que 130 metros cuadrados. "
449
+ ]
450
+ },
451
+ {
452
+ "cell_type": "markdown",
453
+ "metadata": {},
454
+ "source": [
455
+ "Supongamos también que el orden de las características en el vector es categoria de tamaño, número de recámaras, número de baños y número estacionamientos. Nuestro apartamento ideal viene dado por el siguiente vector:\n",
456
+ "\n",
457
+ "$$\n",
458
+ "\\mathbf{I} = \\begin{bmatrix} 3\\\\ 2\\\\ 2\\\\1 \\end{bmatrix}\n",
459
+ "$$\n",
460
+ "\n",
461
+ "Y nostros encontramos los siguientes apartamentos:\n",
462
+ "\n",
463
+ "$$\n",
464
+ "\\mathbf{A_{1}} = \\begin{bmatrix}4 \\\\3 \\\\ 3\\\\3 \\end{bmatrix}, \\qquad \\mathbf{A_{2}} = \\begin{bmatrix}3 \\\\3 \\\\ 1\\\\0 \\end{bmatrix}, \\qquad \\mathbf{A_{3}} = \\begin{bmatrix}5 \\\\4 \\\\ 3\\\\0 \\end{bmatrix}\n",
465
+ "$$"
466
+ ]
467
+ },
468
+ {
469
+ "cell_type": "code",
470
+ "execution_count": 21,
471
+ "metadata": {},
472
+ "outputs": [],
473
+ "source": [
474
+ "I = np.array([3,2,2,1])\n",
475
+ "A_1 = np.array([4,3,3,3])\n",
476
+ "A_2 = np.array([3,3,2,1])\n",
477
+ "A_3 = np.array([5,4,3,0])"
478
+ ]
479
+ },
480
+ {
481
+ "cell_type": "code",
482
+ "execution_count": 22,
483
+ "metadata": {},
484
+ "outputs": [
485
+ {
486
+ "name": "stdout",
487
+ "output_type": "stream",
488
+ "text": [
489
+ "||I-A_1|| = 2.6457513110645907\n",
490
+ "||I-A_2|| = 1.0\n",
491
+ "||I-A_3|| = 3.1622776601683795\n"
492
+ ]
493
+ }
494
+ ],
495
+ "source": [
496
+ "print('||I-A_1|| =',np.linalg.norm(I-A_1))\n",
497
+ "print('||I-A_2|| =',np.linalg.norm(I-A_2))\n",
498
+ "print('||I-A_3|| =',np.linalg.norm(I-A_3))"
499
+ ]
500
+ },
501
+ {
502
+ "cell_type": "markdown",
503
+ "metadata": {},
504
+ "source": [
505
+ "Este problema es el problema de encontrar el vector más cercano. Básicamte si tenemos una colección de N $n$-vectores $z_{0},z_{1},\\dots,z_{N-1}$ vamos a decir que $z_{i}$ es el vecino más cercano del vector $x$ si \n",
506
+ "\n",
507
+ "$$\n",
508
+ "||x-z_{i}|| \\le ||x - z_{j}|| \\quad con \\; \\; j = 0,\\dots, N-1\n",
509
+ "$$"
510
+ ]
511
+ }
512
+ ],
513
+ "metadata": {
514
+ "kernelspec": {
515
+ "display_name": "Python 3",
516
+ "language": "python",
517
+ "name": "python3"
518
+ },
519
+ "language_info": {
520
+ "codemirror_mode": {
521
+ "name": "ipython",
522
+ "version": 3
523
+ },
524
+ "file_extension": ".py",
525
+ "mimetype": "text/x-python",
526
+ "name": "python",
527
+ "nbconvert_exporter": "python",
528
+ "pygments_lexer": "ipython3",
529
+ "version": "3.7.3"
530
+ }
531
+ },
532
+ "nbformat": 4,
533
+ "nbformat_minor": 4
534
+ }
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Cálculo de Distancias entre Vectores usando Normas Euclidianas y LP.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:85c2a2612c728e88871feafc16a0fa4522936f772ab59b98ada5e753edd4dd8f
3
+ size 219666438
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Cálculo de Distancias entre Vectores usando Normas Euclidianas y LP.vtt ADDED
@@ -0,0 +1,1198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:03.679 --> 00:00:05.920
4
+ Hola. En esta clase vamos a ver cómo
5
+
6
+ 00:00:05.920 --> 00:00:07.520
7
+ a partir de lo que aprendimos la clase
8
+
9
+ 00:00:07.520 --> 00:00:09.920
10
+ pasada, que es la norma, vamos a poder
11
+
12
+ 00:00:09.920 --> 00:00:13.460
13
+ empezar a calcular la distancia entre dos vectores.
14
+
15
+ 00:00:13.885 --> 00:00:16.965
16
+ Igual manera, vamos a ver una representación geométrica
17
+
18
+ 00:00:16.965 --> 00:00:19.325
19
+ y vamos a conocer otras formas de medir
20
+
21
+ 00:00:19.325 --> 00:00:23.565
22
+ distancias. Sin más, vamos a la computadora. Ahora,
23
+
24
+ 00:00:23.565 --> 00:00:26.285
25
+ este notebook en el que estamos trabajando es
26
+
27
+ 00:00:26.285 --> 00:00:28.845
28
+ el notebook que empezamos a trabajar la clase
29
+
30
+ 00:00:28.845 --> 00:00:31.740
31
+ pasada. Entonces, no te preocupes, lo vas a
32
+
33
+ 00:00:31.740 --> 00:00:33.660
34
+ tener disponible, y lo más importante es que
35
+
36
+ 00:00:33.660 --> 00:00:36.540
37
+ estemos seguros de que estas celdas sí estén
38
+
39
+ 00:00:36.540 --> 00:00:38.660
40
+ corriendo o se hayan corrido antes de que
41
+
42
+ 00:00:38.660 --> 00:00:41.520
43
+ nosotros empecemos a trabajar, pues vamos a empezar
44
+
45
+ 00:00:41.580 --> 00:00:43.820
46
+ a a usar esa función norma para lo
47
+
48
+ 00:00:43.820 --> 00:00:47.515
49
+ que viene, al igual que en un pay.
50
+
51
+ 00:00:50.375 --> 00:00:53.175
52
+ Ahora bien, llegados a este punto, nosotros ya
53
+
54
+ 00:00:53.175 --> 00:00:56.215
55
+ definimos la función norma y ya sabemos cómo
56
+
57
+ 00:00:56.215 --> 00:00:58.510
58
+ calcular la magnitud de un vector. Lo que
59
+
60
+ 00:00:58.510 --> 00:01:00.750
61
+ vamos a hacer ahora es calcular la distancia
62
+
63
+ 00:01:00.750 --> 00:01:03.710
64
+ entre dos vectores, y es que hay algo
65
+
66
+ 00:01:03.710 --> 00:01:07.310
67
+ que tenemos que hacer, porque tenemos que entender
68
+
69
+ 00:01:07.310 --> 00:01:10.270
70
+ ahora de manera geométrica qué va a significar
71
+
72
+ 00:01:10.270 --> 00:01:13.410
73
+ sumar vectores y qué va a significar sumar,
74
+
75
+ 00:01:13.935 --> 00:01:17.455
76
+ restarlos también. Entonces, primero vamos a proponer dos
77
+
78
+ 00:01:17.455 --> 00:01:20.335
79
+ vectores cualesquiera. Lo que estoy diciendo aquí es
80
+
81
+ 00:01:20.335 --> 00:01:22.895
82
+ que la distancia entre dos vectores se va
83
+
84
+ 00:01:22.895 --> 00:01:25.215
85
+ a proponer como la norma de la resta
86
+
87
+ 00:01:25.215 --> 00:01:28.470
88
+ de esos vectores. Veamos entonces si proponemos un
89
+
90
+ 00:01:28.470 --> 00:01:35.430
91
+ vector a igual ANP dot array uno coma
92
+
93
+ 00:01:35.430 --> 00:01:39.130
94
+ uno y después proponemos a un vector b
95
+
96
+ 00:01:39.670 --> 00:01:54.185
97
+ igual ANP array. Menos dos coma tres. Y
98
+
99
+ 00:01:54.185 --> 00:01:56.920
100
+ ahora vamos a calcular la resta de estos
101
+
102
+ 00:01:56.920 --> 00:01:58.750
103
+ vectores. A ese vector le voy a llamar
104
+
105
+ 00:01:58.750 --> 00:02:09.080
106
+ el vector c. Entonces, tenemos que el vector
107
+
108
+ 00:02:09.080 --> 00:02:14.025
109
+ c es simplemente tres menos dos. Vamos de
110
+
111
+ 00:02:14.025 --> 00:02:16.525
112
+ nuevo a Geogebra para poder hacer este ejercicio.
113
+
114
+ 00:02:21.465 --> 00:02:24.470
115
+ Ahora, si recordamos, aquí en GeoGeora tenemos que
116
+
117
+ 00:02:24.470 --> 00:02:27.190
118
+ empezar a declarar nuestros vectores. Vamos a empezar
119
+
120
+ 00:02:27.190 --> 00:02:36.410
121
+ declarando el vector uno coma uno. Vamos a
122
+
123
+ 00:02:36.470 --> 00:02:46.915
124
+ declarar también el vector menos dos coma tres.
125
+
126
+ 00:02:46.915 --> 00:02:49.575
127
+ Y ahora vamos a revisitar lo que significaba
128
+
129
+ 00:02:49.635 --> 00:02:52.780
130
+ sumar los vectores. Vamos a dibujar el nuevo
131
+
132
+ 00:02:52.780 --> 00:02:57.500
133
+ vector u más v. U más v es
134
+
135
+ 00:02:57.500 --> 00:02:59.980
136
+ igual a ese vector de ahí. Ahora, ¿cómo
137
+
138
+ 00:02:59.980 --> 00:03:02.300
139
+ es que sale ese vector de ahí? Bueno,
140
+
141
+ 00:03:02.300 --> 00:03:04.400
142
+ lo que vamos a hacer en este momento
143
+
144
+ 00:03:05.180 --> 00:03:10.834
145
+ es trasladar este vector u hacia acá y
146
+
147
+ 00:03:10.834 --> 00:03:14.855
148
+ vamos a trasladar este vector b hacia acá.
149
+
150
+ 00:03:16.114 --> 00:03:52.640
151
+ Vamos a hacerlo. Ahora bien, ya dibujados nuestros
152
+
153
+ 00:03:52.640 --> 00:03:56.305
154
+ vectores, vamos a retomar el ejercicio. Primero dibujamos
155
+
156
+ 00:03:56.305 --> 00:03:59.584
157
+ nuestros vectores bases, que era nuestro vector VYU,
158
+
159
+ 00:03:59.584 --> 00:04:01.265
160
+ que era el vector uno coma uno y
161
+
162
+ 00:04:01.265 --> 00:04:04.245
163
+ el vector menos dos coma tres. Ahora bien,
164
+
165
+ 00:04:05.025 --> 00:04:06.944
166
+ vamos a ver qué pasa si sumamos el
167
+
168
+ 00:04:06.944 --> 00:04:11.000
169
+ vector VYUU. La suma del vector VYU es
170
+
171
+ 00:04:11.000 --> 00:04:14.280
172
+ este vector w. Nosotros ya vimos cómo hacer
173
+
174
+ 00:04:14.280 --> 00:04:17.800
175
+ la suma de de manera algebraica. Ahora, yo
176
+
177
+ 00:04:17.800 --> 00:04:19.720
178
+ te invito a que tomes una hoja de
179
+
180
+ 00:04:19.720 --> 00:04:23.585
181
+ papel, una credencial, te puede servir, o bien,
182
+
183
+ 00:04:23.585 --> 00:04:25.465
184
+ un set de reglas, y lo que vamos
185
+
186
+ 00:04:25.465 --> 00:04:28.305
187
+ a hacer es esto. Nosotros vamos a partir
188
+
189
+ 00:04:28.305 --> 00:04:31.345
190
+ de que tenemos esos vectores dibujados, puedes ayudarte
191
+
192
+ 00:04:31.345 --> 00:04:34.465
193
+ de una hoja cuadriculada, y entonces vas a
194
+
195
+ 00:04:34.465 --> 00:04:37.541
196
+ recargar aquí tu tu regla y vas a
197
+
198
+ 00:04:37.541 --> 00:04:40.740
199
+ poner otra regla aquí para que puedas mover
200
+
201
+ 00:04:40.800 --> 00:04:44.320
202
+ exactamente este trazo hacia acá, de manera que
203
+
204
+ 00:04:44.320 --> 00:04:48.800
205
+ te quede un trazo aquí. Este vector de
206
+
207
+ 00:04:48.800 --> 00:04:52.104
208
+ aquí es el vector correspondiente a haber trasladado
209
+
210
+ 00:04:52.485 --> 00:04:55.525
211
+ este vector hasta acá, hasta la punta de
212
+
213
+ 00:04:55.525 --> 00:04:58.565
214
+ este vector. Ahora lo mismo vamos a hacer
215
+
216
+ 00:04:58.565 --> 00:05:02.164
217
+ con este, pero en esta dirección. Tomamos este
218
+
219
+ 00:05:02.164 --> 00:05:04.820
220
+ vector v, nos recargamos en una regla y
221
+
222
+ 00:05:04.820 --> 00:05:08.419
223
+ lo desplazamos, y desplazándolo nos debería de quedar
224
+
225
+ 00:05:08.419 --> 00:05:12.580
226
+ este vector de aquí. Ahora, si nosotros nos
227
+
228
+ 00:05:12.580 --> 00:05:16.440
229
+ fijamos de manera cuidadosa, podemos trazar una línea
230
+
231
+ 00:05:16.500 --> 00:05:19.115
232
+ de este punto hacia este punto en donde
233
+
234
+ 00:05:19.115 --> 00:05:21.755
235
+ se intersectan esas dos flechas, y eso de
236
+
237
+ 00:05:21.755 --> 00:05:24.475
238
+ ahí será la suma de los vectores. A
239
+
240
+ 00:05:24.475 --> 00:05:26.155
241
+ esto se le conoce como la suma del
242
+
243
+ 00:05:26.155 --> 00:05:29.115
244
+ paralelogramo, o la suma del rombo, también le
245
+
246
+ 00:05:29.115 --> 00:05:32.200
247
+ suelen llamar. Y es que justamente los vectores
248
+
249
+ 00:05:32.260 --> 00:05:34.740
250
+ son cantidades tan geométricas que incluso en su
251
+
252
+ 00:05:34.740 --> 00:05:37.300
253
+ suma se conservan este tipo de cosas. Pero
254
+
255
+ 00:05:37.300 --> 00:05:39.780
256
+ hay una cosa muy interesante también, y es
257
+
258
+ 00:05:39.780 --> 00:05:41.955
259
+ que, ¿qué es la resta en este caso?
260
+
261
+ 00:05:42.435 --> 00:05:45.395
262
+ Bueno, si nosotros quisiéramos medir la distancia del
263
+
264
+ 00:05:45.395 --> 00:05:47.474
265
+ vector v al vector u, sería medir la
266
+
267
+ 00:05:47.474 --> 00:05:50.694
268
+ distancia de este lugar a este lugar. Entonces,
269
+
270
+ 00:05:51.155 --> 00:05:53.094
271
+ para poder hacer eso, como lo hemos venido
272
+
273
+ 00:05:53.155 --> 00:05:55.235
274
+ haciendo hasta ahora, deberíamos de poder construir un
275
+
276
+ 00:05:55.235 --> 00:05:57.474
277
+ vector que vaya de este punto a este
278
+
279
+ 00:05:57.474 --> 00:06:00.009
280
+ punto y a ese vector le podríamos calcular
281
+
282
+ 00:06:00.009 --> 00:06:03.850
283
+ su magnitud. ¿Y adivinen qué? Siguiendo esta misma
284
+
285
+ 00:06:03.850 --> 00:06:07.850
286
+ construcción, si nosotros trazamos ese vector transversal, lo
287
+
288
+ 00:06:07.850 --> 00:06:09.289
289
+ a lo que vamos a llegar es que
290
+
291
+ 00:06:09.289 --> 00:06:11.150
292
+ ese vector es la resta de los vectores.
293
+
294
+ 00:06:11.565 --> 00:06:13.885
295
+ Entonces, vamos a trazar, por ejemplo, el u
296
+
297
+ 00:06:13.885 --> 00:06:21.005
298
+ menos v. Y entonces, nos sale justamente este
299
+
300
+ 00:06:21.005 --> 00:06:23.980
301
+ vector. Ahora, cuando nosotros hacemos la resta algebraica,
302
+
303
+ 00:06:23.980 --> 00:06:26.860
304
+ las restas algebraicas se hacen en función del
305
+
306
+ 00:06:26.860 --> 00:06:30.940
307
+ centro. Nosotros podemos trasladar este vector de aquí.
308
+
309
+ 00:06:30.940 --> 00:06:34.000
310
+ Entonces, lo que vamos a hacer es justamente
311
+
312
+ 00:06:34.300 --> 00:06:44.105
313
+ esto de acá. Vector de menos dos coma
314
+
315
+ 00:06:44.105 --> 00:06:54.510
316
+ tres. Ahora bien, lo que podemos hacer para
317
+
318
+ 00:06:54.510 --> 00:06:56.910
319
+ poder hacer este trazo es recargar aquí una
320
+
321
+ 00:06:56.910 --> 00:06:59.470
322
+ regla y recargar la otra en ángulo, y
323
+
324
+ 00:06:59.470 --> 00:07:02.510
325
+ traspasar este vector de aquí en ángulo hacia
326
+
327
+ 00:07:02.510 --> 00:07:05.410
328
+ acá. Veremos que es exactamente el mismo vector
329
+
330
+ 00:07:05.445 --> 00:07:07.765
331
+ y va a tener la misma magnitud, es
332
+
333
+ 00:07:07.765 --> 00:07:10.005
334
+ decir, midiendo la magnitud de la resta del
335
+
336
+ 00:07:10.005 --> 00:07:13.685
337
+ vector UYB, podemos obtener justamente la distancia de
338
+
339
+ 00:07:13.685 --> 00:07:16.505
340
+ este punto a este punto. Es por eso
341
+
342
+ 00:07:16.725 --> 00:07:19.205
343
+ que, para calcular la distancia del vector b
344
+
345
+ 00:07:19.205 --> 00:07:21.490
346
+ al vector u, una de las mejores formas
347
+
348
+ 00:07:21.490 --> 00:07:24.150
349
+ de hacerlo es a través de la resta.
350
+
351
+ 00:07:24.530 --> 00:07:26.690
352
+ Y después, ya que restamos esos y creamos
353
+
354
+ 00:07:26.690 --> 00:07:29.730
355
+ este nuevo vector, a este le calculamos la
356
+
357
+ 00:07:29.730 --> 00:07:33.170
358
+ magnitud y ya tendremos lo que es la
359
+
360
+ 00:07:33.170 --> 00:07:36.805
361
+ distancia del vector v al vector u. Regresemos
362
+
363
+ 00:07:36.805 --> 00:07:43.284
364
+ al notebook. Ahora, simplemente recordando lo que vimos
365
+
366
+ 00:07:43.284 --> 00:07:46.965
367
+ en Geogebra, nos daremos cuenta que el vector
368
+
369
+ 00:07:46.965 --> 00:07:50.004
370
+ que habíamos obtenido era exactamente tres coma menos
371
+
372
+ 00:07:50.004 --> 00:07:52.320
373
+ dos. ¿Y cuál sería la distancia entre estos
374
+
375
+ 00:07:52.320 --> 00:07:56.180
376
+ vectores? Bueno, eso lo podemos calcular también aquí.
377
+
378
+ 00:07:56.400 --> 00:07:59.280
379
+ Si recordamos, ya teníamos una función que se
380
+
381
+ 00:07:59.280 --> 00:08:04.900
382
+ llamaba norma, y esa función norma es simplemente
383
+
384
+ 00:08:05.039 --> 00:08:07.405
385
+ aplicarla y ya nos da la longitud del
386
+
387
+ 00:08:07.405 --> 00:08:09.884
388
+ la magnitud del vector, que es tres punto
389
+
390
+ 00:08:09.884 --> 00:08:13.725
391
+ seis, pero podríamos hacerlo directamente acá, en a
392
+
393
+ 00:08:13.725 --> 00:08:16.764
394
+ menos b, realizaría primero la operación y después
395
+
396
+ 00:08:16.764 --> 00:08:20.710
397
+ se evaluaría la función norma. Nos da exactamente
398
+
399
+ 00:08:20.770 --> 00:08:23.970
400
+ lo mismo. Ahora, hay algo muy interesante y
401
+
402
+ 00:08:23.970 --> 00:08:25.970
403
+ es que, como muchas otras funciones que hemos
404
+
405
+ 00:08:25.970 --> 00:08:29.010
406
+ visto hasta ahora, NumPy ya trae precargada también
407
+
408
+ 00:08:29.010 --> 00:08:31.890
409
+ una función de norma. ¿Cómo podemos acceder a
410
+
411
+ 00:08:31.890 --> 00:08:34.574
412
+ ella? Tenemos que acceder a través de numpy
413
+
414
+ 00:08:34.995 --> 00:08:43.834
415
+ dot linalg punto norm. Y evaluamos el vector
416
+
417
+ 00:08:43.834 --> 00:08:48.020
418
+ que nosotros queramos hacer, a menos b, por
419
+
420
+ 00:08:48.080 --> 00:08:50.800
421
+ ejemplo, y nos da exactamente lo mismo. Esta
422
+
423
+ 00:08:50.800 --> 00:08:52.880
424
+ fue la que nosotros construimos y es esta
425
+
426
+ 00:08:52.880 --> 00:08:54.640
427
+ la que está en NumPy. ¿Cuál es la
428
+
429
+ 00:08:54.640 --> 00:08:56.800
430
+ ventaja de que esté en NumPy? Bueno, nosotros
431
+
432
+ 00:08:56.800 --> 00:08:58.800
433
+ no vamos a tener que estar declarando esta
434
+
435
+ 00:08:58.800 --> 00:09:00.480
436
+ función todo el tiempo y ya va a
437
+
438
+ 00:09:00.480 --> 00:09:03.515
439
+ estar precargada aquí. Entonces, a partir de este
440
+
441
+ 00:09:03.515 --> 00:09:05.275
442
+ momento vamos a dejar de utilizar la función
443
+
444
+ 00:09:05.275 --> 00:09:07.755
445
+ norma que habíamos creado y, por simplicidad, vamos
446
+
447
+ 00:09:07.755 --> 00:09:10.495
448
+ a empezar a usar la función n p
449
+
450
+ 00:09:10.715 --> 00:09:18.010
451
+ linalg norm. Ahora, a esto que estamos calculando
452
+
453
+ 00:09:18.470 --> 00:09:21.370
454
+ se le llama norma euclidiana o distancia euclidiana,
455
+
456
+ 00:09:21.750 --> 00:09:24.710
457
+ y tiene ese nombre porque así es como
458
+
459
+ 00:09:24.710 --> 00:09:27.510
460
+ se infiere la medida de las distancias en
461
+
462
+ 00:09:27.510 --> 00:09:30.485
463
+ los postulados de Euclides. Los postulados de Euclides
464
+
465
+ 00:09:30.485 --> 00:09:34.245
466
+ son unos postulados que Euclides, por allá de
467
+
468
+ 00:09:34.245 --> 00:09:39.845
469
+ el año trescientos antes de nuestra era, puso,
470
+
471
+ 00:09:39.845 --> 00:09:43.610
472
+ y son cómo hacer algunos trazos dentro de
473
+
474
+ 00:09:43.610 --> 00:09:46.330
475
+ el plano, al plano mismo que le llamamos
476
+
477
+ 00:09:46.330 --> 00:09:50.810
478
+ hoy euclidiana también. Les invito a que le
479
+
480
+ 00:09:50.810 --> 00:09:55.530
481
+ den una leída a este. Bien, ahora, la
482
+
483
+ 00:09:55.530 --> 00:09:59.785
484
+ realidad es que la norma euclidiana es solamente
485
+
486
+ 00:09:59.925 --> 00:10:02.885
487
+ una forma de medir. Hay muchas otras formas
488
+
489
+ 00:10:02.885 --> 00:10:05.365
490
+ de medir, regularmente los espacios en los que
491
+
492
+ 00:10:05.365 --> 00:10:08.265
493
+ vamos a estar trabajando son espacios que admiten
494
+
495
+ 00:10:08.325 --> 00:10:11.920
496
+ normas LP. ¿Qué significa que admiten normas LP?
497
+
498
+ 00:10:12.300 --> 00:10:15.519
499
+ Significa que nosotros podemos construir este de aquí
500
+
501
+ 00:10:16.139 --> 00:10:18.220
502
+ para alguna p con p mayor o igual
503
+
504
+ 00:10:18.220 --> 00:10:23.274
505
+ que uno. Ahora, esta norma de aquí, a
506
+
507
+ 00:10:23.274 --> 00:10:25.774
508
+ pesar de que aquí estamos midiendo la longitud,
509
+
510
+ 00:10:26.075 --> 00:10:28.555
511
+ la magnitud de un vector, como vimos aquí
512
+
513
+ 00:10:28.555 --> 00:10:32.075
514
+ arriba, nos permite inducir también medir distancia entre
515
+
516
+ 00:10:32.075 --> 00:10:38.330
517
+ vectores. Por ejemplo, en el caso de la
518
+
519
+ 00:10:38.330 --> 00:10:41.610
520
+ norma euclidiana, a la norma euclidiana, si nos
521
+
522
+ 00:10:41.610 --> 00:10:44.270
523
+ fijamos breve en la fórmula que tenemos aquí,
524
+
525
+ 00:10:44.970 --> 00:10:47.470
526
+ también se le conoce como norma l dos,
527
+
528
+ 00:10:47.850 --> 00:10:50.575
529
+ porque vamos a poner una p igual a
530
+
531
+ 00:10:50.575 --> 00:10:55.055
532
+ dos aquí. Hay otras normas y esas otras
533
+
534
+ 00:10:55.055 --> 00:10:57.615
535
+ normas reciben nombres. Por ejemplo, si p es
536
+
537
+ 00:10:57.615 --> 00:11:00.175
538
+ igual a uno, tenemos la norma l uno,
539
+
540
+ 00:11:00.175 --> 00:11:02.575
541
+ y esa es la llamada métrica del taxista
542
+
543
+ 00:11:02.575 --> 00:11:05.160
544
+ o métrica de Manhattan. Y si, por ejemplo,
545
+
546
+ 00:11:05.160 --> 00:11:07.360
547
+ hacemos que p tiende a infinito, entonces lo
548
+
549
+ 00:11:07.360 --> 00:11:10.140
550
+ que obtenemos es l infinito, que es la
551
+
552
+ 00:11:10.600 --> 00:11:13.640
553
+ llamada métrica del máximo. El caso de l
554
+
555
+ 00:11:13.640 --> 00:11:16.200
556
+ infinito, por ejemplo, nos da simplemente la componente
557
+
558
+ 00:11:16.200 --> 00:11:18.600
559
+ que sea la máxima, el máximo elemento de
560
+
561
+ 00:11:18.600 --> 00:11:23.735
562
+ nuestro vector. Ahora, es muy importante saber qué
563
+
564
+ 00:11:23.735 --> 00:11:26.775
565
+ métrica estamos utilizando para medir distancias, ya que
566
+
567
+ 00:11:26.775 --> 00:11:28.855
568
+ la forma en la que medimos distancias está
569
+
570
+ 00:11:28.855 --> 00:11:31.895
571
+ en total correspondencia con cómo estamos configurando el
572
+
573
+ 00:11:31.895 --> 00:11:35.020
574
+ espacio y cómo lo estamos percibiendo. Por ejemplo,
575
+
576
+ 00:11:35.020 --> 00:11:37.820
577
+ mientras que la métrica se euclidiana, esta métrica
578
+
579
+ 00:11:37.820 --> 00:11:39.500
580
+ va a corresponder a la línea más corta
581
+
582
+ 00:11:39.500 --> 00:11:42.460
583
+ entre dos vectores en el espacio. En el
584
+
585
+ 00:11:42.460 --> 00:11:45.660
586
+ espacio plano, por supuesto. Mientras que en el
587
+
588
+ 00:11:45.660 --> 00:11:48.355
589
+ caso de la métrica del taxista, esta será
590
+
591
+ 00:11:48.355 --> 00:11:50.194
592
+ la más corta, pero no en el sentido
593
+
594
+ 00:11:50.194 --> 00:11:54.514
595
+ de una línea recta, serán segmentos, serán distancias
596
+
597
+ 00:11:54.514 --> 00:11:57.634
598
+ medidas por bloques. Vamos rápido de regreso a
599
+
600
+ 00:11:57.634 --> 00:11:59.975
601
+ Geogero para ver un breve ejemplo de esto.
602
+
603
+ 00:12:01.150 --> 00:12:03.230
604
+ Ahora, una cosa muy interesante por lo cual
605
+
606
+ 00:12:03.230 --> 00:12:04.830
607
+ voy a utilizar el grid es que en
608
+
609
+ 00:12:04.830 --> 00:12:06.510
610
+ el caso de la norma de taxista o
611
+
612
+ 00:12:06.510 --> 00:12:08.590
613
+ norma L uno, nos va a ayudar mucho
614
+
615
+ 00:12:08.590 --> 00:12:10.750
616
+ este grid para poder ubicarnos, y lo que
617
+
618
+ 00:12:10.750 --> 00:12:13.390
619
+ pasa es esto. En una ciudad, por ejemplo,
620
+
621
+ 00:12:13.390 --> 00:12:14.990
622
+ en la Ciudad de México, en Colombia o
623
+
624
+ 00:12:14.990 --> 00:12:19.025
625
+ en Manhattan, si nosotros tuviéramos un destino en
626
+
627
+ 00:12:19.025 --> 00:12:23.685
628
+ el punto, vamos a trazar un punto, point,
629
+
630
+ 00:12:25.105 --> 00:12:31.589
631
+ y ese punto va a ser el, que
632
+
633
+ 00:12:31.589 --> 00:12:41.670
634
+ sea el tres coma tres. Tracemos, nos va
635
+
636
+ 00:12:41.670 --> 00:12:45.475
637
+ a ser más útil trazar un vector. Vector
638
+
639
+ 00:12:45.475 --> 00:12:47.475
640
+ y le vamos a dar el tres coma
641
+
642
+ 00:12:47.475 --> 00:12:52.355
643
+ tres. Ahora, si nosotros queremos ir de la
644
+
645
+ 00:12:52.355 --> 00:12:57.490
646
+ forma eucliviana del punto cero coma cero al
647
+
648
+ 00:12:57.490 --> 00:13:00.310
649
+ tres coma tres, lo que tendríamos que hacer
650
+
651
+ 00:13:00.370 --> 00:13:02.769
652
+ justamente es trazar la misma recta que está
653
+
654
+ 00:13:02.769 --> 00:13:05.490
655
+ trazando el el vector. Ese es el camino
656
+
657
+ 00:13:05.490 --> 00:13:08.230
658
+ más corto que podríamos hacer en el plano.
659
+
660
+ 00:13:08.865 --> 00:13:11.185
661
+ Pero en una ciudad no es así, en
662
+
663
+ 00:13:11.185 --> 00:13:13.365
664
+ una ciudad nos tenemos que ir por bloques.
665
+
666
+ 00:13:13.665 --> 00:13:15.745
667
+ Entonces, en lugar de hacer ese camino, lo
668
+
669
+ 00:13:15.745 --> 00:13:19.425
670
+ que haríamos sería recorrer el camino, quizá el
671
+
672
+ 00:13:19.425 --> 00:13:23.425
673
+ camino más corto sea hacer esta recta de
674
+
675
+ 00:13:23.425 --> 00:13:26.230
676
+ aquí, toda toda esta venida de aquí y
677
+
678
+ 00:13:26.690 --> 00:13:30.530
679
+ después subir toda esta venida de aquí. O
680
+
681
+ 00:13:30.530 --> 00:13:33.970
682
+ quizá a lo mejor sería llegar aquí, subir
683
+
684
+ 00:13:33.970 --> 00:13:37.110
685
+ aquí, llegar aquí, subir aquí, llegar aquí, subir
686
+
687
+ 00:13:37.570 --> 00:13:40.704
688
+ aquí y todo en zigzag hasta que lleguemos
689
+
690
+ 00:13:41.005 --> 00:13:43.485
691
+ aquí. Y si se dan cuenta, esa trayectoria
692
+
693
+ 00:13:43.485 --> 00:13:45.885
694
+ de aquí tiene su símil también en el
695
+
696
+ 00:13:45.885 --> 00:13:48.685
697
+ otro lado del del vector, sería subir todo
698
+
699
+ 00:13:48.685 --> 00:13:52.045
700
+ esto de aquí, llegar hasta acá, o podríamos
701
+
702
+ 00:13:52.045 --> 00:13:58.050
703
+ hacer este zigzag también. Ahora, lo que les
704
+
705
+ 00:13:58.050 --> 00:14:00.370
706
+ decía de que como midamos nos va a
707
+
708
+ 00:14:00.370 --> 00:14:02.050
709
+ cambiar la geometría y nos va a cambiar
710
+
711
+ 00:14:02.050 --> 00:14:05.410
712
+ las restricciones tiene total sentido, porque si nosotros
713
+
714
+ 00:14:05.410 --> 00:14:10.394
715
+ medimos de forma euclidiana podemos trazar diagonales si
716
+
717
+ 00:14:10.394 --> 00:14:12.635
718
+ medimos con la norma l dos. Si no
719
+
720
+ 00:14:12.635 --> 00:14:14.735
721
+ medimos con la norma l dos y medimos,
722
+
723
+ 00:14:14.795 --> 00:14:17.035
724
+ en cambio, con la norma l uno, estamos
725
+
726
+ 00:14:17.035 --> 00:14:21.455
727
+ totalmente restringidos a poder avanzar en líneas horizontales
728
+
729
+ 00:14:21.675 --> 00:14:23.834
730
+ y verticales, no vamos a poder avanzar en
731
+
732
+ 00:14:23.834 --> 00:14:27.589
733
+ diagonales. Ahora, ¿cómo se ve eso? Regresamos al
734
+
735
+ 00:14:27.589 --> 00:14:30.710
736
+ notebook. Vamos a simplificar las cosas y vamos
737
+
738
+ 00:14:30.710 --> 00:14:33.290
739
+ a tomar nuevamente dos vectores en r dos.
740
+
741
+ 00:14:33.430 --> 00:14:35.350
742
+ En el caso de r dos, vamos a
743
+
744
+ 00:14:35.350 --> 00:14:38.250
745
+ agarrarnos dos coma uno y uno coma dos.
746
+
747
+ 00:14:38.355 --> 00:14:41.154
748
+ Y en el caso de la norma l
749
+
750
+ 00:14:41.154 --> 00:14:45.014
751
+ dos, vamos a tener que eso es dos
752
+
753
+ 00:14:45.115 --> 00:14:50.115
754
+ menos uno al cuadrado más uno menos dos
755
+
756
+ 00:14:50.115 --> 00:14:52.460
757
+ al cuadrado, y esto de aquí nos da
758
+
759
+ 00:14:52.460 --> 00:14:54.220
760
+ un uno y este de aquí nos da
761
+
762
+ 00:14:54.220 --> 00:14:56.300
763
+ un uno y uno al cuadrado nos sigue
764
+
765
+ 00:14:56.300 --> 00:14:59.100
766
+ dando un uno, y esto nos da un
767
+
768
+ 00:14:59.100 --> 00:15:01.440
769
+ dos, entonces nos queda la raíz de dos.
770
+
771
+ 00:15:02.140 --> 00:15:04.425
772
+ Mientras que si agarramos la norma l uno,
773
+
774
+ 00:15:04.505 --> 00:15:05.865
775
+ lo que vamos a tener es que en
776
+
777
+ 00:15:05.865 --> 00:15:08.925
778
+ la resta de los vectores, este menos este
779
+
780
+ 00:15:09.385 --> 00:15:12.745
781
+ nos da un uno en valor absoluto. Luego
782
+
783
+ 00:15:12.745 --> 00:15:15.625
784
+ viene este menos este, que es nos da
785
+
786
+ 00:15:15.625 --> 00:15:18.180
787
+ un uno también porque está en valor absoluto,
788
+
789
+ 00:15:18.500 --> 00:15:20.660
790
+ y al final, si lo sumamos, nos da
791
+
792
+ 00:15:20.660 --> 00:15:24.420
793
+ un dos. Las distancias cambian totalmente, es decir,
794
+
795
+ 00:15:24.420 --> 00:15:27.460
796
+ ya no estamos hablando de una raíz de
797
+
798
+ 00:15:27.460 --> 00:15:31.060
799
+ dos, sino estamos hablando de un dos. Vamos
800
+
801
+ 00:15:31.060 --> 00:15:32.920
802
+ a ver cómo se ve esto con geoghebre
803
+
804
+ 00:15:32.980 --> 00:15:37.675
805
+ en el plano. Bien. Ahora, ya tenemos nuestros
806
+
807
+ 00:15:37.675 --> 00:15:41.755
808
+ vectores trazados aquí. Nosotros sabemos que utilizando la
809
+
810
+ 00:15:41.755 --> 00:15:44.315
811
+ norma euclidiana, el vector que deberíamos de trazar,
812
+
813
+ 00:15:44.315 --> 00:15:47.035
814
+ que sería el más corso, sería exactamente este
815
+
816
+ 00:15:47.035 --> 00:15:50.790
817
+ de aquí. Entonces, veamos qué pasa ahí. Sería
818
+
819
+ 00:15:51.570 --> 00:15:56.390
820
+ el vector que va del dos coma uno
821
+
822
+ 00:15:57.890 --> 00:16:03.170
823
+ hacia el uno coma dos, y ese vector
824
+
825
+ 00:16:03.170 --> 00:16:06.675
826
+ nos da el menos uno uno. La longitud
827
+
828
+ 00:16:06.675 --> 00:16:09.334
829
+ de este vector, la magnitud, si la sacamos,
830
+
831
+ 00:16:09.394 --> 00:16:12.755
832
+ nos da exactamente dos, es este al cuadrado
833
+
834
+ 00:16:12.755 --> 00:16:16.515
835
+ más este al cuadrado. Nos da un dos,
836
+
837
+ 00:16:16.515 --> 00:16:18.675
838
+ y después la raíz de esa suma, que
839
+
840
+ 00:16:18.675 --> 00:16:21.620
841
+ sería raíz de dos. En cambio, les voy
842
+
843
+ 00:16:21.620 --> 00:16:24.899
844
+ a mostrar cómo lo haríamos si fuera a
845
+
846
+ 00:16:24.899 --> 00:16:28.820
847
+ través de l uno. En l uno no
848
+
849
+ 00:16:28.820 --> 00:16:32.260
850
+ podemos hacer estas diagonales, entonces nos tendríamos que
851
+
852
+ 00:16:32.260 --> 00:16:35.805
853
+ ir del punto primero, por ejemplo, una ruta
854
+
855
+ 00:16:35.805 --> 00:16:42.125
856
+ sería irnos del punto dos coma uno al
857
+
858
+ 00:16:42.125 --> 00:16:49.820
859
+ punto uno coma uno. Y eso nos da
860
+
861
+ 00:16:49.959 --> 00:16:54.120
862
+ este trazo de aquí. Y luego tendríamos que
863
+
864
+ 00:16:54.120 --> 00:16:57.560
865
+ hacer el trazo hacia arriba, que sería el
866
+
867
+ 00:16:57.560 --> 00:17:12.974
868
+ vector que va del uno coma uno al
869
+
870
+ 00:17:12.974 --> 00:17:17.570
871
+ uno coma dos. Entonces, la ruta que tendrías
872
+
873
+ 00:17:17.630 --> 00:17:19.970
874
+ que seguir si fueras un taxista en Manhattan
875
+
876
+ 00:17:20.190 --> 00:17:22.270
877
+ no podría ser esta diagonal porque no podemos
878
+
879
+ 00:17:22.270 --> 00:17:25.570
880
+ pasar por arriba de los edificios, tendrías que
881
+
882
+ 00:17:25.630 --> 00:17:29.090
883
+ llevar toda esta manzana y después subir aquí.
884
+
885
+ 00:17:29.945 --> 00:17:32.585
886
+ Ahora, si nos damos cuenta, la magnitud de
887
+
888
+ 00:17:32.585 --> 00:17:34.425
889
+ este vector de aquí, que es este de
890
+
891
+ 00:17:34.425 --> 00:17:38.905
892
+ aquí, es exactamente uno, y ya recorrimos un
893
+
894
+ 00:17:38.905 --> 00:17:42.390
895
+ uno en esta distancia, y después tenemos que
896
+
897
+ 00:17:42.390 --> 00:17:45.830
898
+ subir, y la magnitud de este vector de
899
+
900
+ 00:17:45.830 --> 00:17:49.430
901
+ aquí es también uno, y como recorrimos uno
902
+
903
+ 00:17:49.430 --> 00:17:51.930
904
+ hacia k y uno hacia k, la distancia
905
+
906
+ 00:17:52.070 --> 00:17:55.195
907
+ entre este punto y este punto para la
908
+
909
+ 00:17:55.195 --> 00:17:57.514
910
+ norma del taxista ya no es raíz de
911
+
912
+ 00:17:57.514 --> 00:18:03.215
913
+ dos, sino es dos. Es así como cambiar
914
+
915
+ 00:18:03.514 --> 00:18:05.595
916
+ simplemente la forma en la que medimos las
917
+
918
+ 00:18:05.595 --> 00:18:07.514
919
+ distancias nos va a alterar la geometría por
920
+
921
+ 00:18:07.514 --> 00:18:10.309
922
+ completo, y entonces hay que pensar si vamos
923
+
924
+ 00:18:10.309 --> 00:18:12.409
925
+ a tener la libertad de volar arriba de
926
+
927
+ 00:18:12.789 --> 00:18:14.630
928
+ edificios o si vamos a estar constreñidos por
929
+
930
+ 00:18:14.630 --> 00:18:18.309
931
+ las calles. Ahora, hay una medida que vamos
932
+
933
+ 00:18:18.309 --> 00:18:20.710
934
+ a utilizar hacia el futuro y esa medida
935
+
936
+ 00:18:20.710 --> 00:18:24.015
937
+ es la desviación cuadrática media. La desviación cuadrática
938
+
939
+ 00:18:24.155 --> 00:18:28.875
940
+ media entre dos vectores XYY es simplemente la
941
+
942
+ 00:18:28.875 --> 00:18:34.395
943
+ distancia del vector x al y entre la
944
+
945
+ 00:18:34.395 --> 00:18:43.020
946
+ raíz de la dimensión. Ahora, una cosa muy
947
+
948
+ 00:18:43.020 --> 00:18:44.860
949
+ importante es que el ejemplo en r dos
950
+
951
+ 00:18:44.860 --> 00:18:47.180
952
+ para nosotros es fácil de visualizar, lo podemos
953
+
954
+ 00:18:47.180 --> 00:18:49.120
955
+ ver en el plano, por ejemplo, con geoquebra.
956
+
957
+ 00:18:53.705 --> 00:18:56.045
958
+ A pesar de que nosotros ya no podamos
959
+
960
+ 00:18:56.905 --> 00:19:00.505
961
+ ver cosas, ya no podamos visualizar los vectores,
962
+
963
+ 00:19:00.505 --> 00:19:03.705
964
+ por ejemplo, vectores de r cuatro, las distancias
965
+
966
+ 00:19:03.705 --> 00:19:06.505
967
+ se siguen midiendo de la misma forma. Y
968
+
969
+ 00:19:06.505 --> 00:19:09.110
970
+ hay un gran problema también, porque que midamos
971
+
972
+ 00:19:09.250 --> 00:19:11.650
973
+ las distancias no nos va a implicar que
974
+
975
+ 00:19:11.650 --> 00:19:13.890
976
+ nosotros sepamos que es algo que está cerca
977
+
978
+ 00:19:13.890 --> 00:19:16.290
979
+ o que es algo que está lejos. Para
980
+
981
+ 00:19:16.290 --> 00:19:18.450
982
+ decir si algo está cerca o está lejos
983
+
984
+ 00:19:18.450 --> 00:19:21.185
985
+ tenemos que compararlo con algo. De hecho, todas
986
+
987
+ 00:19:21.185 --> 00:19:23.745
988
+ las medidas que hacemos hasta en la realidad,
989
+
990
+ 00:19:23.745 --> 00:19:25.825
991
+ cuando decimos que algo es pequeño o es
992
+
993
+ 00:19:25.825 --> 00:19:28.785
994
+ grande, nosotros ya lo estamos comparando con algo,
995
+
996
+ 00:19:28.785 --> 00:19:30.865
997
+ y si no, ya tenemos una experiencia como
998
+
999
+ 00:19:30.865 --> 00:19:33.745
1000
+ precedente para que podamos decir esto es grande
1001
+
1002
+ 00:19:33.745 --> 00:19:37.320
1003
+ o esto es pequeño. Bien, ahora, si consideramos
1004
+
1005
+ 00:19:37.320 --> 00:19:39.800
1006
+ estos tres vectores de aquí, para saber cuál
1007
+
1008
+ 00:19:39.800 --> 00:19:41.800
1009
+ está más cerca o para tener una noción
1010
+
1011
+ 00:19:41.800 --> 00:19:43.640
1012
+ de qué es o qué sería lo cerca,
1013
+
1014
+ 00:19:43.640 --> 00:19:46.200
1015
+ tendríamos que calcular la distancia entre esos tres
1016
+
1017
+ 00:19:46.200 --> 00:19:48.600
1018
+ vectores. La distancia entre el vector u y
1019
+
1020
+ 00:19:48.600 --> 00:19:50.440
1021
+ el vector v es ocho punto treinta y
1022
+
1023
+ 00:19:50.440 --> 00:19:52.575
1024
+ seis, la distancia entre el vector u y
1025
+
1026
+ 00:19:52.575 --> 00:19:55.535
1027
+ el vector w medidos con la norma euclidiana
1028
+
1029
+ 00:19:55.535 --> 00:19:57.775
1030
+ es cero punto treinta y ocho, y la
1031
+
1032
+ 00:19:57.775 --> 00:19:59.635
1033
+ distancia entre el vector v y el vector
1034
+
1035
+ 00:19:59.855 --> 00:20:02.895
1036
+ w es ocho punto sesenta y tres. Entonces,
1037
+
1038
+ 00:20:02.895 --> 00:20:06.120
1039
+ podemos decir que sí está más cerca el
1040
+
1041
+ 00:20:06.120 --> 00:20:08.539
1042
+ el u del w que lo que está,
1043
+
1044
+ 00:20:09.080 --> 00:20:10.760
1045
+ y bueno, podemos decir que los que están
1046
+
1047
+ 00:20:10.760 --> 00:20:12.679
1048
+ lejos son el u y el b, y
1049
+
1050
+ 00:20:12.679 --> 00:20:16.299
1051
+ el v y el w. Así y solamente
1052
+
1053
+ 00:20:16.360 --> 00:20:18.440
1054
+ así vamos a tener una noción de cercanía
1055
+
1056
+ 00:20:18.440 --> 00:20:24.975
1057
+ y de lontananza. Por último, como eso estaba
1058
+
1059
+ 00:20:24.975 --> 00:20:29.215
1060
+ teñido a las reglas de la norma y
1061
+
1062
+ 00:20:29.215 --> 00:20:31.855
1063
+ cumple las mismas propiedades que la norma, también
1064
+
1065
+ 00:20:31.855 --> 00:20:34.350
1066
+ la propiedad del triángulo se cumple, y eso
1067
+
1068
+ 00:20:34.350 --> 00:20:36.850
1069
+ lo podemos verificar de una manera muy sencilla,
1070
+
1071
+ 00:20:37.070 --> 00:20:39.669
1072
+ y es que si nos agarramos tres vectores
1073
+
1074
+ 00:20:39.669 --> 00:20:42.430
1075
+ cuales sea y nos agarramos la distancia entre
1076
+
1077
+ 00:20:42.430 --> 00:20:44.510
1078
+ el a y el c, la distancia entre
1079
+
1080
+ 00:20:44.510 --> 00:20:46.030
1081
+ el a y el c es lo mismo
1082
+
1083
+ 00:20:46.030 --> 00:20:48.375
1084
+ que la distancia, o bueno, que toda esta
1085
+
1086
+ 00:20:48.375 --> 00:20:53.095
1087
+ operación vectorial. Notemos que menos b más b
1088
+
1089
+ 00:20:53.095 --> 00:20:56.295
1090
+ es cero, entonces no estoy sumando nada, yo
1091
+
1092
+ 00:20:56.295 --> 00:20:58.775
1093
+ podría quitar esta expresión de aquí, tendría a
1094
+
1095
+ 00:20:58.775 --> 00:21:01.110
1096
+ menos c. Por eso a menos c es
1097
+
1098
+ 00:21:01.110 --> 00:21:04.310
1099
+ igual a a menos b más b menos
1100
+
1101
+ 00:21:04.310 --> 00:21:06.550
1102
+ c. A esto se le llama introducir un
1103
+
1104
+ 00:21:06.550 --> 00:21:09.910
1105
+ cero. Ahora, introduciendo este cero de aquí, yo
1106
+
1107
+ 00:21:09.910 --> 00:21:13.575
1108
+ puedo reagruparlo en dos conjuntos, porque yo sé
1109
+
1110
+ 00:21:13.575 --> 00:21:15.735
1111
+ que esto, como lo vimos antes, lo puedo
1112
+
1113
+ 00:21:15.735 --> 00:21:17.735
1114
+ agrupar en dos sumas, perdón. Y esto, como
1115
+
1116
+ 00:21:17.735 --> 00:21:22.875
1117
+ lo vimos antes agrupado, lo podemos utilizar para,
1118
+
1119
+ 00:21:23.255 --> 00:21:25.434
1120
+ no sé si recuerdan lo que vimos, que
1121
+
1122
+ 00:21:25.590 --> 00:21:30.630
1123
+ en la suma de vectores la norma del
1124
+
1125
+ 00:21:30.630 --> 00:21:33.510
1126
+ vector era a lo más, la la norma
1127
+
1128
+ 00:21:33.510 --> 00:21:35.669
1129
+ de la suma de vectores era a lo
1130
+
1131
+ 00:21:35.669 --> 00:21:40.485
1132
+ más la norma de la suma de las
1133
+
1134
+ 00:21:40.485 --> 00:21:43.924
1135
+ normas de los vectores individuales. La propiedad está
1136
+
1137
+ 00:21:43.924 --> 00:21:47.605
1138
+ acá arriba, si no se los recuerdo, es
1139
+
1140
+ 00:21:47.605 --> 00:21:51.480
1141
+ exactamente esta de aquí. Y entonces, en este
1142
+
1143
+ 00:21:51.480 --> 00:21:59.480
1144
+ caso, el papel de XYY serían a menos
1145
+
1146
+ 00:21:59.480 --> 00:22:01.740
1147
+ b y el otro sería b menos c.
1148
+
1149
+ 00:22:02.054 --> 00:22:05.638
1150
+ Entonces justamente tenemos que a menos c es
1151
+
1152
+ 00:22:05.638 --> 00:22:08.134
1153
+ menor que la la distancia de a menos
1154
+
1155
+ 00:22:08.134 --> 00:22:10.695
1156
+ b y la distancia de BAC. Esto lo
1157
+
1158
+ 00:22:10.695 --> 00:22:13.414
1159
+ puedes comprobar de manera muy rápida. Te invito
1160
+
1161
+ 00:22:13.414 --> 00:22:16.794
1162
+ a que vayas a utilizar estos dos vectores
1163
+
1164
+ 00:22:17.870 --> 00:22:20.830
1165
+ en una hoja de papel, sobre todo si
1166
+
1167
+ 00:22:20.830 --> 00:22:23.470
1168
+ la puedes tener cuadriculada de preferencia, y que
1169
+
1170
+ 00:22:23.470 --> 00:22:26.030
1171
+ calcules las distancias y que veas que esto
1172
+
1173
+ 00:22:26.030 --> 00:22:28.510
1174
+ siempre se va a cumplir. Espero ver tus
1175
+
1176
+ 00:22:28.510 --> 00:22:31.655
1177
+ imágenes en los comentarios. En la próxima clase
1178
+
1179
+ 00:22:31.655 --> 00:22:33.175
1180
+ vamos a ver una aplicación de lo que
1181
+
1182
+ 00:22:33.175 --> 00:22:35.655
1183
+ hemos visto en estas dos últimas clases. Si
1184
+
1185
+ 00:22:35.655 --> 00:22:38.535
1186
+ alguna vez has tenido problemas decidiendo hacia dónde
1187
+
1188
+ 00:22:38.535 --> 00:22:41.435
1189
+ marcar primero en el arrendamiento cuando estás buscando
1190
+
1191
+ 00:22:41.655 --> 00:22:44.289
1192
+ un nuevo apartamento, sin duda te va a
1193
+
1194
+ 00:22:44.289 --> 00:22:46.309
1195
+ seguir, te va a servir la siguiente clase.
1196
+
1197
+ 00:22:46.449 --> 00:22:47.508
1198
+ Nos vemos allá.
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Lecturas recomendadas.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ https://es.wikipedia.org/wiki/Postulados_de_Euclides
2
+ https://colab.research.google.com/drive/1pg6fxVEmEDlpou3JbEtnlZzcVckPGS8F?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/02-distancias_8e763fc2-5ce3-498b-91f8-711debd9e867.ipynb ADDED
@@ -0,0 +1,534 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 8. Distancia y Norma"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "En clases pasadas hablamos de la magnitud de un vector pero no dimos una forma de poder medirla, esa magnitud la podremos calcular a través de la *norma Euclidiana*:\n",
15
+ "\n",
16
+ "$$\n",
17
+ "||x|| = \\displaystyle\\sqrt{x_{0}^2 + x_{1}^2 + \\cdots + x_{n-1}^{2}} = \\displaystyle\\sqrt(x^Tx)\n",
18
+ "$$\n",
19
+ "\n",
20
+ "Hay que notar que $x$ en la expresión anterior es un $n$-vector. \n",
21
+ "Pongamos un ejemplo con $x^T = [1,2,3]$\n",
22
+ "\n",
23
+ "$$\n",
24
+ "||x|| = \\displaystyle\\sqrt{1^2 + 2^2 + 3^2} = \\sqrt{14} \\approx 3.74\n",
25
+ "$$\n",
26
+ "\n",
27
+ "Realizaremos otro con $x^T = [2,-1,2]$\n",
28
+ "\n",
29
+ "$$\n",
30
+ "||x|| = \\displaystyle\\sqrt{2^2 + (-1)^2 + 2^2} = \\sqrt{9} = 3\n",
31
+ "$$"
32
+ ]
33
+ },
34
+ {
35
+ "cell_type": "markdown",
36
+ "metadata": {},
37
+ "source": [
38
+ "## 8.1 Propieades de la norma"
39
+ ]
40
+ },
41
+ {
42
+ "cell_type": "markdown",
43
+ "metadata": {},
44
+ "source": [
45
+ "Como todas las operaciones con las que trabajamos hasta ahora la norma también cumple una serie de propiedades. Sean $x$, $y$ son $n$-vectores y $\\beta$ un escalar cualquiera, tenemos que la norma cumple:\n",
46
+ "* Homogeneídad no negativa: $||\\beta x|| = |\\beta|\\cdot ||x||$\n",
47
+ "\n",
48
+ "* Desigualdad del triángulo: $||x+y|| \\le ||x|| + ||y||$ \n",
49
+ "\n",
50
+ "* No-negatividad: $||x||\\ge 0$ y además $||x|| = 0$ si y solamente si $x = \\mathbf{0}$"
51
+ ]
52
+ },
53
+ {
54
+ "cell_type": "markdown",
55
+ "metadata": {},
56
+ "source": [
57
+ "La norma es ampliamente usada, en particular podemos señalar los siguientes ejemplos:\n",
58
+ "\n",
59
+ "**Valor cuadrático medio.** Algunas veces también es llamado simplemente **RMS** y se define como sigue:\n",
60
+ "\n",
61
+ "$$\n",
62
+ "rms(x) = \\displaystyle\\sqrt{\\frac{x_{0}^2 + x_{1}^2 + \\cdots + x_{n-1}^{2}}{n}} = \\frac{||x||}{\\sqrt{n}}\n",
63
+ "$$"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "markdown",
68
+ "metadata": {},
69
+ "source": [
70
+ "**Norma de una suma.** Si tenemos dos vectores $x$ y $y$ entonces la norma de la suma es\n",
71
+ "\n",
72
+ "$$\n",
73
+ "||x+y|| = \\displaystyle\\sqrt{||x||^{2} + 2x^{T}y + ||y||^{2}}\n",
74
+ "$$"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "markdown",
79
+ "metadata": {},
80
+ "source": [
81
+ "**Norma de una bloque de vectores.** La norma de bloque de vectores será simplemente la raíz cuadrada de la suma de sus componentes. Si tenemos $d$ un $k$-vector con componentes $d_{i}$ que son $n$-vectores entonces tenemos que:\n",
82
+ "\n",
83
+ "$$\n",
84
+ "||d|| = \\displaystyle\\sqrt{||d_{0}||^{2}+||d_{1}||^{2}+\\cdots + ||d_{n-1}||^{2}}\n",
85
+ "$$"
86
+ ]
87
+ },
88
+ {
89
+ "cell_type": "code",
90
+ "execution_count": 1,
91
+ "metadata": {},
92
+ "outputs": [],
93
+ "source": [
94
+ "import numpy as np"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 2,
100
+ "metadata": {},
101
+ "outputs": [],
102
+ "source": [
103
+ "u = np.array([1,1])"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": 3,
109
+ "metadata": {},
110
+ "outputs": [],
111
+ "source": [
112
+ "def norma(x):\n",
113
+ " return np.sqrt(x@x)"
114
+ ]
115
+ },
116
+ {
117
+ "cell_type": "code",
118
+ "execution_count": 4,
119
+ "metadata": {},
120
+ "outputs": [
121
+ {
122
+ "data": {
123
+ "text/plain": [
124
+ "1.4142135623730951"
125
+ ]
126
+ },
127
+ "execution_count": 4,
128
+ "metadata": {},
129
+ "output_type": "execute_result"
130
+ }
131
+ ],
132
+ "source": [
133
+ "norma(u)"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "markdown",
138
+ "metadata": {},
139
+ "source": [
140
+ "$2*u^T = [2,2]$ entonces la norma será $||2u|| = \\displaystyle\\sqrt{2^2 + 2^2} = \\displaystyle\\sqrt{8}$"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": 5,
146
+ "metadata": {},
147
+ "outputs": [
148
+ {
149
+ "data": {
150
+ "text/plain": [
151
+ "2.8284271247461903"
152
+ ]
153
+ },
154
+ "execution_count": 5,
155
+ "metadata": {},
156
+ "output_type": "execute_result"
157
+ }
158
+ ],
159
+ "source": [
160
+ "norma(2*u)"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 6,
166
+ "metadata": {},
167
+ "outputs": [
168
+ {
169
+ "data": {
170
+ "text/plain": [
171
+ "2.8284271247461903"
172
+ ]
173
+ },
174
+ "execution_count": 6,
175
+ "metadata": {},
176
+ "output_type": "execute_result"
177
+ }
178
+ ],
179
+ "source": [
180
+ "2*norma(u)"
181
+ ]
182
+ },
183
+ {
184
+ "cell_type": "code",
185
+ "execution_count": 7,
186
+ "metadata": {},
187
+ "outputs": [],
188
+ "source": [
189
+ "v = np.array([-1,1])"
190
+ ]
191
+ },
192
+ {
193
+ "cell_type": "code",
194
+ "execution_count": 8,
195
+ "metadata": {},
196
+ "outputs": [
197
+ {
198
+ "name": "stdout",
199
+ "output_type": "stream",
200
+ "text": [
201
+ "||u+v|| = 2.0\n"
202
+ ]
203
+ }
204
+ ],
205
+ "source": [
206
+ "print('||u+v|| = ',norma(u+v))"
207
+ ]
208
+ },
209
+ {
210
+ "cell_type": "code",
211
+ "execution_count": 9,
212
+ "metadata": {},
213
+ "outputs": [
214
+ {
215
+ "name": "stdout",
216
+ "output_type": "stream",
217
+ "text": [
218
+ "||v|| = 1.4142135623730951\n"
219
+ ]
220
+ }
221
+ ],
222
+ "source": [
223
+ "print('||v|| = ',norma(v))"
224
+ ]
225
+ },
226
+ {
227
+ "cell_type": "code",
228
+ "execution_count": 10,
229
+ "metadata": {},
230
+ "outputs": [
231
+ {
232
+ "name": "stdout",
233
+ "output_type": "stream",
234
+ "text": [
235
+ "¿Es verdad que ||u+v|| menor o igual que ||u||+||v|| True\n"
236
+ ]
237
+ }
238
+ ],
239
+ "source": [
240
+ "print('¿Es verdad que ||u+v|| menor o igual que ||u||+||v||', norma(u+v) <= norma(v)+norma(u))"
241
+ ]
242
+ },
243
+ {
244
+ "cell_type": "markdown",
245
+ "metadata": {},
246
+ "source": [
247
+ " "
248
+ ]
249
+ },
250
+ {
251
+ "cell_type": "markdown",
252
+ "metadata": {},
253
+ "source": [
254
+ "## 8.1 Distancia entre vectores"
255
+ ]
256
+ },
257
+ {
258
+ "cell_type": "markdown",
259
+ "metadata": {},
260
+ "source": [
261
+ "Podemos usar la norma pora definir la distancia entre dos vectores $\\mathbf{a}$ y $\\mathbf{b}$ como la norma de la diferencia de los vectores\n",
262
+ "\n",
263
+ "$$\n",
264
+ "dist(\\mathbf{a},\\mathbf{b}) = ||\\mathbf{a} - \\mathbf{b}|| = \\displaystyle\\sqrt{(a_{0}-b_{0})^2 + (a_{1}-b_{1})^2 + \\cdots + (a_{n-1}-b_{n-1})^2}\n",
265
+ "$$"
266
+ ]
267
+ },
268
+ {
269
+ "cell_type": "code",
270
+ "execution_count": 11,
271
+ "metadata": {},
272
+ "outputs": [],
273
+ "source": [
274
+ "a = np.array([1,1])\n",
275
+ "b = np.array([-2,3])"
276
+ ]
277
+ },
278
+ {
279
+ "cell_type": "code",
280
+ "execution_count": 12,
281
+ "metadata": {},
282
+ "outputs": [],
283
+ "source": [
284
+ "c = a - b"
285
+ ]
286
+ },
287
+ {
288
+ "cell_type": "code",
289
+ "execution_count": 15,
290
+ "metadata": {},
291
+ "outputs": [
292
+ {
293
+ "data": {
294
+ "text/plain": [
295
+ "3.605551275463989"
296
+ ]
297
+ },
298
+ "execution_count": 15,
299
+ "metadata": {},
300
+ "output_type": "execute_result"
301
+ }
302
+ ],
303
+ "source": [
304
+ "norma(a-b)"
305
+ ]
306
+ },
307
+ {
308
+ "cell_type": "code",
309
+ "execution_count": 16,
310
+ "metadata": {},
311
+ "outputs": [
312
+ {
313
+ "data": {
314
+ "text/plain": [
315
+ "3.605551275463989"
316
+ ]
317
+ },
318
+ "execution_count": 16,
319
+ "metadata": {},
320
+ "output_type": "execute_result"
321
+ }
322
+ ],
323
+ "source": [
324
+ "np.linalg.norm(a-b)"
325
+ ]
326
+ },
327
+ {
328
+ "cell_type": "markdown",
329
+ "metadata": {},
330
+ "source": [
331
+ "A esto se el llama _norma Euclidiana_ o *distancia Euclidiana* y tiene ese nombre porque es como se infiere la forma de medir distancias de los [postulados de Euclides](https://es.wikipedia.org/wiki/Postulados_de_Euclides). Ahora, la realidad es que siempre que nuestro espacio admita una $\\mathbf{L^p}$-norma entonces podremos generalizar la norma anterior como\n",
332
+ "\n",
333
+ "$$\n",
334
+ "||x||_{p} = \\left(|x_{0}|^p + |x_{1}|^p + \\cdots + |x_{n-1}|^p\\right)^{1/p} \\qquad con \\;\\; 1\\le p\n",
335
+ "$$"
336
+ ]
337
+ },
338
+ {
339
+ "cell_type": "markdown",
340
+ "metadata": {},
341
+ "source": [
342
+ "Por eso es que la norma Euclidiana también es conocida como la *norma $L_{2}$*. Hay otras normas que recibe nombres. Por ejemplo, si $p=1$ tenemos la norma $L_{1}$ y esta es llamada _la métrica del taxista_ o _la métrica de Manhattan_. Si tomamos $p \\to \\infty$ entonces tenemos $L_{\\infty}$ y esta es llamada _la métrica del máximo_. Es muy importante saber qué métrica estamos usando para medir distancias ya que la forma en la que medimos distancias está en total correspondencia en con configuración y la percepción el espacio. Por ejemplo, mientras que en la métrica Euclidiana la distancia corresponde a la más corta entre los dos vectores en el espacio planeo en el caso de la métrica del taxista es la más corta pero no será es segmento más directo sino por _bloques_."
343
+ ]
344
+ },
345
+ {
346
+ "cell_type": "markdown",
347
+ "metadata": {},
348
+ "source": [
349
+ "Para poder simplificar las cosas tomemos dos vectores $\\mathbf{x}$ y $\\mathbf{y}$ en $\\mathbb{R}^2$\n",
350
+ "\n",
351
+ "$$\n",
352
+ "\\mathbf{x} = \\begin{bmatrix} 2\\\\1 \\end{bmatrix},\\; \\qquad \\mathbf{y} = \\begin{bmatrix} 1\\\\2 \\end{bmatrix}\n",
353
+ "$$\n",
354
+ "\n",
355
+ "La distancia en el caso de norma $L_{2}$ tenemos que la distancia entre los vectores es $||\\mathbf{x}-\\mathbf{y}||_{2} = \\displaystyle\\sqrt{(2-1)^{2} + (1-2)^{2}} = \\displaystyle\\sqrt{2}$ mientras que bajo la norma $L_{1}$ obtenemos que $||\\mathbf{x}-\\mathbf{y}||_{1} = |2-1|+|1-2| = 2$. "
356
+ ]
357
+ },
358
+ {
359
+ "cell_type": "markdown",
360
+ "metadata": {},
361
+ "source": [
362
+ "Ahora, si $\\mathbf{x}$ y $\\mathbf{y}$ son $n$-vectores hay una medida quer después cobrará importancia, *la desviación cuadrática media*\n",
363
+ "\n",
364
+ "$$\n",
365
+ "rms_{dev}(\\mathbf{x},\\mathbf{y}) = \\displaystyle\\frac{||\\mathbf{x}-\\mathbf{y}||}{\\sqrt{n}}\n",
366
+ "$$"
367
+ ]
368
+ },
369
+ {
370
+ "cell_type": "markdown",
371
+ "metadata": {},
372
+ "source": [
373
+ " "
374
+ ]
375
+ },
376
+ {
377
+ "cell_type": "markdown",
378
+ "metadata": {},
379
+ "source": [
380
+ "Algo muy imporante es que a pesar de que medimos distancias no existen propiamente nociones de *cerca* y *lejos*. Si tomamos los siguientes $4$-vectores\n",
381
+ "\n",
382
+ "$$\n",
383
+ "\\mathbf{u} = \\begin{bmatrix}1.8 \\\\ 2.8 \\\\ -3.7 \\\\ 4.7 \\end{bmatrix}, \\qquad \\mathbf{v} = \\begin{bmatrix}0.6 \\\\ 2.1 \\\\ 1.9 \\\\ -1.4 \\end{bmatrix}, \\qquad \\mathbf{w} = \\begin{bmatrix}2.0 \\\\ 1.9 \\\\ -4.0 \\\\ 4.6 \\end{bmatrix}\n",
384
+ "$$\n",
385
+ "\n",
386
+ "Tenemos que las distancia entre los vectores es:\n",
387
+ "\n",
388
+ "$$\n",
389
+ "||\\mathbf{u}-\\mathbf{v}|| = 8.36, \\qquad ||\\mathbf{u}-\\mathbf{w}|| = 0.38, \\qquad ||\\mathbf{v}-\\mathbf{w}|| = 8.63\n",
390
+ "$$\n",
391
+ "\n",
392
+ "Entonces así ya tenemos noción de cercanía o lontanaza, de no ser porque comparamos no tendríamos estas nociones. "
393
+ ]
394
+ },
395
+ {
396
+ "cell_type": "markdown",
397
+ "metadata": {},
398
+ "source": [
399
+ " "
400
+ ]
401
+ },
402
+ {
403
+ "cell_type": "markdown",
404
+ "metadata": {},
405
+ "source": [
406
+ "**Desigualdad del triángulo.** Debido a que la distancia la definimos a partir de la norma entonces la distancia también está sujeta a cumplir la desigualdad del triángulo. Considemos entonces tres $n$-vectores $\\mathbf{a}$,$\\mathbf{b}$ y $\\mathbf{c}$ entonces tenemos\n",
407
+ "\n",
408
+ "$$\n",
409
+ "||\\mathbf{a}-\\mathbf{c}|| = ||\\mathbf{a}-\\mathbf{b}+\\mathbf{b}-\\mathbf{c}|| \\le ||\\mathbf{a}-\\mathbf{b}|| + ||\\mathbf{b}-\\mathbf{c}||\n",
410
+ "$$"
411
+ ]
412
+ },
413
+ {
414
+ "cell_type": "markdown",
415
+ "metadata": {},
416
+ "source": [
417
+ "Vamos a partir de los siguientes $2$-vectores:\n",
418
+ "$$\n",
419
+ "\\mathbf{a} = \\begin{bmatrix} 1\\\\ 1 \\end{bmatrix}, \\qquad \\mathbf{b} = \\begin{bmatrix} 2\\\\ 3 \\end{bmatrix}, \\qquad \\mathbf{c} = \\begin{bmatrix} 4\\\\ 2 \\end{bmatrix}\n",
420
+ "$$"
421
+ ]
422
+ },
423
+ {
424
+ "cell_type": "markdown",
425
+ "metadata": {},
426
+ "source": [
427
+ " "
428
+ ]
429
+ },
430
+ {
431
+ "cell_type": "markdown",
432
+ "metadata": {},
433
+ "source": [
434
+ "## 8.3 Una aplicación"
435
+ ]
436
+ },
437
+ {
438
+ "cell_type": "markdown",
439
+ "metadata": {},
440
+ "source": [
441
+ "**Visita óptima de apartamentos para arrendar.** Supongamos que estamos en búsqueda de alquilar un apartamento. Comenzamos buscando caracacterísticas como cantidad de recámaras, cantidad de baños, estacionamientos, zona y tamaño. Un problema es que algunas veces llegamos a colectar una gran cantidad de anuncios y contactos y organizarnos para ir a las visitas puede parecer prácticamte imposible y puede que dejemos escapar una gran oportunidad. Afortunadamente en este curso vamos a proponer una solución: vamos a partir de nuestro departamento ideal y vamos a representarlo como un vector de caracteristicas, construimos el mismo vector para los apartamentos que ya tengamos localizados y calculamos la distancia entre estos vectores y el vector que representa al departamento ideal. Los ordenamos por de manera ascendente y ya tendríamos una lista ordenada en prioridad de contacto y visita de apartamentos según nuestro apartamento ideal. \n",
442
+ "\n",
443
+ "Para esto, supongamos que las características que queremos tomar en cuenta son tamaño del apartamento, número de recámaras, número de baños y número de estacionamientos. Notemos que en el caso de tamaño del apartamento regularmente se nos da en metros cuadrados (área) pero el gran problema es que puede variar mucho y usar estos números *tan grandes* puede introducir una gran cantidad de ruido. Para resolver el problema anterior vamos a catalogar los tamaños de apartametos en categorias:\n",
444
+ "1. Si el área es menor que 60 metros cuadrados\n",
445
+ "2. Si el área es mayor o igual que 60 metros cuadrados pero menor que 80 metros cuadrados\n",
446
+ "3. Si el área es mayor o igual que 80 metros cuadrados pero menor que 110 metros cuadrados\n",
447
+ "4. Si el área es mayor o igual que 110 metros cuadrados pero menor que 130 metros cuadrados\n",
448
+ "5. Si el área es mayor o igual que 130 metros cuadrados. "
449
+ ]
450
+ },
451
+ {
452
+ "cell_type": "markdown",
453
+ "metadata": {},
454
+ "source": [
455
+ "Supongamos también que el orden de las características en el vector es categoria de tamaño, número de recámaras, número de baños y número estacionamientos. Nuestro apartamento ideal viene dado por el siguiente vector:\n",
456
+ "\n",
457
+ "$$\n",
458
+ "\\mathbf{I} = \\begin{bmatrix} 3\\\\ 2\\\\ 2\\\\1 \\end{bmatrix}\n",
459
+ "$$\n",
460
+ "\n",
461
+ "Y nostros encontramos los siguientes apartamentos:\n",
462
+ "\n",
463
+ "$$\n",
464
+ "\\mathbf{A_{1}} = \\begin{bmatrix}4 \\\\3 \\\\ 3\\\\3 \\end{bmatrix}, \\qquad \\mathbf{A_{2}} = \\begin{bmatrix}3 \\\\3 \\\\ 1\\\\0 \\end{bmatrix}, \\qquad \\mathbf{A_{3}} = \\begin{bmatrix}5 \\\\4 \\\\ 3\\\\0 \\end{bmatrix}\n",
465
+ "$$"
466
+ ]
467
+ },
468
+ {
469
+ "cell_type": "code",
470
+ "execution_count": 21,
471
+ "metadata": {},
472
+ "outputs": [],
473
+ "source": [
474
+ "I = np.array([3,2,2,1])\n",
475
+ "A_1 = np.array([4,3,3,3])\n",
476
+ "A_2 = np.array([3,3,2,1])\n",
477
+ "A_3 = np.array([5,4,3,0])"
478
+ ]
479
+ },
480
+ {
481
+ "cell_type": "code",
482
+ "execution_count": 22,
483
+ "metadata": {},
484
+ "outputs": [
485
+ {
486
+ "name": "stdout",
487
+ "output_type": "stream",
488
+ "text": [
489
+ "||I-A_1|| = 2.6457513110645907\n",
490
+ "||I-A_2|| = 1.0\n",
491
+ "||I-A_3|| = 3.1622776601683795\n"
492
+ ]
493
+ }
494
+ ],
495
+ "source": [
496
+ "print('||I-A_1|| =',np.linalg.norm(I-A_1))\n",
497
+ "print('||I-A_2|| =',np.linalg.norm(I-A_2))\n",
498
+ "print('||I-A_3|| =',np.linalg.norm(I-A_3))"
499
+ ]
500
+ },
501
+ {
502
+ "cell_type": "markdown",
503
+ "metadata": {},
504
+ "source": [
505
+ "Este problema es el problema de encontrar el vector más cercano. Básicamte si tenemos una colección de N $n$-vectores $z_{0},z_{1},\\dots,z_{N-1}$ vamos a decir que $z_{i}$ es el vecino más cercano del vector $x$ si \n",
506
+ "\n",
507
+ "$$\n",
508
+ "||x-z_{i}|| \\le ||x - z_{j}|| \\quad con \\; \\; j = 0,\\dots, N-1\n",
509
+ "$$"
510
+ ]
511
+ }
512
+ ],
513
+ "metadata": {
514
+ "kernelspec": {
515
+ "display_name": "Python 3",
516
+ "language": "python",
517
+ "name": "python3"
518
+ },
519
+ "language_info": {
520
+ "codemirror_mode": {
521
+ "name": "ipython",
522
+ "version": 3
523
+ },
524
+ "file_extension": ".py",
525
+ "mimetype": "text/x-python",
526
+ "name": "python",
527
+ "nbconvert_exporter": "python",
528
+ "pygments_lexer": "ipython3",
529
+ "version": "3.7.3"
530
+ }
531
+ },
532
+ "nbformat": 4,
533
+ "nbformat_minor": 4
534
+ }
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Lecturas recomendadas.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ https://colab.research.google.com/drive/1pg6fxVEmEDlpou3JbEtnlZzcVckPGS8F?usp=sharing
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Optimización de Visitas para Arrendar Departamentos.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:93888c599c9db109c45abdd00119d35e9aac7579b7567a0ba582369a73d144ee
3
+ size 101123414
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Optimización de Visitas para Arrendar Departamentos.vtt ADDED
@@ -0,0 +1,595 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:03.120 --> 00:00:05.040
4
+ En esta clase vamos a ver una aplicación
5
+
6
+ 00:00:05.040 --> 00:00:07.120
7
+ de lo que aprendimos en las clases de
8
+
9
+ 00:00:07.120 --> 00:00:10.559
10
+ norma y de distancia entre vectores. Vamos allá
11
+
12
+ 00:00:10.559 --> 00:00:14.420
13
+ sin más. Esta aplicación se llama visita óptima
14
+
15
+ 00:00:14.480 --> 00:00:17.175
16
+ de apartamentos para arrendar, y el problema es
17
+
18
+ 00:00:17.175 --> 00:00:19.975
19
+ este, supongamos que tú quieres alquilar un nuevo
20
+
21
+ 00:00:19.975 --> 00:00:23.655
22
+ departamento, te quieres cambiar de apartamento y entonces
23
+
24
+ 00:00:23.655 --> 00:00:26.615
25
+ tú empiezas a buscar características como cantidad de
26
+
27
+ 00:00:26.615 --> 00:00:29.654
28
+ recámaras, cantidad de baños, estacionamientos, la zona en
29
+
30
+ 00:00:29.654 --> 00:00:32.739
31
+ la que está, el tamaño. Y un gran
32
+
33
+ 00:00:32.739 --> 00:00:34.579
34
+ problema es que a veces podemos llegar a
35
+
36
+ 00:00:34.579 --> 00:00:36.820
37
+ colectar una gran gran cantidad de anuncios y
38
+
39
+ 00:00:36.820 --> 00:00:39.300
40
+ contactos y organizarnos para ir a a las
41
+
42
+ 00:00:39.300 --> 00:00:42.600
43
+ visitas puede ser complicado, e incluso priorizar cuáles
44
+
45
+ 00:00:42.660 --> 00:00:45.879
46
+ deberíamos de hacer antes y después. Y puede
47
+
48
+ 00:00:46.055 --> 00:00:48.934
49
+ que por todo este enredo que tenemos, perdamos
50
+
51
+ 00:00:48.934 --> 00:00:52.315
52
+ una gran gran oportunidad de un departamento. Entonces,
53
+
54
+ 00:00:52.454 --> 00:00:54.394
55
+ por eso se me ocurrió hacer esta clase,
56
+
57
+ 00:00:54.614 --> 00:00:56.695
58
+ porque además es un ejemplo que nos podrá
59
+
60
+ 00:00:56.695 --> 00:01:00.840
61
+ ayudar en la vida real realmente. Ahora, por
62
+
63
+ 00:01:00.840 --> 00:01:03.000
64
+ eso, afortunadamente, en este curso les vamos a
65
+
66
+ 00:01:03.000 --> 00:01:05.019
67
+ dar la solución para esa clase de problemas.
68
+
69
+ 00:01:06.040 --> 00:01:08.760
70
+ Aquí voy a asumir que nosotros ya tenemos
71
+
72
+ 00:01:08.760 --> 00:01:10.840
73
+ en nuestra mente cuál va a ser nuestro
74
+
75
+ 00:01:10.840 --> 00:01:14.565
76
+ apartamento ideal y además que vamos a poder
77
+
78
+ 00:01:14.565 --> 00:01:19.685
79
+ presentar ese apartamento con características bien claras. Y
80
+
81
+ 00:01:19.685 --> 00:01:22.585
82
+ a partir de ese ideal vamos a buscar
83
+
84
+ 00:01:23.205 --> 00:01:26.320
85
+ describir los otros de los otros apartamentos con
86
+
87
+ 00:01:26.320 --> 00:01:29.360
88
+ esas mismas características, y ya los tenemos que
89
+
90
+ 00:01:29.360 --> 00:01:33.759
91
+ tener localizados. Eso está, esto es un súper
92
+
93
+ 00:01:33.759 --> 00:01:36.340
94
+ importante, tenemos que tener toda la información disponible.
95
+
96
+ 00:01:36.479 --> 00:01:38.775
97
+ Todo lo que queramos en nuestro departamento ideal
98
+
99
+ 00:01:38.775 --> 00:01:41.415
100
+ para que esto funcione, tenemos que tenemos que
101
+
102
+ 00:01:41.415 --> 00:01:44.695
103
+ ya saberlo a priori de los departamentos que
104
+
105
+ 00:01:44.695 --> 00:01:46.615
106
+ que ya que ya que ya obtuvimos, de
107
+
108
+ 00:01:46.615 --> 00:01:48.855
109
+ la información que ya obtuvimos. ¿Qué es lo
110
+
111
+ 00:01:48.855 --> 00:01:51.095
112
+ que vamos a hacer? Vamos a calcular la
113
+
114
+ 00:01:51.095 --> 00:01:54.229
115
+ distancia entre esos vectores y el vector que
116
+
117
+ 00:01:54.229 --> 00:01:58.070
118
+ para nosotros representa el departamento ideal. Lo vamos
119
+
120
+ 00:01:58.070 --> 00:02:00.229
121
+ los vamos a ordenar al final después de
122
+
123
+ 00:02:00.229 --> 00:02:03.030
124
+ manera ascendente y ya tendremos una lista de
125
+
126
+ 00:02:03.030 --> 00:02:05.350
127
+ prioridad de cuáles son los que están más
128
+
129
+ 00:02:05.350 --> 00:02:07.190
130
+ cerca, es decir, los que tienen la menor
131
+
132
+ 00:02:07.190 --> 00:02:11.055
133
+ distancia a nuestro vector, a nuestro apartamento ideal.
134
+
135
+ 00:02:11.595 --> 00:02:14.895
136
+ Ya sabríamos a quién contactar primero, cómo contactarlo
137
+
138
+ 00:02:15.035 --> 00:02:17.435
139
+ quizá, y si ese departamento nos conviene o
140
+
141
+ 00:02:17.435 --> 00:02:21.915
142
+ no. Para esto, vamos a suponer este caso
143
+
144
+ 00:02:21.915 --> 00:02:25.900
145
+ súper hipotético, en el que las características que
146
+
147
+ 00:02:25.900 --> 00:02:28.640
148
+ tenemos o queremos tomar en cuenta son únicamente
149
+
150
+ 00:02:28.780 --> 00:02:31.760
151
+ el tamaño del apartamento, el número de recámaras,
152
+
153
+ 00:02:31.980 --> 00:02:33.819
154
+ el número de baños y el número de
155
+
156
+ 00:02:33.819 --> 00:02:37.754
157
+ estacionamientos. Ahora, notemos que el tamaño del apartamento
158
+
159
+ 00:02:37.754 --> 00:02:40.875
160
+ regularmente se nos da en metros cuadrados, se
161
+
162
+ 00:02:40.875 --> 00:02:42.795
163
+ nos da el área total que tiene, y
164
+
165
+ 00:02:42.795 --> 00:02:44.474
166
+ eso es un gran problema porque el área
167
+
168
+ 00:02:44.474 --> 00:02:48.155
169
+ nos puede variar mucho. Ahora, si metemos en
170
+
171
+ 00:02:48.155 --> 00:02:50.406
172
+ un vector el número sesenta aquí, o el
173
+
174
+ 00:02:50.406 --> 00:02:52.300
175
+ número ochenta, o el número cien, o el
176
+
177
+ 00:02:52.300 --> 00:02:55.500
178
+ número ciento veinte, y después aquí tenemos un
179
+
180
+ 00:02:55.500 --> 00:02:57.840
181
+ tres, un dos y un uno, cuando saquemos
182
+
183
+ 00:02:57.900 --> 00:03:00.320
184
+ la magnitud de este vector, va a dominar
185
+
186
+ 00:03:00.380 --> 00:03:02.865
187
+ totalmente ese término de aquí, y entonces va
188
+
189
+ 00:03:02.865 --> 00:03:05.345
190
+ a estar totalmente influenciado por los metros que
191
+
192
+ 00:03:05.345 --> 00:03:07.505
193
+ tenga, lo cual no queremos que pase así,
194
+
195
+ 00:03:07.505 --> 00:03:10.165
196
+ queremos que cuenten todas las características del vector.
197
+
198
+ 00:03:10.785 --> 00:03:13.185
199
+ Entonces, lo que vamos a hacer es que,
200
+
201
+ 00:03:13.185 --> 00:03:16.460
202
+ para resolver este problema, vamos a a catalogar
203
+
204
+ 00:03:16.760 --> 00:03:20.120
205
+ los tamaños de los departamentos, es decir, vamos
206
+
207
+ 00:03:20.120 --> 00:03:23.640
208
+ a hacer categorías para áreas grandes, no vamos
209
+
210
+ 00:03:23.640 --> 00:03:25.900
211
+ a estar metiendo las áreas de manera directa.
212
+
213
+ 00:03:26.280 --> 00:03:29.420
214
+ Entonces, en el primero va a ser categoría
215
+
216
+ 00:03:29.560 --> 00:03:34.485
217
+ uno, si tiene menos de sesenta metros cuadrados.
218
+
219
+ 00:03:34.485 --> 00:03:37.285
220
+ Va a ser categoría dos, si el área
221
+
222
+ 00:03:37.285 --> 00:03:40.165
223
+ es mayor o igual que sesenta metros cuadrados,
224
+
225
+ 00:03:40.165 --> 00:03:43.140
226
+ pero menor que ochenta metros cuadrados. Va a
227
+
228
+ 00:03:43.140 --> 00:03:46.560
229
+ ser categoría tres, sí es de ochenta metros
230
+
231
+ 00:03:46.739 --> 00:03:49.540
232
+ cuadrados o más, pero que tiene menos de
233
+
234
+ 00:03:49.540 --> 00:03:52.520
235
+ ciento diez metros cuadrados. Va a ser categoría
236
+
237
+ 00:03:52.900 --> 00:03:55.720
238
+ cuatro si tiene más de ciento, tiene más
239
+
240
+ 00:03:55.860 --> 00:03:59.105
241
+ o ciento diez metros cuadrados, pero tiene menos
242
+
243
+ 00:03:59.105 --> 00:04:01.425
244
+ de ciento treinta metros cuadrados, y va a
245
+
246
+ 00:04:01.425 --> 00:04:05.285
247
+ ser categoría cinco si tiene más de ciento
248
+
249
+ 00:04:05.505 --> 00:04:07.825
250
+ ciento treinta metros cuadrados, no importa cuánto más
251
+
252
+ 00:04:07.825 --> 00:04:11.525
253
+ tenga. Estas van a ser nuestras cinco categorías
254
+
255
+ 00:04:11.665 --> 00:04:13.540
256
+ y, entonces, ya no tenemos que escribir, por
257
+
258
+ 00:04:13.540 --> 00:04:15.140
259
+ ejemplo, en el caso de la categoría dos,
260
+
261
+ 00:04:15.140 --> 00:04:18.820
262
+ iremos desde sesenta hasta ochenta metros, simplemente, todos
263
+
264
+ 00:04:18.820 --> 00:04:22.840
265
+ caerían dentro de la categoría dos. Ahora, supongamos
266
+
267
+ 00:04:22.980 --> 00:04:25.780
268
+ que el orden de las características en el
269
+
270
+ 00:04:25.780 --> 00:04:29.215
271
+ vector es categoría de tamaño, número de recámaras,
272
+
273
+ 00:04:29.514 --> 00:04:33.115
274
+ número de baños y número de estacionamientos. Para
275
+
276
+ 00:04:33.115 --> 00:04:35.514
277
+ esto, nuestro apartamento ideal va a venir dado
278
+
279
+ 00:04:35.514 --> 00:04:40.330
280
+ por el siguiente vector. Va a ser de
281
+
282
+ 00:04:40.330 --> 00:04:43.849
283
+ la categoría tres, es decir, el área va
284
+
285
+ 00:04:43.849 --> 00:04:47.690
286
+ a ser mayor o igual que ochenta metros
287
+
288
+ 00:04:47.690 --> 00:04:50.009
289
+ cuadrados y además va a ser menor el
290
+
291
+ 00:04:50.009 --> 00:04:53.235
292
+ área que ciento diez metros cuadrados. Ese sería
293
+
294
+ 00:04:53.235 --> 00:04:59.315
295
+ nuestro ideal. Luego tendría dos recámaras, tendría dos
296
+
297
+ 00:04:59.315 --> 00:05:03.794
298
+ baños y tendría solamente un estacionamiento. Ese sería
299
+
300
+ 00:05:03.794 --> 00:05:09.870
301
+ nuestro apartamento ideal. Ahora, nosotros la información que
302
+
303
+ 00:05:09.870 --> 00:05:13.950
304
+ encontramos de departamentos fue esta. Encontramos un cuatro
305
+
306
+ 00:05:13.950 --> 00:05:17.230
307
+ tres tres tres, recordemos, esto significa que es
308
+
309
+ 00:05:17.230 --> 00:05:20.030
310
+ de categoría cuatro, significa que el apartamento A
311
+
312
+ 00:05:20.030 --> 00:05:22.805
313
+ uno tiene un área mayor que ciento diez
314
+
315
+ 00:05:22.805 --> 00:05:25.285
316
+ metros cuadrados, pero menor que ciento treinta metros
317
+
318
+ 00:05:25.285 --> 00:05:29.765
319
+ cuadrados. Luego está que tiene tres recámaras, tiene
320
+
321
+ 00:05:29.765 --> 00:05:34.370
322
+ tres baños y tiene tres estacionamientos. Luego tenemos
323
+
324
+ 00:05:34.510 --> 00:05:37.170
325
+ el apartamento dos, que es de la categoría
326
+
327
+ 00:05:37.230 --> 00:05:39.570
328
+ tres, que es la categoría que nos interesaba
329
+
330
+ 00:05:41.550 --> 00:05:44.510
331
+ justamente. Tiene tres recámaras, tiene solo un baño
332
+
333
+ 00:05:44.510 --> 00:05:48.155
334
+ y no tiene estacionamiento. Y por último, está
335
+
336
+ 00:05:48.155 --> 00:05:51.375
337
+ el apartamento tres, que tiene es de categoría
338
+
339
+ 00:05:51.835 --> 00:05:53.995
340
+ cinco, es súper grande, más de ciento treinta
341
+
342
+ 00:05:53.995 --> 00:05:58.155
343
+ metros cuadrados. Tiene cuatro recámaras, tres baños y
344
+
345
+ 00:05:58.155 --> 00:06:01.690
346
+ tampoco tiene estacionamiento. Entonces, la pregunta es, si
347
+
348
+ 00:06:01.690 --> 00:06:04.730
349
+ yo tengo estos tres apartamentos, ¿a cuál debería
350
+
351
+ 00:06:04.730 --> 00:06:06.490
352
+ de hablar primero o cuál es el que
353
+
354
+ 00:06:06.490 --> 00:06:09.770
355
+ realmente me interesa? Porque todos son buenas ofertas
356
+
357
+ 00:06:09.770 --> 00:06:12.810
358
+ al final. Bueno, si lo comparamos contra nuestro
359
+
360
+ 00:06:12.810 --> 00:06:16.335
361
+ vector ideal obtendríamos esto. Para poder hacer esto,
362
+
363
+ 00:06:16.335 --> 00:06:20.015
364
+ primero tenemos que declarar nuestros arrays, y va
365
+
366
+ 00:06:20.015 --> 00:06:22.255
367
+ a ser nuestro vector ideal, a uno es
368
+
369
+ 00:06:22.255 --> 00:06:23.775
370
+ a uno, a dos es a dos y
371
+
372
+ 00:06:23.775 --> 00:06:25.775
373
+ a tres es a tres. Los podemos verificar
374
+
375
+ 00:06:25.775 --> 00:06:29.270
376
+ aquí. Y lo que vamos a hacer es
377
+
378
+ 00:06:29.270 --> 00:06:32.490
379
+ calcular la magnitud del vector de distancia entre
380
+
381
+ 00:06:33.430 --> 00:06:36.970
382
+ IYA uno. Entre más pequeña sea esta distancia,
383
+
384
+ 00:06:37.030 --> 00:06:39.430
385
+ significa que están más cerca y están más
386
+
387
+ 00:06:39.430 --> 00:06:41.930
388
+ cerca de lo que yo quiero tener. Entre
389
+
390
+ 00:06:42.470 --> 00:06:45.295
391
+ más lejos esté, entre entre estos, acuérdense que
392
+
393
+ 00:06:45.295 --> 00:06:47.935
394
+ necesito algo para poder compararlo y decir, ah,
395
+
396
+ 00:06:47.935 --> 00:06:50.495
397
+ ese es el que está más cerca y
398
+
399
+ 00:06:50.495 --> 00:06:52.035
400
+ ah, este es el que está más lejos,
401
+
402
+ 00:06:52.175 --> 00:06:54.175
403
+ entonces los vamos a poder ordenar y darles
404
+
405
+ 00:06:54.175 --> 00:06:56.975
406
+ prioridad en contacto. Si lo calculamos, lo que
407
+
408
+ 00:06:56.975 --> 00:07:00.160
409
+ obtenemos es que el que está más cerca
410
+
411
+ 00:07:00.160 --> 00:07:01.940
412
+ de lo que yo quiero de mi departamento
413
+
414
+ 00:07:02.639 --> 00:07:06.400
415
+ ideal es el departamento A dos. Entonces, el
416
+
417
+ 00:07:06.400 --> 00:07:08.160
418
+ primero que me debería de contactar y el
419
+
420
+ 00:07:08.160 --> 00:07:09.840
421
+ que le debería de dar prioridad si ya
422
+
423
+ 00:07:09.840 --> 00:07:12.320
424
+ no quiero seguir buscando departamentos es el A
425
+
426
+ 00:07:12.320 --> 00:07:16.055
427
+ dos. Ahora, otra cosa que podríamos hacer es
428
+
429
+ 00:07:16.055 --> 00:07:19.115
430
+ tratar de disminuir este número, encontrar un departamento
431
+
432
+ 00:07:19.575 --> 00:07:21.575
433
+ que quede por debajo de esta cota, es
434
+
435
+ 00:07:21.575 --> 00:07:23.095
436
+ decir, que esté más cerca de lo que
437
+
438
+ 00:07:23.095 --> 00:07:26.710
439
+ nosotros estamos buscando. Imagínense, voy a hacer ese
440
+
441
+ 00:07:26.710 --> 00:07:30.090
442
+ ejercicio, ¿cómo cambiaría si encontráramos este mismo departamento,
443
+
444
+ 00:07:30.630 --> 00:07:33.510
445
+ pero que si tuviera estacionamiento? Vamos a ponerle
446
+
447
+ 00:07:33.510 --> 00:07:38.070
448
+ al lado estacionamiento. Corro esta celda, corro esta
449
+
450
+ 00:07:38.070 --> 00:07:43.355
451
+ celda y bajó exactamente este número de aquí,
452
+
453
+ 00:07:43.355 --> 00:07:46.155
454
+ la distancia se hizo más pequeña. Entonces, justo
455
+
456
+ 00:07:46.155 --> 00:07:49.035
457
+ lo que estamos buscando ahorita es minimizar estas
458
+
459
+ 00:07:49.035 --> 00:07:51.514
460
+ distancias, no maximizarlas. Este número queremos que se
461
+
462
+ 00:07:51.514 --> 00:07:55.250
463
+ haga lo más pequeños posible. Entonces, al agregar
464
+
465
+ 00:07:55.250 --> 00:07:57.729
466
+ un estacionamiento, lo que pasó fue que se
467
+
468
+ 00:07:57.729 --> 00:08:00.210
469
+ redujo a cuarenta y uno, pero ¿qué pasa
470
+
471
+ 00:08:00.210 --> 00:08:02.449
472
+ si en lugar de agregar el estacionamiento yo
473
+
474
+ 00:08:02.449 --> 00:08:07.505
475
+ le pido que tenga los dos baños? Se
476
+
477
+ 00:08:07.505 --> 00:08:09.765
478
+ disminuye a uno punto cuarenta y uno también.
479
+
480
+ 00:08:10.625 --> 00:08:12.725
481
+ ¿Y qué pasa si en lugar de tener
482
+
483
+ 00:08:12.945 --> 00:08:17.505
484
+ dos baños tiene ves de categoría tres, tiene
485
+
486
+ 00:08:17.505 --> 00:08:21.289
487
+ las tres recámaras, tiene dos baños y además
488
+
489
+ 00:08:21.289 --> 00:08:25.789
490
+ tiene un estacionamiento. Bueno, pues lo que obtendríamos
491
+
492
+ 00:08:25.930 --> 00:08:28.330
493
+ es que se disminuye bastante la distancia. La
494
+
495
+ 00:08:28.330 --> 00:08:30.970
496
+ distancia ahora ya es uno, y este para
497
+
498
+ 00:08:30.970 --> 00:08:33.745
499
+ nosotros comparado con nosotros dos sería una señal
500
+
501
+ 00:08:33.745 --> 00:08:38.464
502
+ de ir a buscarlo totalmente. Este problema que
503
+
504
+ 00:08:38.464 --> 00:08:40.625
505
+ está aquí, que les estoy exponiendo, es un
506
+
507
+ 00:08:40.625 --> 00:08:42.544
508
+ problema que vamos a ver un poco más
509
+
510
+ 00:08:42.544 --> 00:08:45.024
511
+ adelante, y es el problema de encontrar el
512
+
513
+ 00:08:45.024 --> 00:08:47.980
514
+ vector más cercano, Y esto, básicamente, es que
515
+
516
+ 00:08:47.980 --> 00:08:50.940
517
+ si tenemos una colección de n vectores, que
518
+
519
+ 00:08:50.940 --> 00:08:53.840
520
+ son n vectores, es decir, n n vectores,
521
+
522
+ 00:08:54.700 --> 00:08:56.460
523
+ desde el z cero hasta el z n
524
+
525
+ 00:08:56.460 --> 00:08:58.380
526
+ menos uno, donde cada una de esos z
527
+
528
+ 00:08:58.380 --> 00:09:01.145
529
+ es un e vector, vamos a decir que
530
+
531
+ 00:09:01.145 --> 00:09:03.225
532
+ z I es el vecino más cercano al
533
+
534
+ 00:09:03.225 --> 00:09:07.305
535
+ vector x si cuando comparamos la distancia contra
536
+
537
+ 00:09:07.305 --> 00:09:10.345
538
+ todos, z I me da el número menor
539
+
540
+ 00:09:10.345 --> 00:09:13.899
541
+ que todas las otras distancias de estos zetas.
542
+
543
+ 00:09:13.899 --> 00:09:15.740
544
+ Es decir, que el z I que yo
545
+
546
+ 00:09:15.740 --> 00:09:19.820
547
+ me agarré dentro de estos n z vectores,
548
+
549
+ 00:09:19.820 --> 00:09:23.339
550
+ estos n n vectores z, va a ser
551
+
552
+ 00:09:23.339 --> 00:09:25.420
553
+ para z I el más pequeño. Este es
554
+
555
+ 00:09:25.420 --> 00:09:27.175
556
+ el que me va a minimizar justamente esta
557
+
558
+ 00:09:27.175 --> 00:09:33.175
559
+ distancia, esta longitud. Este ejercicio, sin duda, es
560
+
561
+ 00:09:33.175 --> 00:09:35.655
562
+ un ejercicio muy simplificado de un problema de
563
+
564
+ 00:09:35.655 --> 00:09:38.615
565
+ la vida real, lo podemos hacer más completo
566
+
567
+ 00:09:38.615 --> 00:09:41.735
568
+ y más complejo. ¿Qué características crees que le
569
+
570
+ 00:09:41.735 --> 00:09:44.830
571
+ faltan? Te pido que dejes en los comentarios
572
+
573
+ 00:09:45.050 --> 00:09:47.550
574
+ cómo complementarías tú este modelo y qué características
575
+
576
+ 00:09:47.770 --> 00:09:50.650
577
+ agregarías para que ayudes a la comunidad a
578
+
579
+ 00:09:50.650 --> 00:09:53.050
580
+ poder decidir mucho más rápido en el futuro
581
+
582
+ 00:09:53.050 --> 00:09:56.410
583
+ un departamento. Y aún más, nos queda un
584
+
585
+ 00:09:56.410 --> 00:09:59.524
586
+ problema que podremos hacer de aquí. ¿Cómo llevarías
587
+
588
+ 00:09:59.745 --> 00:10:02.385
589
+ a este problema a cómo elegir el mejor
590
+
591
+ 00:10:02.385 --> 00:10:06.545
592
+ súper cerca de tu casa? Espero verlo en
593
+
594
+ 00:10:06.545 --> 00:10:09.204
595
+ los comentarios. Nos vemos la próxima clase.
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-Resumen.html ADDED
The diff for this file is too large to render. See raw diff
 
a/Curso de Introducción al Álgebra Lineal Vectores/04-Norma y distancia/03-distancias_7eb83b35-ba4b-431d-9a1a-bd49eeaaf232.ipynb ADDED
@@ -0,0 +1,534 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# 8. Distancia y Norma"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "En clases pasadas hablamos de la magnitud de un vector pero no dimos una forma de poder medirla, esa magnitud la podremos calcular a través de la *norma Euclidiana*:\n",
15
+ "\n",
16
+ "$$\n",
17
+ "||x|| = \\displaystyle\\sqrt{x_{0}^2 + x_{1}^2 + \\cdots + x_{n-1}^{2}} = \\displaystyle\\sqrt(x^Tx)\n",
18
+ "$$\n",
19
+ "\n",
20
+ "Hay que notar que $x$ en la expresión anterior es un $n$-vector. \n",
21
+ "Pongamos un ejemplo con $x^T = [1,2,3]$\n",
22
+ "\n",
23
+ "$$\n",
24
+ "||x|| = \\displaystyle\\sqrt{1^2 + 2^2 + 3^2} = \\sqrt{14} \\approx 3.74\n",
25
+ "$$\n",
26
+ "\n",
27
+ "Realizaremos otro con $x^T = [2,-1,2]$\n",
28
+ "\n",
29
+ "$$\n",
30
+ "||x|| = \\displaystyle\\sqrt{2^2 + (-1)^2 + 2^2} = \\sqrt{9} = 3\n",
31
+ "$$"
32
+ ]
33
+ },
34
+ {
35
+ "cell_type": "markdown",
36
+ "metadata": {},
37
+ "source": [
38
+ "## 8.1 Propieades de la norma"
39
+ ]
40
+ },
41
+ {
42
+ "cell_type": "markdown",
43
+ "metadata": {},
44
+ "source": [
45
+ "Como todas las operaciones con las que trabajamos hasta ahora la norma también cumple una serie de propiedades. Sean $x$, $y$ son $n$-vectores y $\\beta$ un escalar cualquiera, tenemos que la norma cumple:\n",
46
+ "* Homogeneídad no negativa: $||\\beta x|| = |\\beta|\\cdot ||x||$\n",
47
+ "\n",
48
+ "* Desigualdad del triángulo: $||x+y|| \\le ||x|| + ||y||$ \n",
49
+ "\n",
50
+ "* No-negatividad: $||x||\\ge 0$ y además $||x|| = 0$ si y solamente si $x = \\mathbf{0}$"
51
+ ]
52
+ },
53
+ {
54
+ "cell_type": "markdown",
55
+ "metadata": {},
56
+ "source": [
57
+ "La norma es ampliamente usada, en particular podemos señalar los siguientes ejemplos:\n",
58
+ "\n",
59
+ "**Valor cuadrático medio.** Algunas veces también es llamado simplemente **RMS** y se define como sigue:\n",
60
+ "\n",
61
+ "$$\n",
62
+ "rms(x) = \\displaystyle\\sqrt{\\frac{x_{0}^2 + x_{1}^2 + \\cdots + x_{n-1}^{2}}{n}} = \\frac{||x||}{\\sqrt{n}}\n",
63
+ "$$"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "markdown",
68
+ "metadata": {},
69
+ "source": [
70
+ "**Norma de una suma.** Si tenemos dos vectores $x$ y $y$ entonces la norma de la suma es\n",
71
+ "\n",
72
+ "$$\n",
73
+ "||x+y|| = \\displaystyle\\sqrt{||x||^{2} + 2x^{T}y + ||y||^{2}}\n",
74
+ "$$"
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "markdown",
79
+ "metadata": {},
80
+ "source": [
81
+ "**Norma de una bloque de vectores.** La norma de bloque de vectores será simplemente la raíz cuadrada de la suma de sus componentes. Si tenemos $d$ un $k$-vector con componentes $d_{i}$ que son $n$-vectores entonces tenemos que:\n",
82
+ "\n",
83
+ "$$\n",
84
+ "||d|| = \\displaystyle\\sqrt{||d_{0}||^{2}+||d_{1}||^{2}+\\cdots + ||d_{n-1}||^{2}}\n",
85
+ "$$"
86
+ ]
87
+ },
88
+ {
89
+ "cell_type": "code",
90
+ "execution_count": 1,
91
+ "metadata": {},
92
+ "outputs": [],
93
+ "source": [
94
+ "import numpy as np"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 2,
100
+ "metadata": {},
101
+ "outputs": [],
102
+ "source": [
103
+ "u = np.array([1,1])"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": 3,
109
+ "metadata": {},
110
+ "outputs": [],
111
+ "source": [
112
+ "def norma(x):\n",
113
+ " return np.sqrt(x@x)"
114
+ ]
115
+ },
116
+ {
117
+ "cell_type": "code",
118
+ "execution_count": 4,
119
+ "metadata": {},
120
+ "outputs": [
121
+ {
122
+ "data": {
123
+ "text/plain": [
124
+ "1.4142135623730951"
125
+ ]
126
+ },
127
+ "execution_count": 4,
128
+ "metadata": {},
129
+ "output_type": "execute_result"
130
+ }
131
+ ],
132
+ "source": [
133
+ "norma(u)"
134
+ ]
135
+ },
136
+ {
137
+ "cell_type": "markdown",
138
+ "metadata": {},
139
+ "source": [
140
+ "$2*u^T = [2,2]$ entonces la norma será $||2u|| = \\displaystyle\\sqrt{2^2 + 2^2} = \\displaystyle\\sqrt{8}$"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": 5,
146
+ "metadata": {},
147
+ "outputs": [
148
+ {
149
+ "data": {
150
+ "text/plain": [
151
+ "2.8284271247461903"
152
+ ]
153
+ },
154
+ "execution_count": 5,
155
+ "metadata": {},
156
+ "output_type": "execute_result"
157
+ }
158
+ ],
159
+ "source": [
160
+ "norma(2*u)"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 6,
166
+ "metadata": {},
167
+ "outputs": [
168
+ {
169
+ "data": {
170
+ "text/plain": [
171
+ "2.8284271247461903"
172
+ ]
173
+ },
174
+ "execution_count": 6,
175
+ "metadata": {},
176
+ "output_type": "execute_result"
177
+ }
178
+ ],
179
+ "source": [
180
+ "2*norma(u)"
181
+ ]
182
+ },
183
+ {
184
+ "cell_type": "code",
185
+ "execution_count": 7,
186
+ "metadata": {},
187
+ "outputs": [],
188
+ "source": [
189
+ "v = np.array([-1,1])"
190
+ ]
191
+ },
192
+ {
193
+ "cell_type": "code",
194
+ "execution_count": 8,
195
+ "metadata": {},
196
+ "outputs": [
197
+ {
198
+ "name": "stdout",
199
+ "output_type": "stream",
200
+ "text": [
201
+ "||u+v|| = 2.0\n"
202
+ ]
203
+ }
204
+ ],
205
+ "source": [
206
+ "print('||u+v|| = ',norma(u+v))"
207
+ ]
208
+ },
209
+ {
210
+ "cell_type": "code",
211
+ "execution_count": 9,
212
+ "metadata": {},
213
+ "outputs": [
214
+ {
215
+ "name": "stdout",
216
+ "output_type": "stream",
217
+ "text": [
218
+ "||v|| = 1.4142135623730951\n"
219
+ ]
220
+ }
221
+ ],
222
+ "source": [
223
+ "print('||v|| = ',norma(v))"
224
+ ]
225
+ },
226
+ {
227
+ "cell_type": "code",
228
+ "execution_count": 10,
229
+ "metadata": {},
230
+ "outputs": [
231
+ {
232
+ "name": "stdout",
233
+ "output_type": "stream",
234
+ "text": [
235
+ "¿Es verdad que ||u+v|| menor o igual que ||u||+||v|| True\n"
236
+ ]
237
+ }
238
+ ],
239
+ "source": [
240
+ "print('¿Es verdad que ||u+v|| menor o igual que ||u||+||v||', norma(u+v) <= norma(v)+norma(u))"
241
+ ]
242
+ },
243
+ {
244
+ "cell_type": "markdown",
245
+ "metadata": {},
246
+ "source": [
247
+ " "
248
+ ]
249
+ },
250
+ {
251
+ "cell_type": "markdown",
252
+ "metadata": {},
253
+ "source": [
254
+ "## 8.1 Distancia entre vectores"
255
+ ]
256
+ },
257
+ {
258
+ "cell_type": "markdown",
259
+ "metadata": {},
260
+ "source": [
261
+ "Podemos usar la norma pora definir la distancia entre dos vectores $\\mathbf{a}$ y $\\mathbf{b}$ como la norma de la diferencia de los vectores\n",
262
+ "\n",
263
+ "$$\n",
264
+ "dist(\\mathbf{a},\\mathbf{b}) = ||\\mathbf{a} - \\mathbf{b}|| = \\displaystyle\\sqrt{(a_{0}-b_{0})^2 + (a_{1}-b_{1})^2 + \\cdots + (a_{n-1}-b_{n-1})^2}\n",
265
+ "$$"
266
+ ]
267
+ },
268
+ {
269
+ "cell_type": "code",
270
+ "execution_count": 11,
271
+ "metadata": {},
272
+ "outputs": [],
273
+ "source": [
274
+ "a = np.array([1,1])\n",
275
+ "b = np.array([-2,3])"
276
+ ]
277
+ },
278
+ {
279
+ "cell_type": "code",
280
+ "execution_count": 12,
281
+ "metadata": {},
282
+ "outputs": [],
283
+ "source": [
284
+ "c = a - b"
285
+ ]
286
+ },
287
+ {
288
+ "cell_type": "code",
289
+ "execution_count": 15,
290
+ "metadata": {},
291
+ "outputs": [
292
+ {
293
+ "data": {
294
+ "text/plain": [
295
+ "3.605551275463989"
296
+ ]
297
+ },
298
+ "execution_count": 15,
299
+ "metadata": {},
300
+ "output_type": "execute_result"
301
+ }
302
+ ],
303
+ "source": [
304
+ "norma(a-b)"
305
+ ]
306
+ },
307
+ {
308
+ "cell_type": "code",
309
+ "execution_count": 16,
310
+ "metadata": {},
311
+ "outputs": [
312
+ {
313
+ "data": {
314
+ "text/plain": [
315
+ "3.605551275463989"
316
+ ]
317
+ },
318
+ "execution_count": 16,
319
+ "metadata": {},
320
+ "output_type": "execute_result"
321
+ }
322
+ ],
323
+ "source": [
324
+ "np.linalg.norm(a-b)"
325
+ ]
326
+ },
327
+ {
328
+ "cell_type": "markdown",
329
+ "metadata": {},
330
+ "source": [
331
+ "A esto se el llama _norma Euclidiana_ o *distancia Euclidiana* y tiene ese nombre porque es como se infiere la forma de medir distancias de los [postulados de Euclides](https://es.wikipedia.org/wiki/Postulados_de_Euclides). Ahora, la realidad es que siempre que nuestro espacio admita una $\\mathbf{L^p}$-norma entonces podremos generalizar la norma anterior como\n",
332
+ "\n",
333
+ "$$\n",
334
+ "||x||_{p} = \\left(|x_{0}|^p + |x_{1}|^p + \\cdots + |x_{n-1}|^p\\right)^{1/p} \\qquad con \\;\\; 1\\le p\n",
335
+ "$$"
336
+ ]
337
+ },
338
+ {
339
+ "cell_type": "markdown",
340
+ "metadata": {},
341
+ "source": [
342
+ "Por eso es que la norma Euclidiana también es conocida como la *norma $L_{2}$*. Hay otras normas que recibe nombres. Por ejemplo, si $p=1$ tenemos la norma $L_{1}$ y esta es llamada _la métrica del taxista_ o _la métrica de Manhattan_. Si tomamos $p \\to \\infty$ entonces tenemos $L_{\\infty}$ y esta es llamada _la métrica del máximo_. Es muy importante saber qué métrica estamos usando para medir distancias ya que la forma en la que medimos distancias está en total correspondencia en con configuración y la percepción el espacio. Por ejemplo, mientras que en la métrica Euclidiana la distancia corresponde a la más corta entre los dos vectores en el espacio planeo en el caso de la métrica del taxista es la más corta pero no será es segmento más directo sino por _bloques_."
343
+ ]
344
+ },
345
+ {
346
+ "cell_type": "markdown",
347
+ "metadata": {},
348
+ "source": [
349
+ "Para poder simplificar las cosas tomemos dos vectores $\\mathbf{x}$ y $\\mathbf{y}$ en $\\mathbb{R}^2$\n",
350
+ "\n",
351
+ "$$\n",
352
+ "\\mathbf{x} = \\begin{bmatrix} 2\\\\1 \\end{bmatrix},\\; \\qquad \\mathbf{y} = \\begin{bmatrix} 1\\\\2 \\end{bmatrix}\n",
353
+ "$$\n",
354
+ "\n",
355
+ "La distancia en el caso de norma $L_{2}$ tenemos que la distancia entre los vectores es $||\\mathbf{x}-\\mathbf{y}||_{2} = \\displaystyle\\sqrt{(2-1)^{2} + (1-2)^{2}} = \\displaystyle\\sqrt{2}$ mientras que bajo la norma $L_{1}$ obtenemos que $||\\mathbf{x}-\\mathbf{y}||_{1} = |2-1|+|1-2| = 2$. "
356
+ ]
357
+ },
358
+ {
359
+ "cell_type": "markdown",
360
+ "metadata": {},
361
+ "source": [
362
+ "Ahora, si $\\mathbf{x}$ y $\\mathbf{y}$ son $n$-vectores hay una medida quer después cobrará importancia, *la desviación cuadrática media*\n",
363
+ "\n",
364
+ "$$\n",
365
+ "rms_{dev}(\\mathbf{x},\\mathbf{y}) = \\displaystyle\\frac{||\\mathbf{x}-\\mathbf{y}||}{\\sqrt{n}}\n",
366
+ "$$"
367
+ ]
368
+ },
369
+ {
370
+ "cell_type": "markdown",
371
+ "metadata": {},
372
+ "source": [
373
+ " "
374
+ ]
375
+ },
376
+ {
377
+ "cell_type": "markdown",
378
+ "metadata": {},
379
+ "source": [
380
+ "Algo muy imporante es que a pesar de que medimos distancias no existen propiamente nociones de *cerca* y *lejos*. Si tomamos los siguientes $4$-vectores\n",
381
+ "\n",
382
+ "$$\n",
383
+ "\\mathbf{u} = \\begin{bmatrix}1.8 \\\\ 2.8 \\\\ -3.7 \\\\ 4.7 \\end{bmatrix}, \\qquad \\mathbf{v} = \\begin{bmatrix}0.6 \\\\ 2.1 \\\\ 1.9 \\\\ -1.4 \\end{bmatrix}, \\qquad \\mathbf{w} = \\begin{bmatrix}2.0 \\\\ 1.9 \\\\ -4.0 \\\\ 4.6 \\end{bmatrix}\n",
384
+ "$$\n",
385
+ "\n",
386
+ "Tenemos que las distancia entre los vectores es:\n",
387
+ "\n",
388
+ "$$\n",
389
+ "||\\mathbf{u}-\\mathbf{v}|| = 8.36, \\qquad ||\\mathbf{u}-\\mathbf{w}|| = 0.38, \\qquad ||\\mathbf{v}-\\mathbf{w}|| = 8.63\n",
390
+ "$$\n",
391
+ "\n",
392
+ "Entonces así ya tenemos noción de cercanía o lontanaza, de no ser porque comparamos no tendríamos estas nociones. "
393
+ ]
394
+ },
395
+ {
396
+ "cell_type": "markdown",
397
+ "metadata": {},
398
+ "source": [
399
+ " "
400
+ ]
401
+ },
402
+ {
403
+ "cell_type": "markdown",
404
+ "metadata": {},
405
+ "source": [
406
+ "**Desigualdad del triángulo.** Debido a que la distancia la definimos a partir de la norma entonces la distancia también está sujeta a cumplir la desigualdad del triángulo. Considemos entonces tres $n$-vectores $\\mathbf{a}$,$\\mathbf{b}$ y $\\mathbf{c}$ entonces tenemos\n",
407
+ "\n",
408
+ "$$\n",
409
+ "||\\mathbf{a}-\\mathbf{c}|| = ||\\mathbf{a}-\\mathbf{b}+\\mathbf{b}-\\mathbf{c}|| \\le ||\\mathbf{a}-\\mathbf{b}|| + ||\\mathbf{b}-\\mathbf{c}||\n",
410
+ "$$"
411
+ ]
412
+ },
413
+ {
414
+ "cell_type": "markdown",
415
+ "metadata": {},
416
+ "source": [
417
+ "Vamos a partir de los siguientes $2$-vectores:\n",
418
+ "$$\n",
419
+ "\\mathbf{a} = \\begin{bmatrix} 1\\\\ 1 \\end{bmatrix}, \\qquad \\mathbf{b} = \\begin{bmatrix} 2\\\\ 3 \\end{bmatrix}, \\qquad \\mathbf{c} = \\begin{bmatrix} 4\\\\ 2 \\end{bmatrix}\n",
420
+ "$$"
421
+ ]
422
+ },
423
+ {
424
+ "cell_type": "markdown",
425
+ "metadata": {},
426
+ "source": [
427
+ " "
428
+ ]
429
+ },
430
+ {
431
+ "cell_type": "markdown",
432
+ "metadata": {},
433
+ "source": [
434
+ "## 8.3 Una aplicación"
435
+ ]
436
+ },
437
+ {
438
+ "cell_type": "markdown",
439
+ "metadata": {},
440
+ "source": [
441
+ "**Visita óptima de apartamentos para arrendar.** Supongamos que estamos en búsqueda de alquilar un apartamento. Comenzamos buscando caracacterísticas como cantidad de recámaras, cantidad de baños, estacionamientos, zona y tamaño. Un problema es que algunas veces llegamos a colectar una gran cantidad de anuncios y contactos y organizarnos para ir a las visitas puede parecer prácticamte imposible y puede que dejemos escapar una gran oportunidad. Afortunadamente en este curso vamos a proponer una solución: vamos a partir de nuestro departamento ideal y vamos a representarlo como un vector de caracteristicas, construimos el mismo vector para los apartamentos que ya tengamos localizados y calculamos la distancia entre estos vectores y el vector que representa al departamento ideal. Los ordenamos por de manera ascendente y ya tendríamos una lista ordenada en prioridad de contacto y visita de apartamentos según nuestro apartamento ideal. \n",
442
+ "\n",
443
+ "Para esto, supongamos que las características que queremos tomar en cuenta son tamaño del apartamento, número de recámaras, número de baños y número de estacionamientos. Notemos que en el caso de tamaño del apartamento regularmente se nos da en metros cuadrados (área) pero el gran problema es que puede variar mucho y usar estos números *tan grandes* puede introducir una gran cantidad de ruido. Para resolver el problema anterior vamos a catalogar los tamaños de apartametos en categorias:\n",
444
+ "1. Si el área es menor que 60 metros cuadrados\n",
445
+ "2. Si el área es mayor o igual que 60 metros cuadrados pero menor que 80 metros cuadrados\n",
446
+ "3. Si el área es mayor o igual que 80 metros cuadrados pero menor que 110 metros cuadrados\n",
447
+ "4. Si el área es mayor o igual que 110 metros cuadrados pero menor que 130 metros cuadrados\n",
448
+ "5. Si el área es mayor o igual que 130 metros cuadrados. "
449
+ ]
450
+ },
451
+ {
452
+ "cell_type": "markdown",
453
+ "metadata": {},
454
+ "source": [
455
+ "Supongamos también que el orden de las características en el vector es categoria de tamaño, número de recámaras, número de baños y número estacionamientos. Nuestro apartamento ideal viene dado por el siguiente vector:\n",
456
+ "\n",
457
+ "$$\n",
458
+ "\\mathbf{I} = \\begin{bmatrix} 3\\\\ 2\\\\ 2\\\\1 \\end{bmatrix}\n",
459
+ "$$\n",
460
+ "\n",
461
+ "Y nostros encontramos los siguientes apartamentos:\n",
462
+ "\n",
463
+ "$$\n",
464
+ "\\mathbf{A_{1}} = \\begin{bmatrix}4 \\\\3 \\\\ 3\\\\3 \\end{bmatrix}, \\qquad \\mathbf{A_{2}} = \\begin{bmatrix}3 \\\\3 \\\\ 1\\\\0 \\end{bmatrix}, \\qquad \\mathbf{A_{3}} = \\begin{bmatrix}5 \\\\4 \\\\ 3\\\\0 \\end{bmatrix}\n",
465
+ "$$"
466
+ ]
467
+ },
468
+ {
469
+ "cell_type": "code",
470
+ "execution_count": 21,
471
+ "metadata": {},
472
+ "outputs": [],
473
+ "source": [
474
+ "I = np.array([3,2,2,1])\n",
475
+ "A_1 = np.array([4,3,3,3])\n",
476
+ "A_2 = np.array([3,3,2,1])\n",
477
+ "A_3 = np.array([5,4,3,0])"
478
+ ]
479
+ },
480
+ {
481
+ "cell_type": "code",
482
+ "execution_count": 22,
483
+ "metadata": {},
484
+ "outputs": [
485
+ {
486
+ "name": "stdout",
487
+ "output_type": "stream",
488
+ "text": [
489
+ "||I-A_1|| = 2.6457513110645907\n",
490
+ "||I-A_2|| = 1.0\n",
491
+ "||I-A_3|| = 3.1622776601683795\n"
492
+ ]
493
+ }
494
+ ],
495
+ "source": [
496
+ "print('||I-A_1|| =',np.linalg.norm(I-A_1))\n",
497
+ "print('||I-A_2|| =',np.linalg.norm(I-A_2))\n",
498
+ "print('||I-A_3|| =',np.linalg.norm(I-A_3))"
499
+ ]
500
+ },
501
+ {
502
+ "cell_type": "markdown",
503
+ "metadata": {},
504
+ "source": [
505
+ "Este problema es el problema de encontrar el vector más cercano. Básicamte si tenemos una colección de N $n$-vectores $z_{0},z_{1},\\dots,z_{N-1}$ vamos a decir que $z_{i}$ es el vecino más cercano del vector $x$ si \n",
506
+ "\n",
507
+ "$$\n",
508
+ "||x-z_{i}|| \\le ||x - z_{j}|| \\quad con \\; \\; j = 0,\\dots, N-1\n",
509
+ "$$"
510
+ ]
511
+ }
512
+ ],
513
+ "metadata": {
514
+ "kernelspec": {
515
+ "display_name": "Python 3",
516
+ "language": "python",
517
+ "name": "python3"
518
+ },
519
+ "language_info": {
520
+ "codemirror_mode": {
521
+ "name": "ipython",
522
+ "version": 3
523
+ },
524
+ "file_extension": ".py",
525
+ "mimetype": "text/x-python",
526
+ "name": "python",
527
+ "nbconvert_exporter": "python",
528
+ "pygments_lexer": "ipython3",
529
+ "version": "3.7.3"
530
+ }
531
+ },
532
+ "nbformat": 4,
533
+ "nbformat_minor": 4
534
+ }