Curso de Deep Learning de Juan Sensio
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
Fundamentos matemáticos - Algebra Lineal
Escalares
# un valor escalar
x = 1
x
Vector
# Un vector
vector = np.array([1,2,3,4,5])
vector
# Primer valor
vector[0]
Matriz
# Una matriz
lista = [[1,2],[3,4]]
A = np.array(lista)
A
# Primer valor --> Para sacar el primer valor A1,1 ocupamos ahora 2 indices.
A[0,0]
Tensor
# Un tensor de 3 dimensiones
# puedes interpretarlo como dos matrices. --> o una lista de matrices.
A = np.array([[[1,2],[3,4]],[[1,2],[3,4]]])
A
Operaciones
# Una matriz
# Con .arange() podemos crear un vector de numpy --> asi como .range() en las listas.
A = np.arange(10).reshape(2,5) # con .reshape() cambiamos la dimensionalidad (2filas,5colum)
A
# Una matriz traspuesta
A.T
A = np.random.randn(3,3)
B = np.random.randn(3,3)
A,B
A + B
A = np.array([[1,2,1],[0,1,0],[2,3,4]])
B = np.array([[2,5],[6,7],[1,8]])
A,B
# con el metodo .dot() podemos realizar el producto de matrices.
C = A.dot(B) # --> A*B
C
A = np.array([[1,3],[5,2]])
B = np.array([[3,6],[2,2]])
A, B
D = A*B
D
# Aqui podemos observar como se multiplica cada elemento de la matriz en forma independiente.
Matriz identidad y matriz inversa
# Una matriz identidad --> En numpy creamos una matriz identidad con la función .eye()
I = np.eye(3)
I
import numpy.linalg as linalg
A = np.array([[1,2,3], [5,7,11], [21,29,31]])
A
# Calculando la matriz inversa de A
inversa_A = linalg.inv(A)
inversa_A
# Podemos comprobar que es la inversa multiplicandola con A --> inv_A*A = I
inversa_A.dot(A) # = I (o algo asi deberia ser...)
A = np.array([[2,6],[5,3]])
B = np.array([6, -9])
x = linalg.inv(A).dot(B)
# Los valores de x corresponden a la solución para este sistema de ecuaciones lineales.
x
Descomposición de matrices
A = np.array([[1,2,3], [5,7,11], [21,29,31]])
A
# Usamos el paquete linalg de numpy y la función .eig() para la descomposicion de matrices.
L, V = linalg.eig(A)
L, V # Nos devolvera los valores propios (L) y los vectores propios(V)
Fundamentos matemáticos - Probabilidad
Fuentes de incertidumbre
Probabilidad
Variables aleatorias
x = np.random.randn(3) # un vector que genera 3 escalares aleatorios cada vez que lo ejecutemos.
x
Distribución de probabilidad
Variables Discretas
Variables Continuas
# Distribucion Gaussiana
x = np.random.normal(0, 0.2) # tenemos una media de 0 y una varianza de 0.2
#siempre tendremos un valor cercano a cero, a menos que cambiemos la varianza a un número mayor
x
Funciones comunes
# Generaremos la función sigmoide
def sigmoide(x):
return 1/(1 + np.exp(-x))
z = np.array([-10, 0, 10])
sigmoide(z)
# Generaremos la función softmax
def softmax(z):
return np.exp(z) / sum(np.exp(z))
z = np.array([1,3,2])
# haremos un grafico de barra de este vector, para apreciar su comportamiento luego de aplicar
# la funcion softmax
plt.bar(list(range(1,4)), z)
plt.show()
# Aplicaremos la función softmax y obtendremos una distribución de probabilidad.
x = softmax(z)
print(x)
print(f'Tambien podemos ver que la suma de este vector es: {sum(x)}')
# Graficaremos su comportamiento.
plt.bar(list(range(1,4)), x)
plt.show()
Fundamentos Matemáticos - Cálculo Numérico
Precisión Numérica
x = np.array([0, 100, 255], dtype = np.uint8)
# "uint8" --> Con esto estamos diciendo que seran números enteros (int) y sin signo (u) de
# 8 bits.
x
# overflow --> problema que puede ocurrir con cualquier tipo de presición numérica.
x + 1
# underflow
x - 1
# Generaremos la función softmax
def softmax(z):
return np.exp(z) / sum(np.exp(z))
x = np.full(5,1) # Generamos un vector de 1.
x
softmax(x)
# El resultado que vemos es el esperado. Recordemos que la función softmax nos transforma
# nuestros vectores o valores en una distribución de probabilidad...
# si creamos un vector de numeros más grandes, ej: de 1000...
x = np.full(5, 1e3)
x
softmax(x)
# Una forma de hacerlo, es cambiar el vector que nos viene como argumento
def softmax_estable(z):
z = z -np.max(z) # y lo que haremos es restarle el valor más grande.
# np.e elevado a 0 es 1, por lo que tenemos un valor pequeño y evitamos este problema.
return np.exp(z) / sum(np.exp(z))
softmax_estable(x)
# obteniendo el mismo resultado
# si probamos la softmax ahora con valores extremadamente grandes, veremos que ya no tenemos
# ningún problema.
z = np.full(5, 1e10)
z
softmax_estable(z)