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
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
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
Medir similitud entre ejemplos: Distancia vectorial
Comprimir nuestros datos: Factorización
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?
Show 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?
Show 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\) es una versión escalada, rotada y trasladada de \(x\)