Clase 01 (22/03)

Ejercicio

Sean: $$A = \left( \begin{array}{ccc} 1 & 0 & -1 \\ 2 & 1 & 3 \\ 0 & 1 & -1 \end{array} \right) \qquad B = \left( \begin{array}{ccc} 0 & -2 & 1 \\ 3 & -1 & 0 \\ 2 & 0 & -1 \end{array} \right) \qquad v = (-1, 4, -2)$$ Computar en Python la siguiente operación: $A^tA^2v^t+ BAv^t + <v, A_{1 \cdot}>v^t$ siendo $A_{1 \cdot}$ la primera fila de $A$

Respuesta: $(40, 17, 57)$

Posible implementación: A.T @ (A @ A) @ v + B @ A @ v + (v @ A[0,:])*v

Descomposición de Cholesky

Lema: sea $A\in \mathbb{R}^{n\times n}$ simétrica definida positiva, existe una única $L\in \mathbb{R}^{n\times n}$ triangular inferior tal que $A = LL^t$ y $l_{ii}>0 \; \forall 1\leq i \leq n$

Veamos qué ocurre en el caso de una matriz $A\in \mathbb{R}^{3\times 3}$ simétrica definida positiva: $$ A = \left( \begin{array}{ccc} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array} \right) $$ Queremos escribirla como el producto $LL^t$ donde: $$ L = \left( \begin{array}{ccc} l_{11} & 0 & 0 \\ l_{21} & l_{22} & 0 \\ l_{31} & l_{32} & l_{33} \end{array} \right) $$

Luego: $$ \left( \begin{array}{ccc} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array} \right) = \left( \begin{array}{ccc} l_{11} & 0 & 0 \\ l_{21} & l_{22} & 0 \\ l_{31} & l_{32} & l_{33} \end{array} \right) \left( \begin{array}{ccc} l_{11} & l_{21} & l_{31} \\ 0 & l_{22} & l_{32} \\ 0 & 0 & l_{33} \end{array} \right) = \left( \begin{array}{ccc} l_{11}^2 & l_{21}l_{11} & l_{31}l_{11} \\ l_{21}l_{11} & l_{21}^2+l_{22}^2 & l_{31}l_{21}+l_{32}l_{22} \\ l_{31}l_{11} & l_{31}l_{21}+l_{32}l_{22} & l_{31}^2 + l_{32}^2 + l_{33}^2 \end{array} \right) $$ Entonces: $$L = \left( \begin{array}{ccc} \sqrt{a_{11}} & 0 & 0 \\ \dfrac{a_{21}}{l_{11}} & \sqrt{a_{22}-l_{21}^2} & 0 \\ \dfrac{a_{31}}{l_{11}} & \dfrac{a_{32}-l_{31}l_{21}}{l_{22}} & \sqrt{a_{33} - l_{31}^2-l_{32}^2} \end{array} \right) $$

Idea:

  1. $l_{11} = \sqrt{a_{11}}$
  2. $l_{j1} = \dfrac{a_{j1}}{l_{11}}$ para $j$ desde $2$ hasta $n$
    Para todo $i$ desde $2$ hasta $n:$
  3. $l_{ii} = \sqrt{a_{ii} - \displaystyle \sum_{k=1}^{i-1}l_{ik}^2} $
  4. Si $i \neq n$ : $l_{ji} = \dfrac{a_{ji} - \displaystyle\sum_{k=1}^{i-1} l_{ik}l_{jk}}{l_{ii}}$ para todo $j$ entre $i+1$ y $n$
  5. Si $i < n$, luego $i = i+1$ y volver al paso 3

Sustitución forward

Si tenemos un sistema de ecuaciones lineales representado por $Ax=b$ donde $A \in\mathbb{R}^{n\times n}$ es triangular inferior y $a_{ii}\neq0$, entonces el sistema ya está triangulado y los valores de $x$ son fácilmente calculables.

Idea

  1. $x_{1} = \dfrac{b_1}{a_{11}}$
    Para $i$ desde $2$ hasta $n$:
  2. $x_i = \dfrac{b_i - \displaystyle\sum_{j=1}^{i-1} a_{ij}x_j}{a_{ii}}$

Sustitución backward

Si tenemos un sistema de ecuaciones lineales representado por $Ax=b$ donde $A \in\mathbb{R}^{n\times n}$ es triangular superior y $a_{ii}\neq0$, entonces el sistema ya está triangulado y los valores de $x$ son fácilmente calculables.

