19. Intuiciones geométricas de álgeba lineal#

El álgebra lineal se enfoca en el estudio de los vectores, las matrices, los espacios vectoriales y las relaciones o combinaciones lineales

¿Qué significa que una relación entre variables sea lineal?

Significa que podemos expresar su relación utilizando sólo adición y multiplicación (escalamiento) por constantes.

Por ejemplo la ecuación de la recta

\[ y = a x + b, \]

donde \(x\) e \(y\) son variables o incógnitas y \(a\) y \(b\) son constantes o coeficientes es un ejemplo de relación lineal

Cuando tenemos un conjunto de ecuaciones como la anterior hablamos de un sistema lineal, que usualmente podremos expresar como

\[ A x = b, \]

donde \(A\) es una matriz y \(x\) y \(b\) son vectores

Importante

Los conceptos de álgebra lineal son ampliamente utilizados en física o ingeniería, por ejemplo en dinámica, circuitos eléctricos, análisis estructural y análisis estadístico

En general si podemos modelar nuestros ejemplos como vectores y agruparlos como matrices, el álgebra lineal nos puede servir para

  1. Medir similitud entre ejemplos: Distancia vectorial

  2. Comprimir nuestros datos: Factorización

  3. Predecir un atributo en función de otros: Sistemas de ecuaciones lineales

por mencionar algunos ejemplos.

En este capítulo veremos algunos de estos problemas y los resolveremos con el módulo linalg de la librería de computación científica scipy

Nota

Muchas de las funciones que veremos están implementadas tanto en scipy.linalg como en np.linalg. Sin embargo algunas funciones de np.linalg no tienen equivalente en scipy

import holoviews as hv
hv.extension('bokeh')
import numpy as np
import scipy.linalg

Matrices

En NumPy una matriz es una arreglo de dimensión 2

D = np.array([[1, 0], 
              [-1, 0],
              [0, 2]])

D.ndim
2

Podemos interpretar nuestros dataframes como una matriz cuyas filas corresponde a ejemplos y columnas a los atributos

Consideremos ahora la función

def mistery_matrix(theta, rho):
    return np.array([[np.cos(theta)*rho, -np.sin(theta)*rho], 
                     [np.sin(theta)*rho, np.cos(theta)*rho]])

Podemos multiplicar matrices en NumPy con el operador @ o con np.dot

A = mistery_matrix(np.pi/2, 1.)
DA = np.dot(D, A)
DA
array([[ 6.1232340e-17, -1.0000000e+00],
       [-6.1232340e-17,  1.0000000e+00],
       [ 2.0000000e+00,  1.2246468e-16]])

¿Como cambia la matriz \(D\) al multiplicarse por la segunda matriz?

Hide code cell source
Dscatter = hv.Scatter((D[:, 0], D[:, 1]), label='D').opts(width=500, size=5, show_grid=True, alpha=0.7)
hmap = hv.HoloMap(kdims=['rho', 'theta'])
for rho in [0.5, 1, 1.5]:
    for theta in np.linspace(-np.pi/2, np.pi/2, 10):
        A = mistery_matrix(theta, rho)
        DA = np.dot(D, A)
        hmap[(rho, theta)] = Dscatter * hv.Scatter((DA[:, 0], DA[:, 1]), label='DA').opts(size=5, alpha=0.7)
hmap

Multiplicar por una matriz es equivalente a una composición de rotación y escalamiento

Nota

La función mistery_matrix desacopla la rotación del escalamiento para hacer más sencilla la demostración. Además en este caso particular estamos escalando y rotando ambas dimensiones de forma equivalente

Vectores

En NumPy un vector es un ndarray de dimensión 1

b = np.array([2., -1.])
b.ndim
1

El tamaño o amplitud de un vector puede calcularse utilizando una norma, por ejemplo para el caso anterior

scipy.linalg.norm(b, ord=2)
2.23606797749979

Que corresponde a la norma euclidiana o norma \(p\) de orden 2

¿Qué pasa si sumamos un vector \([b_1, b_2]\) a nuestro dataset?

Hide code cell source
Dscatter = hv.Scatter((D[:, 0], D[:, 1]), label='D').opts(width=500, size=5, show_grid=True, alpha=0.7)
hmap = hv.HoloMap(kdims=['b1', 'b2'])
for b1 in np.linspace(-2, 2, 10):
    for b2 in np.linspace(-2, 2, 10):
        DA = D + np.array([b1, b2]) #Aplica broadcasting
        hmap[(b1, b2)] = Dscatter * hv.Scatter((DA[:, 0], DA[:, 1]), label='DA').opts(size=5, alpha=0.7)
hmap

Sumar un vector equivale a una traslación

Las dos operaciones anteriores se combinan en lo que se conoce como transformación afín

\[ y = A x + b \]

\(y\) es una versión escalada, rotada y trasladada de \(x\)