Matemáticas para Machine Learning — Algebra Lineal

Fernando Silva
Data Science Bolivia
6 min readDec 30, 2019

--

Algebra Lineal cumple un importante rol en el ámbito del Aprendizaje Automático (De ahora en adelante en el blog, la notación será su traducción inglés: Machine Learning). Esto por su estudio profundo de vectores, matrices, funciones lineales, entre otras ramas.

Al momento del uso de modelos de Machine Learning, estos manejan los datos representándolos como Matrices. Posterior se procede a su manipulación matemática, por esta razón es importante el conocimiento de Algebra Lineal para poder desempeñar de una manera optima los modelos de Machine Learning.

En la presente publicación se describe algunos conceptos básicos de Algebra Lineal, los cuales están acompañados de su implementación en Python. Para poder implementar de manera exitosa en Python, es necesario iniciar nuestro script importando la librería NumPy.

 import numpy as np

1.- Escalares, Vectores, Matrices y Tensores

“Broadly speaking, in Linear Algebra, data is represented in the form of linear equations. These linear equations are in turn represented in the form of matrices and vectors” — Vignesh Natarajan

Escalares:

  • Un numero simple es un escalar (como por ejemplo: x = 23). A su vez es el ejemplo de un tensor de orden 0.
  • Es necesario describir el conjunto de valores al cual pertenece dicho escalar.
a = 2 // Escalar tipo 'Int'
b = 3.1416 // Escalar tipo 'Float'

Vectores:

  • Es una lista de números.
  • Hay dos maneras de interpretarlo. Primero, como un vector en un punto del espacio, donde los números que están en la lista son una manera para identificar al dicho punto en el espacio. Segundo, como una magnitud y dirección, como por ejemplo la velocidad.
  • Hay dos maneras de interpretar los vectores, una vendría siendo por el lado de la Física, y el otro por el lado de las Ciencias de la Computación.
// Existen dos maneras de crear vectores
// 1.- Convirtiendo una lista Python en un NumPy Array
a_lista = [1,2,3,4]a_array = np.array(a_lista)// 2.- Creandolo directamente en NumPy
b_array = np.array([5,6,7])

Matrices:

  • Una matriz es parecida a un vector, en el sentido en que ambas son colecciones de números.
  • La diferencia entre una matriz y un vector, es que la primera es una tabla de números, y no así una lista.
// La manera de declarar matrices en NumPy es mediante listas anidadas
matrix = np.array([[1, 2],[3, 4],[5, 6]])
// Podemos 'capturar' un determinado valor seleccionando su posición dentro de la matriz
print(matrix[2][1]) // Devuelve: 6
// También se puede declarar una matriz haciendo el uso del objeto matriz, pero su uso no es muy usual, por lo cual es recomendado hacerlo mediante el procedimiento anterior
matrix_object = np.mat([[1, 2],[1, 2],[1, 2]])

Tensores:

Un tensor es una generalización de vectores y matrices y se entiende fácilmente como una matriz multidimensional.

En resumen:

Podemos interpretar de la siguiente manera gráfica:

2.- Operaciones

Operaciones con Vectores

Adición de Vectores:

// Podemos crear un vector en base a un rango predeterminado
rango_1 = np.arange(5) // Devuelve: [0, 1, 2, 3, 4]
// Podemos crear un nuevo vector a partir de uno antiguo
rango_2 = rango_1 * 2 // Devuelve: [0, 2, 4, 6, 8]
// La suma también esta disponible entre los vectores
suma = rango_1 + rango_2 // Devuelve: [ 0, 3, 6, 9, 12]

Sustracción de Vectores:

// Podemos generar una lista con números aleatorios
a = np.random.random_sample(5) // Devuelve una lista con 5 números randómicos
// Podemos generar una lista rellenada solo del numero 1
b = np.ones(5) // Devuelve una lista con 5 números "1"
//Se puede realizar la resta de ambas listas, puestas que ambas tienen el mismo numero de elementos
resta = a - b

Multiplicación de Vectores:

Multiplicación de escalar con matriz

// Generamos el array directamente con NumPy
r = np.array([3,2])
// Declaramos el escalar
e = 2
// Realizamos la multiplicación del escalar con el array
mul = e * r
print(mul) // Devuelve: [6 4]

Operaciones con Matrices

Multiplicación de Escalar con Matriz:

Cuando un Escalar es multiplicado con una Matriz, esta se realiza con todos los números que yacen en la Matriz.

// Definimos la matriz como una matriz anidada
m = np.array([[4,1,7],[5,9,12]])
// Definimos el escalar
e = 3
// Realizamos la multiplicación entre el escalar y la matriz
mul = e * m
print(mul) // Devuelve la matriz: [[12 3 21],[15 27 36]]

Producto Dot:

Para multiplicar una matriz con otra matriz podemos realizarlo con el Dot Product.

// Declaramos las matrices 
ma = np.array([[1,2],[3,4]])
mb = np.array([[5,6],[7,8]])
// Utilizamos dot de NumPy para realizar la multiplicación
mul = np.dot(ma,mb)
// Al imprimir el resultado nos devuelve una matriz 2x2
print(mul) // Devuelve: array([[19, 22],[43, 50]])

Producto Hadamard:

Otra manera de realizar la multiplicación de dos matrices (una técnica bastante similar a la suma de dos matrices) puede realizarse mediante el Producto Hadamard

// Declaramos las dos matrices como arrays anidados
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
// La multiplicación se puede realizar con multiply de NumPy y también de manera directa usando la multiplicación Python (*)
mul = np.multiply(a,b)
// Imprimimos mul para ver la matriz respuestaprint(mul) // Devuelve: array([[ 5, 12],[21, 32]])

Matriz Identidad:

  • Una matriz identidad, representado por I, tiene toda la diagonal principal definida por 1, y los demás valores rellenadas con 0.
  • Una matriz identidad es siempre una matriz cuadrada.
// Declaramos la matriz identidad con identity de Numpy
m_identidad = np.identity(5)
print(m_identidad) // Devuelve la matriz identidad de tamaño 5x5array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])

Matriz Inversa:

  • La inversa de una matriz cuadrada A, está definida de la siguiente manera:
  • Para obtener la inversa de una matriz 2x2 se puede obtener de la siguiente manera:
// Declaramos la matriz A
A = np.array(([1,3,3],[1,4,3],[1,3,4]))
// Invertimos la matriz usando NumPy
A_inv = np.linalg.inv(A)
// Comprobamos la matriz inversa
print(A_inv)
//Devuelve la matriz inversa de A:
[[ 7. -3. -3.]
[-1. 1. 0.]
[-1. 0. 1.]]

Propiedades de producto de matrices:

  • Asociatividad:
  • Distribuidad:
  • Conmutatividad: A diferencia de la adición, en la multiplicación la conmutatividad de matrices no satisface la equitividad.

Transpuesta:

Una transpuesta de una matriz, es una nueva matriz donde prácticamente las filas son las columnas de la matriz original.

// Declaramos una matriz A
A = np.array([[1, 2], [3, 4], [5, 6]])
// Calculamos su transpuesta
A_t = A.T
//Comprobamos su transpuesta
print(A_t)
[[1 3 5],
[2 4 6]]

¡Gracias por tomarte el tiempo de leer! te agradecería un montón darle un aplauso a este artículo. Asegúrate de seguir a Data Science Bolivia para estar al tanto en nuevas publicaciones relacionadas a Inteligencia Artificial, Machine Learning, Data Science y más. Puedes encontrarme en Twitter como @fernando232s.

--

--