<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Tarea Parte 1 (Teoría)
¿Por qué una matriz equivale a una transformación lineal entre espacios vectoriales?
Sea T
Step1:  Probar la visualización con los primeris n vectores
Step2:  Podemos ver como se puede reconstruir la imagen sin utilizar toda la información de la matriz original,
Ejercicio 2
<ASSISTANT_TASK:>
Python Code:
#######################################################################
### Parte 2
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
# Importar imagen
imagen = Image.open('C:/Users/Data Mining/Documents/ITAM/Propedeutico/Alumnos/PropedeuticoDataScience2017/Alumnos/Leonardo_Marin/black_and_white.jpg')
imagen_gris = imagen.convert('LA')   ## Convertir a escala de grises
## Convertir la imagen a una matriz
imagen_mat = np.array(list(imagen_gris.getdata(band=0)), float)
imagen_mat.shape = (imagen_gris.size[1], imagen_gris.size[0])
imagen_mat = np.matrix(imagen_mat)
plt.imshow(imagen_mat, cmap='gray')
imagen_gris
## Desompoición singular
U, sigma, V = np.linalg.svd(imagen_mat)
Explanation: Tarea Parte 1 (Teoría)
¿Por qué una matriz equivale a una transformación lineal entre espacios vectoriales?
Sea T: V ->W una transformación lineal, y sean las bases de V y W las formadas por los vectores canónicos, existen escalares únicos aij ( i entre [1,m] , j entre [1,n]) pertenecientes a un campo  tales que 
T(xi) = sigma (aij*yi)
Podemos expresar a T mediante una matriz A de mxn con elementos aij, donde la j-ésima columna de A es T(xj)
¿Cuál es el efecto de transformación lineal de una matriz diagonal y el de una matriz ortogonal?
La matriz diagonal expande o contrae los ejes, mientras que la matriz ortogonal rota los ejes 
¿Qué es la descomposición en valores singulares de una matriz?
Es expresar una matriz de forma equivalente como el producto de tres matrices USigmaVt donde donde U y V son matrices ortogonales y Sigma es una matriz cuasi diagonal, a los valores de la diagonal de sigma se le llaman valores singulares y cumplen con aparecen de forma descendente, es decir, el primer valor siggular de la diagonal es el mayor de todos, y así sucesivamente
¿Qué es diagonalizar una matriz y que representan los eigenvectores?
Diagonalizar equivale a encontrar una base de eigenvectores
¿Intuitivamente qué son los eigenvectores?
Los eigenvectores son un sistema de las nuevas coordenadas
¿Cómo interpretas la descomposición en valores singulares como una composición de tres tipos de transformaciones lineales simples?
Se rotan los ejes -> se expanden o contraen los ejes ->nuevamente se rotan
¿Qué relación hay entre la descomposición en valores singulares y la diagonalización?
La diagonalización es exclusiva para matrices cuadradas
La descomposición en valores singulares (svd) siempre existe en número reales, la diagonaliazación siempre existe en número complejos
La svd permite solucionar sistemas de ecuaciones incluso cuando no existe la inversa de una matriz
¿Cómo se usa la descomposición en valores singulares para dar una aproximación de rango menor a una matriz?
Por medio de los valores  de la diagonal distintos de cero de la matriz  cuasi diagonal
Describe el método de minimización por descenso gradiente
Menciona 4 ejemplo de problemas de optimización (dos con restricciones y dos sin restricciones) que te parezcan interesantes como Científico de Datos
Tarea Parte 2, Ejercicio 1
End of explanation
# n= 1
j = 1
matriz_equivalente = np.matrix(U[:, :j]) * np.diag(sigma[:j]) * np.matrix(V[:j, :])
plt.imshow(matriz_equivalente, cmap='gray')
# n = 5
j = 5
matriz_equivalente = np.matrix(U[:, :j]) * np.diag(sigma[:j]) * np.matrix(V[:j, :])
plt.imshow(matriz_equivalente, cmap='gray')
# n = 25
j = 25
matriz_equivalente = np.matrix(U[:, :j]) * np.diag(sigma[:j]) * np.matrix(V[:j, :])
plt.imshow(matriz_equivalente, cmap='gray')
# n = 50
j = 50
matriz_equivalente = np.matrix(U[:, :j]) * np.diag(sigma[:j]) * np.matrix(V[:j, :])
plt.imshow(matriz_equivalente, cmap='gray')
Explanation: Probar la visualización con los primeris n vectores
End of explanation
A = np.array([[1,0],[1,2]])
A
def pseudoinversa(A):
    U,s,V=np.linalg.svd(A)
    peudoinversa = V*(np.diag(1/s))*U.T
    return peudoinversa
B = pseudoinversa(A)
B
Explanation: Podemos ver como se puede reconstruir la imagen sin utilizar toda la información de la matriz original,
Ejercicio 2
End of explanation
<END_TASK>