Idea

  1. $x_{n} = \dfrac{b_n}{a_{nn}}$
    Para $i$ desde $n-1$ hasta $1$:
  2. $x_i = \dfrac{b_i - \displaystyle\sum_{j=i+1}^{n} a_{ij}x_j}{a_{ii}}$

Se puede iterar de manera decreciente utilizando:

for i in reversed(range(n))

Sistemas de ecuaciones lineales

Supongamos que tenemos el sistema de ecuaciones lineales $Ax=b$ donde $A$ es simétrica definida positiva. Por descomposición de Cholesky, existe $L$ triangular inferior tal que $A = LL^t$ y la diagonal de $L$ no tiene elementos nulos. Entonces: $$Ax=b \Leftrightarrow LL^tx=b$$ Sea $y=L^tx$, se tiene que, para resolver el problema original, basta resolver: $$\begin{cases} Ly = b \\ L^tx = y \end{cases} $$

Ejercicio: implementar una función que resuelva sistemas de ecuaciones lineales con matriz asociada simétrica definida positiva

Descomposición QR

Lema: sea $A\in\mathbb{R}^{n\times n}$, luego se puede escribir como el producto de una matriz ortonormal $Q$ (es decir, $Q$ tal que $Q^t = Q^{-1}$) y una matriz triangular superior $R$. Si $A$ es inversible, la descomposición es única y la diagonal de $R$ es postiva.

Sea $A=[a_1|a_2|\dots|a_n]$ cuyas columnas son linealmente independientes, les aplicaremos el método de Gram-Schmidt. Sea la proyección $$proy_ua = \dfrac{<u,a>}{<u,u>}u$$ Hallamos la base ortonormal $\{w_1,\dots,w_n\}$ de la siguiente manera:

$\begin{array}{cclrcl} u_1 &=& a_1 & w_1 & = &\dfrac{u_1}{||u_1||}\\ u_2 &=& a_2 - proy_{u_1}a_2 & w_2 & = &\dfrac{u_2}{||u_2||}\\ u_3 &=& a_3 - proy_{u_1}a_3 - proy_{u_2}a_3 & w_3 & = &\dfrac{u_3}{||u_3||}\\ \vdots & & \\ u_k & = & a_k - \displaystyle \sum_{j=1}^{k-1}proy_{u_j}a_k & w_k & = &\dfrac{u_k}{||u_k||} \end{array}$

Se tiene entonces que: $$Q = [w_1|w_2|\dots|w_n] \qquad \displaystyle R={\begin{pmatrix}\langle w_{1},{a} _{1}\rangle &\langle w_{1},{a} _{2}\rangle &\langle w _{1},{a} _{3}\rangle &\ldots \\0&\langle w_{2},{a} _{2}\rangle &\langle w_{2},{a} _{3}\rangle &\ldots \\0&0&\langle w_{3},{a} _{3}\rangle &\ldots \\\vdots &\vdots &\vdots &\ddots \end{pmatrix}}$$

Sistema de ecuaciones lineales

Sea $A\in\mathbb{R}^{n\times n}$, entonces podemos aplicar el siguiente procedimiento para hallar, de existir, la solución de $Ax=b$

$$Ax=b \Leftrightarrow QRx=b \Leftrightarrow Rx=Q^tb$$

Cuadrados mínimos

Sea $\{(x_1,y_1),\dots,(x_n,y_n)\}$ un conjunto de datos en el plano, el objetivo es hallar $P\in\mathcal{P}_k$ que mejor aproxime a los datos en el sentido de minimizar la siguiente expresión: $$\displaystyle\sum_{i=1}^n (y_i-P(x_i))^2$$

Consideremos $$A = \left( \begin{array}{ccccc} 1 & x_1 & x_1^2 & \dots & x_1^k \\ 1 & x_2 & x_2^2 & \dots & x_2^k \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & x_n^2 & \dots & x_n^k \end{array} \right) $$

Lo ideal sería encontrar $\alpha=(\alpha_1,\dots,\alpha_{k+1})^t$ tal que suceda lo siguiente: $$\left( \begin{array}{ccccc} 1 & x_1 & x_1^2 & \dots & x_1^k \\ 1 & x_2 & x_2^2 & \dots & x_2^k \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & x_n^2 & \dots & x_n^k \end{array} \right) \left( \begin{array}{c} \alpha_0 \\ \alpha_2 \\ \vdots \\ \alpha_{k} \end{array} \right) = \left( \begin{array}{c} y_1 \\ y_2 \\ \vdots \\ y_n \end{array} \right) $$ Pero eso rara vez sucede.

$\{1,x,\dots,x^k\}$ es una base de $\mathcal{P}_k$. Nos gustaría encontrar $P=\displaystyle\sum_{j=0}^{k}\alpha_j x^j$ que minimice

$$E(\alpha) = \displaystyle\sum_{i=1}^n \left( y_i-\displaystyle\sum_{j=0}^{k}\alpha_j x_i^j \right)^2$$

Entonces buscamos $\alpha$ tal que: $$\dfrac{\partial E}{\partial \alpha_m} = \displaystyle\sum_{i=1}^n 2\left( y_i- \displaystyle\sum_{j=1}^k \alpha_j x_i^j \right)\cdot x_i^m = 0 \qquad \forall 0\leq m \leq k$$ $$ \Leftrightarrow \displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^k \alpha_j x_i^jx_i^m = \displaystyle\sum_{i=1}^n y_ix_i^m \qquad \forall 0\leq m \leq k $$ Esto es justamente pedir que $\alpha$ sea la solución de $A^tA\alpha = A^ty$ con $y=(y_1,\dots,y_n)^t$

Notar que si $A\in\mathbb{R}^{n\times m}$, entonces $A^tA\in\mathbb{R}^{m\times m}$ y es definida positiva. Por lo visto anteriormente, dados los datos $\{(x_1,y_1),\dots,(x_n,y_n)\}$, para hallar los coeficientes del polinomio de grado $k$ que mejor los aproxima en sentido de cuadrados mínimos basta resolver:

$$A^tA\alpha = A^ty$$

Siendo:

$$A = \left( \begin{array}{ccccc} 1 & x_1 & x_1^2 & \dots & x_1^k \\ 1 & x_2 & x_2^2 & \dots & x_2^k \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & x_n^2 & \dots & x_n^k \end{array} \right) \qquad y = \left( \begin{array}{c} y_1 \\ y_2 \\ \vdots \\ y_n \end{array} \right) \qquad \alpha = \left( \begin{array}{c} \alpha_0 \\ \alpha_2 \\ \vdots \\ \alpha_{k} \end{array} \right) $$

Implementar dos funciones: ambas deben tomar como input el grado del polinomio y los datos y devolver una lista con los coeficientes del polinomio que mejor los aproxima. Una de las funciones debe resolver el sistema usando descomposición de Cholesky y la otra aplicando descomposición QR.

Visualizando datos

Vamos a comparar gráficamente el resultado de ambos métodos. Para eso, utilizaremos el archivo datos.txt.

Importamos numpy y matplotlib.pyplot. También importamos la función polyval que permite evaluar polinomios a partir de sus coeficientes de la siguiente manera: polyval(x,c) donde x puede ser un número o un array y c es la lista de coeficientes del polinomio ordenados de la siguiente manera: c[i] es el coeficiente de $x^i$.

In [ ]:
import numpy as np
from numpy.polynomial.polynomial import polyval
import matplotlib.pyplot as plt

datos_X = np.loadtxt('datos.txt', usecols=0)  # Como los datos de X están en la primera columna, usamos usecols=0
datos_Y = np.loadtxt('datos.txt', usecols=1)  # Como los datos de X están en la segunda columna, usamos usecols=1

Ahora podemos aplicar las funciones implementadas para hallar los coeficientes del los polinomios. La idea es graficar los datos (plt.plot(X,Y)) y los dos polinomios obtenidos, todo en el mismo gráfico.

Descomposición SVD y compresión de imágenes

Necesitamos la librería image de matplotlib.

In [ ]:
import matplotlib.image as mimg
import matplotlib.pyplot as plt

archivo = 'casita.png'
A = mimg.imread(archivo)    # Lee el archivo de la imagen y lo convierte en matriz
plt.imshow(A, cmap='gray')  # Estos dos comandos permiten mostrar la imagen en pantalla
plt.show()
mimg.imsave('casita_2.png', A, cmap='gray')  # Guarda la imagen representada por A en un archivo