I am working on the file "Algorithms/Random_Graphs.ipynb".
The first task is:
Introduction
A graph $G=(V,E)$ is a collection of vertices $V$ and edges $E$ between the vertices in $V$. Graphs often model interactions such as social networks, a network of computers, links on webpages, or pixels in a image. The set of vertices $V$ often represents a set of objects such as people, computers, and cats. Meanwhile the set of edges $E$ consists of vertex pairs, and usually, vertex pairs encode a relationship between objects. If graph $G$ represents a social network, the vertices could represent people, and the existence of an edge between two people could represent whether they mutually know each other. In fact, there are two types of edges: directed and undirected. An undirected edge represents mutual relation such as friendship in a social network, and a directed edge represents relation that is directional. For example, you have a crush on someone, but they don't have a crush on you. In short, a graph models pairwise relations/interaction(edges) between objects(vertices).
A random graph is a graph whose construction is a result of an underlying random process or distribution over a set of graphs. Random graph can help us model or infer properties of other graphs whose construction is random or appears to be random. Examples of random graphs may include the graph of the internet and a social network. The simplest model is the $G(n,p)$ model ,and it is due to Erdős and Rényi and independently Gilbert [1,2].
The $G(n,p)$ model
The $G(n,p)$ model consist of two parameters where $n$ is the number of vertices, and $p$ is the probability of forming an undirected edge between vertices. During the construction of a random graph, one visits each vertex with probability $p$ one adds an edge. Examples of realization for different parameters are shown below:
Can you write Python code for it?

params = [(10,0.1),(10,.5),(10,0.9),(20,0.1),(20,.5),(20,0.9)]

plt.figure(figsize=(15,10))
idx = 1
for (n,p) in params:
    G = nx.gnp_random_graph(n,p)

    vertex_colors = np.random.rand(n)

    plt.subplot(2,3,idx)
    nx.draw_circular(G,node_color = vertex_colors)
    plt.title("G$(%d,%.2f)$" %(n,p))
    idx+=1
plt.suptitle('Sample Random Graphs',fontsize=15)
plt.show()


I am working on the file "Algorithms/Random_Graphs.ipynb".
The first task is:
It's a Small World
In a fully connected random graph, the diameter of the graph becomes extremely small relative to the number vertices. The diameter is the longest shortest path between two nodes. The small world phenomenon was observed in social networks in Milgram's Small World Experiment[3]. Milgram's experiments are commonly refered in popular culture as the six degrees of seperation. The example below shows a Facebook social network from the SNAP dataset:
Can you write Python code for it?

G = nx.read_edgelist('facebook_combined.txt')
d = nx.diameter(G)
n = len(G.nodes())

vertex_colors = np.random.rand(n)
plt.figure(figsize=(15,10))
nx.draw_spring(G,node_color = vertex_colors)
plt.title('SNAP Facebook Ego Network with a diameter of %d and %d vertices' %(d,n),fontsize=15)
plt.show()


I am working on the file "Algoritmos I/2018-1C/Parcialito_1_Resolucion_Propuesta.ipynb".
The first task is:
Ejercicio 2
Enunciado
2) Un crucigrama es una matriz de nxm que contiene celdas. Las celdas son tuplas de dos elementos de la forma (<Color>,<contenido>). Cada celda puede ser BLANCA o NEGRA. El contenido es una cadena, si está vacía, la celda está vacía. Un crucigrama no está correctamente llenado si:
 * Hay una celda BLANCA vacía
 * Hay una celda NEGRA llena
Escribir una función que dado un crucigrama, devuelva si está correctamente llenado.
Resolucion
Can you write Python code for it?

def es_crucigrama_valido(crucigrama):
    '''Recibe un crucigrama y devuelve si esta o no correctamente llenado.
        Un crucigrama no está correctamente llenado si:
            - Hay al menos una celda BLANCA vacía
            - Hay al menos una celda NEGRA llena'''

    for fila in crucigrama:
        for celda in fila:
            color,contenido = celda

            if color == BLANCO and not contenido:
                return False
            if color == NEGRO and contenido:
                return False

    return True


I am working on the file "Algoritmos I/2018-1C/Parcialito_1_Resolucion_Propuesta.ipynb".
The first task is:
Ejercicio 3
Enunciado
3) Escribir una función que reciba una cadena y devuelva  su encriptación en formato rot13. Para encriptar una cadena con rot13 se debe reemplazar cada caracter por el caracter que se encuentra a 13 posiciones en el abecedario.
Si la cadena contiene números, caracteres especiales o mayúsculas se debe devolver una cadena vacía.

Ayuda: usar la constante ascii_lowercase del módulo string que contiene “abcd...xyz”

Ej:
python
    rot13(“zambia”) -> “mnzovn”
    rot13(“mnzovn”) -> “zambia”
    rot13(“z4mbi4”) -> “”
Resolucion
Can you write Python code for it?

from string import ascii_lowercase

def encriptar(cadena):
    encriptado = []
    for c in cadena:
        if not c in ascii_lowercase:
            return ""

        i = ascii_lowercase.index(c) + 13
        i = i % len(ascii_lowercase)

        encriptado.append(ascii_lowercase[i])

    return "".join(encriptado)

print(encriptar("simonga"))
print(encriptar("fvzbatn"))
print(encriptar("Zambia"))


I am working on the file "Algoritmos I/2018-1C/clase-09-04.ipynb".
The first task is:
Desde Python 3.6 en adelante, hay una forma mucho mas linda de hacer esto, ya que mejora bastante la legibilidad (notar que en el caso anterior no tengo idea de a que parametro representa cada {} a menos que vaya contando, y para mas de un parametro, poner todo con numeros es bastante molesto)
Can you write Python code for it?

def obtener_nueva_premisa( nombre_protagonista_femenino,
                                                    barrio_del_conurbano,
                                                    nombre_protagonista_masculino,
                                                    razon_de_no_ser_rica,
                                                    razon_de_ser_rico,
                                                    razon_para_ahora_ser_rica):
    """Devuelve una cadena con la premisa para una nueva y exitosa novela argentina, dados los datos pasados como parametro."""

    return f"""Ella es {nombre_protagonista_femenino}, una mucama que vive en {barrio_del_conurbano}.
Ella esta enamorada de su jefe {nombre_protagonista_masculino}, pero su amor no puede ser porque ella es {razon_de_no_ser_rica} y el es {razon_de_ser_rico}.
Pero todo cambia cuando ella descubre que es {razon_para_ahora_ser_rica} y su amor florece (porque aparentemente no existe el amor en la clase media)."""

print(obtener_nueva_premisa("Leona","Tigre","Alberto","una persona de bajos ingresos","mucho muy rico","la ganadora del gordo de navidad"))


I am working on the file "Algoritmos I/2018-1C/clase-09-04.ipynb".
The first task is:
Discusiones importantes para recordar:
* Por que find devuelve -1 y no otra cosa?
* Devolver una lista o una tupla?
* Usar internamente una lista o una tupla? Y si tengo que devolver una tupla?
Tarea para el lector:
* Probar la validez o no de la afirmacion [1] (Ayuda: probar usando listas)
Cosas no tan importantes a modo de conclusion:
* Notar que hasta en las canciones que no tienen su nombre en el titulo se nombra
* Queda entonces demostrado lo que sea que se supone que haya querido demostrar con esto
Parte 2: Que hacemos si nos cierran este antro?
¿Que pasa ahora si tienen que terminar la novela por problemas con los actores y hacer una nueva? Claramente alguien que escribe 34 veces el nombre de la protagonista en la letra de una cancion no tiene mucha imaginacion, asi que probablemente cambien los nombres de las personas y sigan con lo mismo. Hagamos algo que pueda reemplazar el nombre de Simona por el de una nueva protagonista en las canciones.
Version usando Split + Join
Can you write Python code for it?

palabras = si_si_simona.split(" ")

for i in range(len (palabras)):
    if palabras[i] == "Simona":
        palabras[i] = "Ramona"

print(" ".join(palabras))


I am working on the file "Algoritmos I/2018-1C/clase-09-04.ipynb".
The first task is:
La Magia de la television
Capitulo 1: La television argentina es un template gigante
Parte 0: Repaso general de secuencias
| |Cadenas|Tuplas|Listas|
|:---|:---|:---|:---|
|Acceso por indice|Si|Si|Si|
|Recorrer por indices|Si|Si|Si|
|Recorrer por elemento|Si|Si|Si|
|Elementos|Caracteres|Cualquier cosa|Cualquier cosa|
|Mutabilidad|Inmutables|Inmutables|Mutables|
|Operador + (concatenacion)|Copia|Copia|Copia|
|Slices|Copia|Copia|Copia|
|Append|No existe|No existe|Agrega (Modifica)|
|Buscar un elemento|Si|Si|Si|
Parte 1: Simona y el narcisismo en tv
Can you write Python code for it?


I am working on the file "Algoritmos I/2018-1C/clase-09-04.ipynb".
The first task is:
Metodos del tipo cadena
Por ahora los metodos son las funciones que puedo llamar para un tipo de datos dado, utilizando . . La forma de verlos todos es utilizando la funcion dir
Can you write Python code for it?


I am working on the file "Algoritmos I/2018-1C/clase-09-04.ipynb".
The first task is:
Simona Va
Can you write Python code for it?

simona_va = """Es un lindo día para pedir un deseo
No me importa si se cumple o no
Es un lindo día para jugarnos enteros
Vamos a cantar una canción

Amanece más temprano cuando quiero
Porque dentro mío brilla el sol
Al final siempre consigo lo que quiero
Por que lo hago con amor

Solo hay que cruzar bien los dedos
Y desear que pase con todo el corazón
Vamos a cubrirte los miedos
Vamos que ya llega lo mejor

Simona va, Simona va
Andando se hace el camino
Yo manejo mi destino

Simona va, Simona va
Si piso dejo mi huella
Voy a alcanzar las estrellas
Ella va, va, va, viene y va

Es un lindo dia para hacer algo bien bueno
Disfrutando de la sensacion
De animarse aunque no te salga perfecto
Cada vez ira mejor

[?] cuando siento
Que mañana voy a verte a vos
Porque yo siempre consigo lo que quiero
Nadie me dice que no

Solo hay que cruzar bien los dedos
Y desear que pase con todo el corazón
Vamos sacudite los miedos
Vamos que ya llega lo mejor

Simona va, Simona va
Andando se hace el camino
Yo manejo mi destino

Simona va, Simona va
Si piso dejo mi huella
Voy a alcanzar las estrellas
Ella va, va, va, viene y va

Ya va, yo tengo mi tiempo
Are you ready for funky?
Verás yo voy con lo puesto
Como no?
No da que no seas sincero
Yo no, no le tengo miedo a na na na na na

Simona va, Simona va
Andando se hace el camino
Yo manejo mi destino

Simona va, Simona va
Si piso dejo mi huella
Voy a alcanzar las estrellas
Ella va, va, va

Simona va, Simona va
Andando se hace el camino
Yo manejo mi destino

Simona va, Simona va
Si piso dejo mi huella
Voy a alcanzar las estrellas
Ella va, va, va, viene y va"""


I am working on the file "Algoritmos I/2018-1C/clase-09-04.ipynb".
The first task is:
Soy Como Soy
Can you write Python code for it?

soy_como_soy = """Soy especial
A veces no me entienden, es normal
Yo digo siempre lo que pienso
Aunque te caiga mal

Ya vez mi personalidad
Tengo la música en la sangre prefiero bailar
No es necesario interpretar, adivinar
Soy lo que siento

Soy Simona
Cantar mi corazón ilusiona
Mi sueño voy de a poco alcanzando
Y no puedo dejar de pensar en tu amor

Cada vez que un recuerdo se asoma
Intento al menos no ser tan obvia
Y que no te des cuenta que muero por vos
Soy como soy pero mi amor
Es mas lindo cuando somos dos

Vuelvo a empezar
No se porque doy tantas vueltas
Si en verdad
Tu amor es todo lo que quiero
Me cuesta tanto disimular

Ya vez mi personalidad
Tengo la música en la sangre prefiero bailar
No es necesario interpretar, adivinar
Soy lo que siento

Soy Simona
Cantar mi corazón ilusiona
Mi sueño voy de a poco alcanzando
Y no puedo dejar de pensar en tu amor

Cada vez que un recuerdo se asoma
Intento al menos no ser tan obvia
Y que no te des cuenta que muero por vos
Soy como soy, pero mi amor
Es mas lindo cuando somos dos

(Cuando somos dos)
(Es mas lindo cuando somos dos)

Soy Simona
Cantar mi corazón ilusiona
Mi sueño voy de a poco alcanzando
Y no puedo dejar de pensar en tu amor

Cada vez que un recuerdo se asoma (se asoma)
Intento al menos no ser tan obvia
Y que no te des cuenta que muero por vos
Soy como soy, pero mi amor
Es mas lindo cuando somos dos"""


I am working on the file "Algoritmos I/2018-1C/clase-09-04.ipynb".
The first task is:
Version haciendo templates con format strings
Supongamos que es bastante comun esto de solo cambiar el nombre, andar cortando y haciendo copias de listas, cadenas o lo que sea, no es como una idea muy copada. Usando cadenas con formato, se puede hacer mas amigable.

Paso 1: Reemplazar todas las apariciones de Simona por '{0}' para generar el template (usamos replace porque ya viene en Python y no tengo ganas de hacerlo a mano)
Can you write Python code for it?

template = si_si_simona.replace("Simona","{0}")
print(template)


I am working on the file "Algoritmos I/2018-1C/clase-16-04.ipynb".
The first task is:
Bueno, si, whatever, es obvio que la funcion lo que hace a fin de cuentas es la interseccion entre 2 conjuntos (para mas informacion, prestar mas atencion en algebra de conjuntos en el CBC). Si bien el ejercicio es bastante trivial en algun punto, recuerden lo que discutimos sobre el hecho de que sean secuencias a secas:
Can you write Python code for it?

interseccion(["Hola","Chau"] , "Hola como estas")


I am working on the file "Algoritmos I/2018-1C/clase-16-04.ipynb".
The first task is:
En la realidad, todos sabemos que los premios se eligen no en base a la realidad y los votos, sino en base a quien pone mas plata para comprarlos. Pero bueno, suponiendo que esto es asi, podriamos automatizar el proceso de eleccion de ganadores.
Vamos a encarar este problema diciendo que las nominaciones estan en una matriz, donde las columnas son categorias, las filas son las posiciones de nominacion y cada celda es una tupla de la forma (Nombre del nominado, puntaje segun los votos). Planteado de esta forma, el problema de encontrar los ganadores se transforma en encontrar el maximo de cada columna de dicha matriz.
Para hacer esto un poco mas realista, vamos a decir que las posiciones de nominacion sirven para desempatar en caso que dos o mas nominados tengan el mismo puntaje. Si no fueran nominados y fueran solo numeros, seria indistinto.
Supongamos que el proceso de nominacion ocurre de la forma:
 * Se parte de una matriz vacia
 * Hay una funcion a la que se le pasa la matriz y esta la llena con los nominados
Can you write Python code for it?

PRIMER_NOMINADO = 0
SEGUNDO_NOMINADO = 1
TERCER_NOMINADO = 2
CUARTO_NOMINADO = 3

ANIME = 0
NOVELA_ARGENTINA = 1
NOVELA_KOREANA = 2

NOMBRE = 0
PUNTAJE = 1

mis_nominados = [
    [None]*3,
    [None]*3,
    [None]*3,
    [None]*3,
]

mis_nominados

def nominar(nominados):
    nominados[PRIMER_NOMINADO][ANIME] = ("Persona 5: The Animation",10)
    nominados[SEGUNDO_NOMINADO][ANIME] = ("Steins;Gate 0",9.9)
    nominados[TERCER_NOMINADO][ANIME] = ("Tokyo Ghoul: re",8)
    nominados[CUARTO_NOMINADO][ANIME] = ("Magical Girl Site", 8)

    nominados[PRIMER_NOMINADO][NOVELA_ARGENTINA] = ("El Sultan",0)
    nominados[SEGUNDO_NOMINADO][NOVELA_ARGENTINA] = ("Simona",5)
    nominados[TERCER_NOMINADO][NOVELA_ARGENTINA] = ("Golpe al corazon", 2)
    nominados[CUARTO_NOMINADO][NOVELA_ARGENTINA] = ("Ojos que no ven", 4)

    nominados[PRIMER_NOMINADO][NOVELA_KOREANA] = ("Another Miss Oh",9)
    nominados[SEGUNDO_NOMINADO][NOVELA_KOREANA] = ("Beating Again",9.9)
    nominados[TERCER_NOMINADO][NOVELA_KOREANA] = ("Goodbye Mr Black",9.9)
    nominados[CUARTO_NOMINADO][NOVELA_KOREANA] = ("Nine Time Travels", 8)

mis_nominados

nominar(mis_nominados)
mis_nominados


I am working on the file "Algoritmos I/2018-1C/clase-16-04.ipynb".
The first task is:
Es mucho muy importante recordar que HAY QUE HACER UNA COPIA DE LA LISTA PARA TRABAJAR. En los siguientes enlaces se puede ver como se comporta todo si hago una copia o si no (y rompo todo)
Con copia
Sin copia
Parte 2: Ya te dije que yo si estoy en la lista
Titulo alternativo: I Will Always Love You
Can you write Python code for it?


I am working on the file "Algoritmos I/2018-1C/clase-23-03-2018.ipynb".
The first task is:
Ejercicio 4.1.a
Escribir una función que dado un número entero n devuelva si es par o no.
Can you write Python code for it?

def es_par(n):
    '''
    Devuelve True si el número n es par.
    '''
    return (n % 2 == 0)

print('¿Es par 19?', es_par(19))
print('¿Es par 12?', es_par(12))


I am working on the file "Algoritmos I/2018-1C/clase-23-03-2018.ipynb".
The first task is:
Notar que en ambos casos se hace el mismo numero de comparaciones, pero para codificar uno u otro se requieren distinto numero de variables. Mas aun, el segundo modo, permite generalizarlo facilmente para poder utilizarlo dentro de un ciclo, como se hace en un ejercicio mas adelante.
Ejercicio 4.3
Escribir una función que reciba por parámetro una dimensión n, e imprima la matriz identidad correspondiente a esa dimensión.
Can you write Python code for it?

def imprimir_matriz_identidad(n):
    '''
    Imprime por pantalla una matriz identidad de NxN.
    '''
    for i in range(n):
        for j in range(n):
            if i == j:
                print('1', end=' ')
            else:
                print('0', end=' ')
        print()

imprimir_matriz_identidad(3)


I am working on the file "Algoritmos I/2018-1C/clase-23-03-2018.ipynb".
The first task is:
Notas de la clase:
 - No es necesario utilizar un if cuando se va a devolver el valor booleano resultante. La expresión (n % 2 == 0) ya da como resultado un valor de verdad, por lo tanto podemos devolverlo directamente.
Ejercicio 4.1.b
Escribir una función que dado un número entero n devuelva si es primo o no.
Can you write Python code for it?

def es_primo(n):
    '''
    Devuelve True si el número n es primo.
    '''

    # Versión con acumulador
    _es_primo = True
    for m in range(2,n):
       _es_primo = _es_primo and (n%m != 0)
    return _es_primo

def es_primo2(n):
    '''
    Devuelve True si el número n es primo.
    '''

    # Versión sin acumulador
    for m in range(2,n):
        if n % m == 0:
            return False
    return True

print('¿Es primo 27?:', es_primo(27))
print('¿Es primo 31?:', es_primo(31))


I am working on the file "Algoritmos I/2018-1C/clase-23-03-2018.ipynb".
The first task is:
Notas de la clase:
 - En la mayoría de los lenguajes la función max sólo admite dos parámetros.
 - En Python la función max puede permitir más de dos parámetros con lo cual se puede resolver con una sola llamada a max.
Notas adicionales (Razonamiento de la clase)
Para pensar este ejercicio, hay que primero notar que nadie internamente hace el maximo de todos contra todos, sino, eventualmente de a pares:
Can you write Python code for it?


I am working on the file "Algoritmos I/2018-2C/clase_objetos.ipynb".
The first task is:
Clase Arma
Can you write Python code for it?

class Gun:
    """Clase que representa un arma generica"""

    SNIPER = "Sniper"
    MORTAR = "Mortar"

    def __init__(self,name,damage,gun_type):

        self.name = name
        self.damage = damage
        self.gun_type = gun_type

    def attack(self,soldier):

        soldier.receive_damage(self.damage,self.gun_type)

import random

class Soldier:
    """Clase que representa a un soldado"""

    def __init__(self, name,gun):

        self.name = name
        self.gun = gun
        self.hp  =  random.randint(600,1200)
        self.shield = random.randint(1,4)

    def get_name(self):
        """Devuelve el nombre del soldado"""
        return self.name

    def attack(self,enemy):
        """ """
        self.gun.attack(enemy)

    def receive_damage(self,damage,gun_type):
        if gun_type == Gun.SNIPER:
            self.hp -= damage / self.shield
            return

        self.hp -= damage

    def __eq__(self,another):
        return self.name == another.name

    def __hash__(self):
        return hash(self.name)


I am working on the file "Algoritmos I/2018-2C/clase_objetos.ipynb".
The first task is:
Clase Escuadron
Can you write Python code for it?

class Squad:
    """Clase que representa un escuadron de soldados"""

    def __init__(self, leader):

        self.leader = leader
        self.squad = set()

    def add_soldier(self,soldier):
        """Agrega un soldado al escuadron"""

        if not isinstance(soldier,Soldier):
            raise TypeError("El escuadron solo puede agregar soldados")

        self.squad.add(soldier)

    def kick_soldier(self):
        """Elimina un soldado del escuadron"""

        pass

    def get_soldiers(self):
        """Devuelve todos los soldados del escuadron, formados"""

        # soldiers = [ soldier for soldier in self.squad ]
        # soldiers.sort()
        # return soldiers
        return sorted(self.squad)

    def get_soldiers_amount(self):
        """ """
        return len(self.squad)


I am working on the file "Algoritmos I/2018-2C/clase_objetos.ipynb".
The first task is:
Nota de clase
Ayer se nos paso durante la clase notar esto. Tanto los sets como el diccionario necesitan que el objeto tenga definido el metodo magico __hash__ para poder ser utilizados. Podemos pensar que el metodo lo que hace, es devolver "la clave" que representa al objeto. En este caso, por supuestos, podemos asumir que al ser los nombres unicos, podemos usar eso:
Can you write Python code for it?

class Soldier:
    """Clase que representa a un soldado"""

    def __init__(self, name):

        self.name = name

    def get_name(self):
        """Devuelve el nombre del soldado"""
        return self.name

    def __eq__(self,another):
        return self.name == another.name

    def __hash__(self):
        return hash(self.name)

alicia = Soldier("Alicia Melchiott")
alicia2 = Soldier("Alicia Melchiott")

welkin = Soldier("Welkin Gunther")

escuadron = Squad(welkin)

escuadron.add_soldier(alicia)
escuadron.add_soldier(alicia2)

assert(escuadron.get_soldiers_amount()==1)


I am working on the file "Algoritmos I/2018-2C/clase_objetos.ipynb".
The first task is:
Omake (La tarea que no hicieron...)
Can you write Python code for it?

class Calculadora:

    def __init__(self):

        self.resultado_anterior = 0

    def sumar(self,numero_1,numero_2=None):
        """ """

        if numero_2 is None:
            numero_2 = self.resultado_anterior

        self.resultado_anterior = numero_1 + numero_2
        return self.resultado_anterior

    def restar(self,numero_1,numero_2=None):
        """ """

        self.resultado_anterior = - self.sumar( - numero_1,numero_2)
        return self.resultado_anterior


I am working on the file "Algoritmos I/2018-2C/clase_objetos.ipynb".
The first task is:
Pruebas
Can you write Python code for it?

escuadron = Squad(welkin)

escuadron.add_soldier(alicia)
escuadron.add_soldier(alicia2)

assert(escuadron.get_soldiers_amount()==1)


I am working on the file "Algos/Play around.ipynb".
The first task is:
2. Plant flowers
Problem:
You can painting a fence made of N boards. You have 2 buckets of paint - black and white. Ypu can not paint more than 2 adjacent voards with the same paint. How many ways are there to paint the fence?
Reference: https://codereview.stackexchange.com/questions/63614/count-number-of-ways-to-paint-a-fence-with-n-posts-using-k-colors
Can you write Python code for it?

# Method 1

def count_1(n: int, m: int):
    """
    :param n: the number of boarder
    :param m: the number of colors
    """
    # base case
    if n <= 0:
        return 0
    if n <= 2:
        return m ** n  # 2 x2 for 4

    sum = 0
    sum += (m-1)*count_1(n-2, m)  # Why m-1. Because we have to make sure that the last color is different from the previous one.
    sum += (m-1)*count_1(n-1, m)

    return sum

# test
n, m = 5, 3
print(count_1(n, m))


I am working on the file "Algos/Play around.ipynb".
The first task is:
3. Jumping rabit!
Problems:
THe road map for the rabit is a list with length of $m$, the rabit can either jump 1 step or 2 steps per jump. How many jumping methods are there for the rabit reach the end (never jump back).
Can you write Python code for it?

# 3. Jumping rabit
mem = {}
def jump_rabit(m: int):
    """"""

    if m <= 3:
        return m-1

    if m in mem.keys():
        return mem[m]
    else:
        mem[m] = jump_rabit(m-1) + jump_rabit(m-2)

    return mem[m]

# test
m = 3
print(jump_rabit(m))


I am working on the file "Alignment.ipynb".
The first task is:
Develop Alignment Algorithm
We want to align align the ADK protein on the backbone of the open state. So the first thing is to create
a selection of the backbone for the reference and trajectory.
Can you write Python code for it?

ref_bb = ref.atoms.select_atoms('backbone')
trj_bb = trj.atoms.select_atoms('backbone')


I am working on the file "Alignment.ipynb".
The first task is:
First we have to load the trajectory we want to align and a reference structure.
Can you write Python code for it?

trj = mda.Universe('data/adk.psf', 'data/adk_dims.dcd')
ref  = mda.Universe('data/adk.psf', 'data/adk_open.pdb')


I am working on the file "Alignment.ipynb".
The first task is:
For later comparison we will save the current RMSD in a variable called RMSD_before
Can you write Python code for it?

RMSD_before = RMSD(trj.atoms, ref.atoms)
print('RMSD before alignment = {}'.format(RMSD_before))


I am working on the file "Alignment.ipynb".
The first task is:
Just for fun we can now check that the RMSD has changed using our own RMSD function
Can you write Python code for it?

RMSD_after = RMSD(trj.atoms, ref.atoms)
print('RMSD before = {}'.format(RMSD_before))
print('RMSD after = {}'.format(RMSD_after))


I am working on the file "Alignment.ipynb".
The first task is:
NOTE:
The RMSD is sensitive to the origin of our structures. By common convention structures are normally centered
at either the center of mass or center of geometry before calculating the RMSD. We will use the center of mass now.
Can you write Python code for it?

trj_xyz = trj_bb.positions - trj_bb.center_of_mass()
ref_xyz = ref_bb.positions - ref_bb.center_of_mass()

np.sqrt(np.sum((trj_xyz - ref_xyz) ** 2 / (3 * trj_bb.n_atoms)))

def RMSD(a, b):
    a_xyz = a.positions - a.center_of_mass()
    b_xyz = b.positions - b.center_of_mass()
    return np.sqrt(np.sum((a_xyz - b_xyz) ** 2 / (3 * a.n_atoms)))


I am working on the file "Alignment.ipynb".
The first task is:
R is the rotation_matrix we need to the alignment and rmsd is the RMSD after the alignment is done.
To align the structures in the lab coordinate system we can't just apply R. First we have to move the structures to be centered at ref_bb_com then we can rotate them. Later we have to move the structures back
Can you write Python code for it?


I am working on the file "Alignment.ipynb".
The first task is:
RMSD Calculation
Our alignment algorithm will be based on comparing the Root Mean Square Deviation (RMSD). The RMSD is a measure for the deviation of the distance between atoms in two structures.
\begin{align}
  RMSD(x, y) = \sqrt{\frac{\sum_{i=1}^{3N} (x_i - y_i)^2}{3N}}
\end{align}
$N$ is the number of atoms of both structures here. We can calculate the RMSD of the first frame in our trajectory with the reference
Can you write Python code for it?

np.sqrt(np.sum((trj_bb.positions - ref_bb.positions))**2 / (3 * trj_bb.n_atoms))


I am working on the file "Alignment.ipynb".
The first task is:
To see the aligned trajectory run
vmd -e align.vmd

Use MDAnalysis algorithm
For convenience MDAnalysis already includes a function which makes the alignment of two proteins easy.
Can you write Python code for it?

rmsd_mda = np.zeros((len(trj.trajectory), 2))

with mda.Writer('rms-alignment.dcd', trj.atoms.n_atoms,
                start=trj.trajectory.start_timestep,
                step=trj.trajectory.skip_timestep,
                dt=trj.trajectory.delta) as w:
    for i, ts in enumerate(trj.trajectory):
        rmsd_mda[i] = mda.analysis.align.alignto(trj, ref, select='backbone')
        w.write(trj)

f, ax = plt.subplots()

# the aligned rmsd is saved in the second column of the array
ax.plot(rmsd_mda[:, 1], '.-')
ax.set(xlabel='frame', ylabel='rmsd',
       title='RMSD of ADK to open conformation')
plt.tight_layout()


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
BWT作为BWM的最后一列，和firstCol有啥关系呢？
我们换一个方式来表示BWM，我们用字符在S上的位置表示每个rotation。
Can you write Python code for it?

print 'Index\tSA\tBWT\tBWM\'\tBWM'
for i, p in enumerate(SA):
    print '{0}\t{1}\t{2}\t{3}\t{4}'.format(i, p, s[p-1],''.join(map(str, range(len(S))[p:]+range(len(s))[:p])),(s+s)[p:p+len(s)])


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
__SA(suffix array)__是一个数组，它是以字典序的方式保存了S中所有后缀在S中的开始位置。
下面继续看例子，我们用Pos数组存放了S的所有后缀的开始位置。
Can you write Python code for it?


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
为了计算的方便，我们给s加一个'$'，用来标示字符串结尾。
Can you write Python code for it?


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
以字典序的方式对Pos数组排序。
Can you write Python code for it?

SA = sorted(Pos, key=lambda x:S[x:])
print SA


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
再放一起看一下。
Can you write Python code for it?

print 'Index\tSA\tBWT\tSuffix'
for i, p in enumerate(SA): print '{0}\t{1}\t{2}\t{3}'.format(i, p, S[p-1],S[p:])


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
再来看一看什么是BWT
__BWT__是S的一个排列，其中BWT[i] = S[SA[i]-1]
Can you write Python code for it?

BWT = ''.join([S[x-1]for x in SA])
print BWT


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
再看一下SA这些位置对应的后缀。
Can you write Python code for it?


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
发现了什么？
BWT[i]的字符是字符串s中SA[i]-1位置的字符，而Suffix[i]是S中SA[i]位置开始的后缀，也就是说其实BWT[i]是Suffix[i]的前一个字符。
为了更清楚的观察，我们这回用BWM矩阵，代表以字典序的方式排列S中的所有轮转(rotation)。
Can you write Python code for it?

print 'Index\tSA\tBWT\tBWM'
for i, p in enumerate(SA): print '{0}\t{1}\t{2}\t{3}'.format(i, p, s[p-1],(s+s)[p:p+len(s)])


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
好像不太直观，换个方式来看一看
Can you write Python code for it?

from Bio.pairwise2 import format_alignment
for aln in alignments : print(format_alignment(*aln))


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
现在对这两个Read比对一下看看是什么效果
Can you write Python code for it?

seq1 = str(records[0].seq)
seq2 = str(records[1].seq)
alignments = pairwise2.align.globalxx(seq1, seq2)
print alignments


I am working on the file "Alignment/FMindex/FM-index based alignment.ipynb".
The first task is:
简单解释一下这个结果
这里出现了两个最佳比对，它们的Score都是44。
在每个最佳比对中，用竖线直观显示字符间对齐。
'-'表示空格， 例如，在第一个最佳比对中， read1的"AC-A"与read2的"ACCA"对齐，在第2个位置(位置从0开始)处read2比read1多了一个字符'C'。
我们管read2比read1在第2个位置处多了一个字符的情况，称为1个插入(insertion)，反之，称为删除(deletion)。
对齐的字符如果相同，称为__match__，不同称为__mismatch__。
总结一下
insertion:              '_' => 'A'
deletion：              'A' => '_'
match:                  'A' => 'A'
mismatch:               'A' => 'C'

把第一个最佳比对的mismatch、insertion和deletion都找出来
Can you write Python code for it?

edit = [(i, j) for i, j in zip(alignments[0][0], alignments[0][1]) if i != j]
for e in edit: print e[0], '->', e[1]


I am working on the file "AllValues.ipynb".
The first task is:
Authenticate with Google
This will open a browser to let you beging the process of authentication with an existing Google Drive account. This process will be separate from Python. For this to work, you will need to set up a Other Authentication OAuth credential at https://console.developers.google.com/apis/credentials, save the secret file in your root directory and a few other things that are detailed at https://pythonhosted.org/PyDrive/. The PyDrive instructions also show you how to set up your Google application. There are other methods for accessing the Google API from python, but this one seems pretty nice.
The first time through the process, regular sign in and two factor authentication is required (if you require two factor auth) but after that it is just a process of telling Google that it is ok for your Google application to access Drive.
Can you write Python code for it?

# Authenticate into Google Drive
from pydrive.auth import GoogleAuth

gauth = GoogleAuth()
gauth.LocalWebserverAuth()


I am working on the file "AllValues.ipynb".
The first task is:
Boxplots Using Seaborn
Can you write Python code for it?

import seaborn as sns
sns.set(style="ticks", palette="muted", color_codes=True)

sns.boxplot(x="Month", y="HeartRate", data=HR_df,whis=np.inf, color="c")
# Add in points to show each observation
snsplot = sns.stripplot(x="Month", y="HeartRate", data=HR_df,jitter=True, size=1, alpha=.15, color=".3", linewidth=0)

hr_only = HR_df[['Create','HeartRate']]
hr_only.tail()

hr_only.to_csv('~/Downloads/stc_hr.csv')


I am working on the file "AllValues.ipynb".
The first task is:
Download the file from Google Drive
Ensure that the file downloaded is the latest file generated
Can you write Python code for it?

for file1 in file_list:
        if file1['id'] == selection_id:
            print('Downloading this file: %s, id: %s createDate: %s' % (file1['title'], file1['id'], file1['createdDate']))
            file1.GetContentFile("healthextract/export.zip")


I am working on the file "AllValues.ipynb".
The first task is:
Download the most recent Apple Health export file
Now that we are authenticated into Google Drive, use PyDrive to access the API and get to files stored.
Google Drive allows multiple files with the same name, but it indexes them with the ID to keep them separate.
In this block, we make one pass of the file list where the file name is called export.zip, and save the row that corresponds with the most recent date. We will use that  file id later to download the correct file that corresponds  with the most recent date. Apple Health export names the file export.zip, and at the time this was written, there is no other option.
Can you write Python code for it?

from pydrive.drive import GoogleDrive
drive = GoogleDrive(gauth)

file_list = drive.ListFile({'q': "'root' in parents and trashed=false"}).GetList()

# Step through the file list and find the most current export.zip file id, then use
#      that later to download the file to the local machine.
# This may look a little old school, but these file lists will never be massive and
#     it is readable and easy one pass way to get the most current file using the
#     least (or low) amount of resouces

selection_dt = datetime.strptime("2000-01-01T01:01:01.001Z","%Y-%m-%dT%H:%M:%S.%fZ")
print("Matching Files")
for file1 in file_list:
    if re.search("^export-*\d*.zip",file1['title']):
        dt = datetime.strptime(file1['createdDate'],"%Y-%m-%dT%H:%M:%S.%fZ")
        if dt > selection_dt:
            selection_id = file1['id']
            selection_dt = dt
        print('    title: %s, id: %s createDate: %s' % (file1['title'], file1['id'], file1['createdDate']))

if not os.path.exists('healthextract'):
    os.mkdir('healthextract')


I am working on the file "AllValues.ipynb".
The first task is:
Extract Values to Data Frame
TODO: Abstraction of the next code block
Can you write Python code for it?

import pytz

#Extract the heartrate values, and get a timestamp from the xml
# there is likely a more efficient way, though this is very fast
def txloc(xdate,fmt):
    eastern = pytz.timezone('US/Eastern')
    dte = xdate.astimezone(eastern)
    return datetime.strftime(dte,fmt)

def xmltodf(eltree, element,outvaluename):
    dt = []
    v = []
    for atype in eltree.findall('Record'):
        if atype.get('type') == element:
            dt.append(datetime.strptime(atype.get("startDate"),"%Y-%m-%d %H:%M:%S %z"))
            v.append(float(atype.get("value")))

    myd = pd.DataFrame({"Create":dt,outvaluename:v})
    colDict = {"Year":"%Y","Month":"%Y-%m", "Week":"%Y-%U","Day":"%d","Hour":"%H","Days":"%Y-%m-%d","Month-Day":"%m-%d"}
    for col, fmt in colDict.items():
        myd[col] = myd['Create'].dt.tz_convert('US/Eastern').dt.strftime(fmt)

    myd[outvaluename] = myd[outvaluename].astype(float) #.astype(int)
    print('Extracting ' + outvaluename + ', type: ' + element)

    return(myd)

HR_df = xmltodf(e,"HKQuantityTypeIdentifierHeartRate","HeartRate")
HA_df = xmltodf(e,"HKQuantityTypeIdentifierEnvironmentalAudioExposure","EnvAudio")
EX_df = xmltodf(e,"HKQuantityTypeIdentifierAppleExerciseTime","Extime")

SPO2_df = xmltodf(e,"HKQuantityTypeIdentifierOxygenSaturation","SPO2")

HR_df

#reset plot - just for tinkering
plt.rcParams['figure.figsize'] = 60, 8

HR_df.boxplot(by='Month',column="HeartRate", return_type='axes')
plt.grid(axis='x')
plt.title('All Months')
plt.ylabel('Heart Rate')
plt.ylim(40,140)

dx = HR_df[HR_df['Year']=='2019'].boxplot(by='Week',column="HeartRate", return_type='axes')
plt.title('All Weeks')
plt.ylabel('Heart Rate')
plt.xticks(rotation=90)
plt.grid(axis='x')
[plt.axvline(_x, linewidth=1, color='blue') for _x in [10,12]]
plt.ylim(40,140)

monthval = '2019-10'
#monthval1 = '2017-09'
#monthval2 = '2017-10'
#HR_df[(HR_df['Month']==monthval1) | (HR_df['Month']== monthval2)].boxplot(by='Month-Day',column="HeartRate",...


I am working on the file "AllValues.ipynb".
The first task is:
List XML headers by element count
Can you write Python code for it?

pd.Series([el.tag for el in e.iter()]).value_counts()


I am working on the file "AllValues.ipynb".
The first task is:
List types for "Record" Header
Can you write Python code for it?

pd.Series([atype.get('type') for atype in e.findall('Record')]).value_counts()


I am working on the file "AllValues.ipynb".
The first task is:
Parse Apple Health Export document
Can you write Python code for it?

path = "/Users/samuelcroker/Documents/repositories/RHealthDataImport/healthextract/apple_health_export/export.xml"
e = et.parse(path)
#this was from an older iPhone, to demonstrate how to join files
#legacy = et.parse("/Users/samuelcroker/Documents/repositories/RHealthDataImport/healthextract/apple_health_export/export.xml")


I am working on the file "Alumnos/AleisterMontfort/Tarea1AleisterM+19_06_17.ipynb".
The first task is:
5. Transposición
Intenté definir una función para transponer
Can you write Python code for it?


I am working on the file "Alumnos/AleisterMontfort/Tarea1AleisterM+19_06_17.ipynb".
The first task is:
Aquí acaba lo que pude hacer
Can you write Python code for it?

class Array:
    "Una clase minima para algebra lineal"
    def __init__(self, list_of_rows):
        "Constructor y validador"
        # obtener dimensiones
        self.data = list_of_rows
        nrow = len(list_of_rows)
        #  ___caso vector: redimensionar correctamente
        if not isinstance(list_of_rows[0], list):
            nrow = 1
            self.data = [[x] for x in list_of_rows]
        # ahora las columnas deben estar bien aunque sea un vector
        ncol = len(self.data[0])
        self.shape = (nrow, ncol)
        # validar tamano correcto de filas
        if any([len(r) != ncol for r in self.data]):
            raise Exception("Las filas deben ser del mismo tamano")

    def __add__(self, other):
        "Hora de sumar"
        if isinstance(other, Array):
            if self.shape != other.shape:
                raise Exception("Las dimensiones son distintas!")
            rows, cols = self.shape
            newArray = Array([[0. for c in range(cols)] for r in range(rows)])
            for r in range(rows):
                for c in range(cols):
                    newArray.data[r][c] = self.data[r][c] + other.data[r][c]
            return newArray
        elif isinstance(2, (int, float, complex)): # en caso de que el lado derecho sea solo un numero
            rows, cols = self.shape
            newArray = Array([[0. for c in range(cols)] for r in range(rows)])
            for r in range(rows):
                for c in range(cols):
                    newArray.data[r][c] = self.data[r][c] + other
            return newArray
        else:
            return NotImplemented # es un tipo de error particular usado en estos metodos
    def __radd__(self,other):
        if  isinstance(other, (int, float, complex)):
            rows, cols = self.shape
            newArray = Array([[0. for c in range(cols)] for r in range(rows)])
            for r in range(rows):
                for c in range(cols):
                    newArray.data[r][c] = self.data[r][c] + other
           ...


I am working on the file "Alumnos/AleisterMontfort/Tarea1AleisterM+19_06_17.ipynb".
The first task is:
Ejercicio 1
Can you write Python code for it?

B = np.array([[1,2,3], [4,5,6]]) # habiendo corrido import numpy as np

B + 2*B # Python sabe sumar y multiplicar arrays como algebra lineal

np.matmul(B.transpose(), B) # B^t*B

B[1,1]

B[1,:]

B[:,1]

x = [1,2,3]
x[0] = 'hola'
x


I am working on the file "Alumnos/AleisterMontfort/Tarea1AleisterM+19_06_17.ipynb".
The first task is:
Ejercicio 1: Escribe los metodos repr y str para la clase Array de forma que se imprima legiblemente como en numpy arrays.
A. Primero hacemos un metodo para repr y str
Can you write Python code for it?

class Array:
    "Una clase minima para algebra lineal"
    def __init__(self, list_of_rows):
        "Constructor"
        self.data = list_of_rows
        self.shape = (len(list_of_rows), len(list_of_rows[0]))
    def __repr__(self):
        return "\n".join([str(x) for x in self.data])
    def __str__(self):
        for l in self.data:
            x= "\n".join([str(s) for s in self.data])
            for s in x:
                return x.replace(',','')

A=Array([[1,2,3], [4,5,6], [4,5,9]])

A

print(A)

A.data


I am working on the file "Alumnos/AleisterMontfort/Tarea1AleisterM+19_06_17.ipynb".
The first task is:
Ejercicio 2
Can you write Python code for it?

class Array:
    "Una clase minima para algebra lineal"
    def __init__(self, list_of_rows):
        "Constructor y validador"
        # obtener dimensiones
        self.data = list_of_rows
        nrow = len(list_of_rows)
        #  ___caso vector: redimensionar correctamente
        if not isinstance(list_of_rows[0], list):
            nrow = 1
            self.data = [[x] for x in list_of_rows]
        # ahora las columnas deben estar bien aunque sea un vector
        ncol = len(self.data[0])
        self.shape = (nrow, ncol)
        # validar tamano correcto de filas
        if any([len(r) != ncol for r in self.data]):
            raise Exception("Las filas deben ser del mismo tamano")


I am working on the file "Alumnos/AleisterMontfort/Tarea1AleisterM+19_06_17.ipynb".
The first task is:
Ejercicio 4
Definir matriz de ceros
Can you write Python code for it?

def zeros(m, n):
    return [[0]*n for _ in range(m)]
    def __str__(self):
        for l in self.data:
            x= "\n".join([str(s) for s in self.data])
            for s in x:
                return x.replace(',','')

zeros(4,6)


I am working on the file "Alumnos/AleisterMontfort/Tarea1AleisterM+19_06_17.ipynb".
The first task is:
Ejercicio 6. SUMA Y RESTA DE MATRICES
Intenté definir primero funciones para suma y resta de matrices. No contiene el caso escalar
Can you write Python code for it?

def suma_matrices(A, B):
    rv = []
    for x in range(len(A)):
        rv.append([])
    for i in range(len(A)):
        for j in range(len(A[i])):
            c = A[i][j] + B[i][j]
            rv[i].append(c)
    return rv

#supuesto 1 = se tiene que asegurar que matriz A sea nxm y b mxk

def subs_matrices(A, B):
    rv = []
    for x in range(len(A)):
        rv.append([])
    for i in range(len(A)):
        for j in range(len(A[i])):
            c = A[i][j] - B[i][j]
            rv[i].append(c)
    return rv

A=[[1, 3], [2, 4] , [2, 4]]
B=[[5, 5], [4, 8], [2, 4]]

suma_matrices(A,B)

subs_matrices(A,B)

suma_matrices(A,1)  #No sirve para sumar escalares!

##Multiplicación de Matrices

def dot_product(list_1, list_2):
    if len(list_1) == len(list_2):
        rv = 0
        for i, x in enumerate(list_1):
            product = list_1[i] * list_2[i]
            rv += product
        return rv
    else:
        print('Error: lists with different lengths!')

def multiplicacion_matrices(A, B):
    # suponiendo supuesto 1
    rv = []
    for x in range(len(A)):
        rv.append([])
    for i, fila in enumerate(A):
        columna_b = []
        for fila_b in B:
            b = fila_b[i]
            columna_b.append(b)
        producto = dot_product(fila, columna_b)
        print(producto)

multiplicacion_matrices(B, transpose(B))


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
5.- Método descenso gradiente
Can you write Python code for it?

def descenso_gradiente (alpha, x, y, num_iter):
    n = x.shape[0]
    theta = np.ones(2)
    for i in range(0,num_iter):
        hipotesis = np.dot(x, theta)
        perdida = hipotesis - y
        J = np.sum(perdida**2) / (2*n)
        gradiente = np.dot(x.transpose(),perdida) / n
        theta = theta - alpha * gradiente
    return theta

alpha = 0.014
X=np.c_[np.ones(20),np.array(x)]
theta = descenso_gradiente(alpha, X, y, 2000)

theta


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Calculamos la pseudoinversa $X^+$ de $X$ y $X^+*$sat_score para obtener alpha y beta soluciones:
Can you write Python code for it?


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
El problema de optimización que queremos resolver es minimizar los residuos al cuadrado; es decir, encontrar $\alpha$ y $\beta$ que resuelvan el siguiente problema:
$$ \displaystyle{\min_{\alpha , \beta}} \sum_{i=1}^{20} (sat score_i - \alpha - \beta*study hours_i)^2$$
Por facilidad en la escritura, definimos $y_i=satscore_i$ y $x_i=studyhours_i$, entonces la función a minimizar sería la siguiente: $ P(\alpha, \beta)= \sum_{i=1}^{20} (y_i - \alpha - \beta x_i)^2$.
El gradiente de la función es el siguiente: $$\nabla P(\alpha,\beta)=\left( \frac{\partial}{\partial \alpha}P(\alpha,\beta),\frac{\partial}{\partial \beta}P(\alpha,\beta)\right) = \left(- \sum_{i=1}^{20} 2(y_i - \alpha - \beta x_i),\sum_{i=1}^{20} 2(y_i - \alpha - \beta x_i)x_i\right)$$
La solución al problema de minimizar los residuos al cuadrado es el siguiente:
Can you write Python code for it?

x=df.iloc[:,0]
y=df.iloc[:,1]
x_barra=sum(x)/len(x)
y_barra=sum(y)/len(y)
beta=sum((x-x_barra)*(y-y_barra))/sum((x-x_barra)*(x-x_barra))
alpha=y_barra - beta*x_barra

alpha

beta


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
En este ejemplo estamos utilizando una matriz cuadrada que no es invertible, por lo que la pseudoinversa no tiene todas las propiedades de una inversa.
a) En nuestro ejemplo, la imagen es $(x+y,0)$ con $x,y\in \Re$. En el caso en que $b$ está en la imagen al resolver el sistema utilizando la pseudoinversa nos da una de la infinidad de soluciones posibles.
En el caso que $b$ no está en la imagen, pese a que no existe una solución, al resolver el sistema con la pseudoinversa obtenemos un resultado similar al que se obtiene cuando está en la imagen.
b) La solución no es única, hay una infinidad de soluciones. La solución al sistema que se obtiene en este ejemplo usando la pseudoinversa es de la forma $x=y$, sin importar que $b$ se encuentre o no en la imagen.
Can you write Python code for it?


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Función que recibe valores de alpha, beta y el vector sat_score y devuelva un vector array de numpy de predicciones alpha + beta*study_hours_i, con un valor por cada individuo (Nota: me parece que lo que se busca en este punto, es programar una función para generar las predicciones de sat_score para cada individuo en funcion de alpha, beta y study_hours):
Can you write Python code for it?

def predict(alpha,beta,x):
    return alpha + beta*x

predict(alpha,beta,x)


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Función que resuelve sistemas de ecuaciones de la forma $Ax=b$ usando la pseudoinversa:
Can you write Python code for it?

def solve_pseudo(A,b):
    if isinstance(A,(np.ndarray,np.generic)):
        return np.matrix(pseudo(A))*np.matrix(b)
    else:
        return NotImplemented

A=np.matrix([[1,1],[0,0]])
b1=np.array([[1],[0]])
b2=np.array([[3],[0]])
b3=np.array([[1],[1]])

solve_pseudo(A,b1)

solve_pseudo(A,b2)

solve_pseudo(A,b3)


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Numpy array $X$ de dos columnas, la primera con unos en todas sus entradas y la segunda con la variable study_hours. Observemos que X[alpha,beta] nos devuelve alpha + betastudy_hours_i en cada entrada y que entonces el problema se vuelve sat_score ~ X*[alpha,beta]:
Can you write Python code for it?


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Por lo tanto, la solución de la fórmula directa es la misma a la que obtuvimos con la pseudoinversa.
4.- Visualizar predicciones con alpha y beta solución contra valores reales de sat_score utilizando Matplotlib
Can you write Python code for it?

import matplotlib.pyplot as plt
d = {'sat_score' : y,'predicciones' : alpha + beta*x}
df = pd.DataFrame(d)
df.plot(kind='scatter', x='sat_score', y='predicciones')
plt.plot( [400,800],[400,800], color='DarkBlue' );
plt.show()


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Probando con distintos learning rates:
Can you write Python code for it?

alpha = 0.015
X=np.c_[np.ones(20),np.array(x)]
theta = descenso_gradiente(alpha, X, y, 2000)

theta

alpha = 0.016
X=np.c_[np.ones(20),np.array(x)]
theta = descenso_gradiente(alpha, X, y, 2000)

theta

alpha = 0.017
X=np.c_[np.ones(20),np.array(x)]
theta = descenso_gradiente(alpha, X, y, 2000)

theta


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Resulta interesante notar que con $k=50$ la imagen ya se asemeja bastante a la original.
Este proyecto tiene que ver con compresión de imágenes pues al utilizar los primeros $k$ vectores singulares para la nueva imagen se está ocupando menos espacio con respecto a la imagen original. Como mencionado con antelación, considerando sólo los primeros 50 vaectores propios, la imagen describe relativamente bien a la original.
2.- Aplicaciones de la pseudoinversa y sistemas de ecuaciones
Función que dada cualquier matriz devuelve la pseudoinversa:
Can you write Python code for it?

def pseudo(A):
    if isinstance(A,np.ndarray) or isinstance(A,np.generic):
        U,sigma,V=np.linalg.svd(A)
        sigma_inv=np.zeros(sigma.shape)
        for i in range(len(sigma)):
            if sigma[i]==0:
                sigma_inv[i]=0
            else:
                sigma_inv[i]=1/sigma[i]
        if A.shape[0]==A.shape[1]:
            return np.transpose(np.matrix(V))*np.diag(sigma_inv)*np.transpose(np.matrix(U))
        elif A.shape[0] < A.shape[1]:
            ncol=sigma.shape[0]
            nren=A.shape[1]-A.shape[0]
            return np.transpose(np.matrix(V))*np.append(np.diag(sigma_inv),np.zeros((nren,ncol)),axis=0)*np.transpose(np.matrix(U))
        else:
            nren=np.absolute(A.shape[1]-A.shape[0])
            return np.transpose(np.matrix(V))*np.append(np.diag(sigma_inv),np.zeros((V.shape[1],nren)),1)*np.transpose(np.matrix(U))
    else:
        return NotImplemented


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Reviso la descomposición. Es decir: $$mat = U \Sigma V^T$$
Can you write Python code for it?


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Utilizo la descomposicón SVD para dar una aproximación de grado k de la imagen:
Por ejemplo, si $k=3$
Can you write Python code for it?


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
Vamos a corrobar que para la siguientes matriz la función de los mismos resultados que la de Numpy:
Can you write Python code for it?


I am working on the file "Alumnos/Alejandro_Hdz/Tarea 2 - Alejandro Hernández Farías.ipynb".
The first task is:
c) En este caso la solución aparentemente sí es única. Los valores de $x$ obtenidos de resolver el sitema $Ax=b$ son distintos en todo los casos, con respecto al punto anterior.
3.- Pandas, data frames y mínimos cuadrados
Script que lee el archivo study_vs_sat.csv y lo almacena como un data frame de pandas:
Can you write Python code for it?

import pandas as pd
df=pd.read_csv('https://raw.githubusercontent.com/mauriciogtec/PropedeuticoDataScience2017/master/Tarea/study_vs_sat.csv')

df.head()


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio1
Escribe los metodos repr y str para la clase Array de forma que se imprima legiblemente como en numpy arrays.
Can you write Python code for it?


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio10
Implementa una funcion lu_linsolve que resuelva cualquier sistema de ecuaciones Ax = y con A un Array y y un Vector o Array de una columna.
Can you write Python code for it?

def lu_linsolve(A,y):
    "Funcion para resolver sistemas de ecuaciones basado en la descomposicion LU"
    solucion = None
    if type(A) == Array and type(y) == Array:
        if A.shape[0] == y.shape[0]:
            L,U,P = LU(A)
            new_vector = []
            for x in range(P.shape[0]):
                for z in range(P.shape[1]):
                    if(P[x,z] == 1):
                        new_vector.append([y[z,0]])

            new_vector = Array(new_vector)
            x = Array([forward_subs(L,new_vector)])
            solucion = backward_subs(U, x.transpose())

        else:
            print("No son compatibles Array y vector")
            print("Forma de matriz ")
            print(A.shape)
            print("Forma de vector")
            print(y.shape)
    else:
        print("No son estructuras de datos Array")

    return solucion

matriz = Array([[1,1,3],[2,4,4],[2,2,2]])
print("La matriz es: ")
print(matriz)
vector = Array([[30],[68],[36]])
print("El vector es: ")
print(vector)
solucion = lu_linsolve(matriz,vector)
print("La solucion al sistema de ecuaciones es")
print(solucion)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio2
Escribe el metodo setitem para que el codigo A[i,j] = new_value cambie el valor de la entrada (i,j) del array.
Can you write Python code for it?

dato = Array([[1,2,3],[4,5,6],[8,9,10]])
print("Original: ")
print(dato)
print("Acceder a elemento por indices dato[1,2]")
print(dato[1,2])
dato[0,0] = 10
print("Asignamos elemento por indices dato[0,0] = 10")
print(dato)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio3
Implementa una funcion de zeros para crear arrays "vacios"
Can you write Python code for it?

def zeros(filas, columnas):
    "Clase que crea un objeto de clase Array inicializado con valores en ceros sintaxis matriz_ceros(2,3)"
    return Array([[0 for x in range(columnas)] for y in range(filas)])

zeros(5,5)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio4
Implementa la funcion de transposicion
Can you write Python code for it?


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio5
Investiga como implementar el metodo de clase radd
Can you write Python code for it?

dato = Array([[1,2,3],[4,5,6],[8,9,10]])
dato1 = Array([[1,2,71],[14,15,16],[28,29,20]])
print("elemento1" )
print(dato)
print("elemento2" )
print(dato1)
print("suma de ambos")
print(dato+dato1)
print("suma de Array y escalar")
print(dato+1)
print("suma de escalar y Array")
print(1+dato)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio6
Implementa las funciones mul y rmul para hacer multiplicacion matricial (y por un escalar).
Can you write Python code for it?

dato = Array([[1,2,3],[4,5,6],[1,2,3],[4,5,6]])
dato1 = Array([[1,2,8,78],[14,15,12,21],[28,29,78,90]])
print("primer elemento")
print(dato)
print("Segundo elemento")
print(dato1)
print ("multiplicacion")
print(dato*dato1)
print("multiplicacion de primer elemento por escalar 5")
print(dato * 5)
print("multiplicacion de escalar 5 por primer elemento")
print(5*dato)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio7
Implementa una funcion forward_subs que resuelva sistemas de ecuaciones de la forma $Lx = y$ con $L$ triangular inferior y $y$ cualquier Vector o Array de una columna.
Can you write Python code for it?

def forward_subs(matrix,vector):
    "Resuelve matrices de la forma Lx = b"

    """ Codigo de validacion, tamanios, matriz L"""
    flag = False
    y = None
    if type(matrix) == Array and type(vector) == Array:
        if matrix.shape[0] == vector.shape[0]:
           if matrix.shape[0] == matrix.shape[1]:
               for y in range(matrix.shape[0]):
                   for x in range(matrix.shape[1]):
                       if x>y:
                           if not matrix[y,x] == 0:
                               raise Exception("No es matriz L")
                           else:
                               flag = True
           else:
                print("No es matriz cuadrada")
        else:
            print("No concuerdan las dimensiones de la matriz y del vector")

    if flag:
        print("Es matriz L")
        y = []
        for a in range(vector.shape[0]):
            y.append(vector[a,0])
            for b in range(a):
                y[a]-=matrix[a,b]*y[b]
            y[a] /= matrix[a,a]

    return y

dato = Array([[1,0,0,0],[4,2,0,0],[1,2,1,0],[3,4,5,2]])
print("Matriz: ")
print(dato)
print("vector")
vector = Array([[1],[2],[3],[6]])
print(vector)
print("solucion de resolucion de Lx = b")
print(forward_subs(dato,vector))


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio8
Implementa una funcion backward_subs que resuelva sistemas $Ux = y$ con $U$ triangular superior y y Vector o Array de una columna.
Can you write Python code for it?

def backward_subs(matrix, vector):
    "Resuelve matrices de la forma Lx = b"
    """ Codigo de validacion, tamanios, matriz L"""
    flag = False
    y = None
    if type(matrix) == Array and type(vector) == Array:
        if matrix.shape[0] == vector.shape[0]:
           if matrix.shape[0] == matrix.shape[1]:
               for y in range(matrix.shape[0]):
                   for x in range(matrix.shape[1]):
                       if x<y:
                           if not matrix[y,x] == 0:
                               raise Exception("No es matriz U")
                           else:
                               flag = True
           else:
                print("No es matriz cuadrada")
        else:
            print("No concuerdan las dimensiones de la matriz y del vector")

    if flag:
        print("Es matriz U")
        y = [0] * vector.shape[0]
        for a in range(vector.shape[0]-1,-1,-1):
            y[a] = vector[a,0]
            for b in range(a+1,vector.shape[0]):
                y[a]-=matrix[a,b]*y[b]
            y[a] /= matrix[a,a]

    return y

dato = Array([[1,1],[0,2]])
print("Matriz: ")
print(dato)
print("vector")
vector = Array([[12],[20]])
print(vector)
print("solucion de resolucion de Ux = b")
print(backward_subs(dato,vector))


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio9
Implementa una funcion LU que reciba un Array  $A$ y devuelva 3 arrays $L$,$U$ y $P$ tales que  $PA = LU$ con $L$ trangular inferior, $U$ triangular superior y $P$ matriz de permutacion.
Can you write Python code for it?

def LU(A):
    "Funcion para realizar descomposicion de matriz en PA = LU"
    if type(A == Array):

        L = [[0 for x in range(A.shape[1])] for y in range(A.shape[0])]
        for a in range(A.shape[0]):
            L[a][a] = 1

        L = Array(L)

        """Matriz de permutacion"""
        list_tuples = [(0,0) for x in range(A.shape[0])]

        for a in range(A.shape[0]):
            list_tuples[a] = (a,A.data[a])

        data = []
        data.append((0,A.data[0]))
        del list_tuples[0]

        if len(list_tuples) == 1:
            starting = 0
        else:
            starting = 1

        for row in range(starting,len(list_tuples)):
            temp = sorted(list_tuples, key=lambda value: value[1][row], reverse=True)
            data += temp

        U = []
        for row in data:
            U.append(row[1])

        U = Array(U)

        permutation_matrix = [[0 for x in range(A.shape[0])] for y in range(A.shape[0])]
        permutation_matrix = Array(permutation_matrix)

        for row in range(len(data)):
            permutation_matrix[row, data[row][0]] = 1

        n = A.shape[0]
        for a in range(n):
            for b in range(a+1,n):
                multiplicador = float((U[b,a]/U[a,a]))
                L[b,a] = multiplicador
                multiplicador= multiplicador*(-1)
                for c in range(n):
                    U[b,c] += U[a,c]*multiplicador
        return [L,U,permutation_matrix]

A = Array([[1,1,-1],[1,-2,3],[2,3,1]])
#A = Array([[1,7,-1],[1,6,8],[2,3,7]])
print("Matriz original")
print(A)
L,U,P = LU(A)
print("Matrices de Lower, Upper y Permutacion son: ")
print("L")
print(L)
print("U")
print(U)
print("P")
print(P)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Implementa el metodo de clase sub similar a la suma para poder calcular expresiones como A - B para A y B arrays o numeros.
Can you write Python code for it?

print("Resta de ambos")
print(dato-dato1)
print("Resta de Array y escalar")
print(dato-1)
print("Resta de escalar y Array")
print(1-dato)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea1-ArturoGonzalezBencomo.ipynb".
The first task is:
Implementa una funcion eye(n) que crea la matriz identidad de nxn
Can you write Python code for it?

def evaluate(a,b):
    "Evalua si son iguales y regresa 1, si no 0"
    if a == b:
        return 1
    else:
        return 0

def eye(n):
    "Crea matriz diagonal de dim = n x n"
    return Array([[evaluate(x,y) for x in range(n)] for y in range(n)])

eye(5)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea2-ArturoGonzalezBencomo.ipynb".
The first task is:
1. Programar una función que dada cualquier matriz devuelva la pseudoinversa usando la descomposición SVD. Hacer otra función que resuelva cualquier sistema de ecuaciones de la forma Ax=b usando esta pseudoinversa.
Can you write Python code for it?

A = np.array([[1,1,1],[1,1,3],[2,4,4]])
b = np.array([[18,30,68]])

solve = lin_solve_pseudo(A,np.transpose(b))
print(solve)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea2-ArturoGonzalezBencomo.ipynb".
The first task is:
2. Realizar y verificar la descomposición svd.
Can you write Python code for it?

imggrayArray = np.array(list(imggray.getdata(band=0)), float)
imggrayArray.shape = (imggray.size[1], imggray.size[0])
imggrayArray = np.matrix(imggrayArray)

plt.imshow(imggray)

plt.show()

u, s, v = np.linalg.svd(imggrayArray)

print("La matriz U es: ")
print(u)
print("La matriz S es: ")
print(s)
print("La matriz V es: ")
print(v)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea2-ArturoGonzalezBencomo.ipynb".
The first task is:
3. Programar una función que reciba valores de alpha, beta y el vector study_hours y devuelva un vector array de numpy de predicciones alpha + beta*study_hours_i, con un valor por cada individuo
Can you write Python code for it?

def predict(alfa, beta, study_hours):
    study_hours_i=[]
    for a in range(len(study_hours)):
        study_hours_i.append(alfa + beta*np.array(study_hours[a]))
    return study_hours_i

print("prediccion")
print(predict(353.165, 25.326, hrs_studio))


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea2-ArturoGonzalezBencomo.ipynb".
The first task is:
Contestar, ¿qué tiene que ver este proyecto con compresión de imágenes?
En este proyecto se planteó una aplicación de la descomposición de una imagen mediante svd y se pudo comprender que esta técnica permite la compresión de información mediante reducción de componentes principales, es decir reducción de columnas en la matriz U, filas o columnas de la matriz S (componentes principales) y filas de la matriz $V^{-1} $
Ejercicio2
Funciones del ejercicio2
Can you write Python code for it?

def lin_solve_pseudo(A,b):
    pseudoinv = pseudoinverse(A)
    return np.matmul(pseudoinv,b)

def pseudoinverse(A):
    u,s,v = np.linalg.svd(A)
    diagonal = np.diag(s)
    if v.shape[0] > diagonal.shape[1]:
        print("Agregando columnas a la sigma")
        vector = np.array([[0 for x in range(v.shape[0] - diagonal.shape[1])] for y in range(diagonal.shape[0])])
        diagonal = np.concatenate((diagonal, vector), axis=1)

    elif u.shape[1] > diagonal.shape[0]:
        print("Agregando renglones a la sigma")
        vector = np.array([[0 for x in range(diagonal.shape[0])] for y in range(u.shape[1]-diagonal.shape[0])])
        diagonal = np.concatenate((diagonal, vector), axis=0)

    for a in range(diagonal.shape[0]):
        for b in range(diagonal.shape[1]):
            if diagonal[a][b] != 0:
                diagonal[a][b] = 1/diagonal[a][b]

    resultante = np.dot(np.transpose(v),np.transpose(diagonal))
    resultante = np.dot(resultante,np.transpose(u))
    return resultante


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea2-ArturoGonzalezBencomo.ipynb".
The first task is:
Ejercicio3
1. Leer el archivo study_vs_sat.csv y almacenearlo como un data frame de pandas.
Can you write Python code for it?

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv("./study_vs_sat.csv", sep=',')
print(data)


I am working on the file "Alumnos/Arturo_Gonzalez/Tarea2-ArturoGonzalezBencomo.ipynb".
The first task is:
La comparación de este método con el anterior es que ambos regresan el ajuste a mínimos cuadrados
7. (Avanzado) Usen la libreria matplotlib para visualizar las predicciones  con alpha y beta solución contra los valores reales de sat_score.
Can you write Python code for it?

plt.plot(hrs_studio, sat_score, 'o', label='Original data', markersize=10)
plt.plot(hrs_studio, m*hrs_studio + c, 'r', label='Fitted line')
plt.legend()
plt.show()


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
(a) Observar que pasa si b esta en la imagen de A (contestar cuál es la imagen) y si no está (ej. b = [1,1]).
La Imagen son todas las posibles combinaciones lineales de las columnas de A, una columna ([[a],[0]]), donde a puede tomar cualquier valor pero el segundo valor siempre es 0. Cuando la solución no existe en la imagen, la pseudoinversa proyecta en esta la solución que más se acerque.
(b) Contestar, ¿la solución resultante es única? Si hay más de una solución, investigar que carateriza a la solución devuelta.
Can you write Python code for it?

A = np.array([[1,1],[0,0]])
b = np.array([[-1],[0]])
# Se calcula b con una solución obvia, pero que no es la que regreso el función que usa la pseudoinversa
x = np.array([[2],[-3]])
np.dot(A,x)

# Se compara con la solución dada por la pseudoinversa
x1 = solve(A,b)
np.dot(A,x1)


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Comparen la solución anterior con la de la fórmula directa de solución exacta (alpha,beta)=(X^tX)^(-1)X^t*sat_score.
Can you write Python code for it?

arraySolucion = np.dot(Xi,data_frame["sat_score"])

arraySolucion[0]

alpha

arraySolucion[1]

Beta


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Definan un numpy array X de dos columnas, la primera con unos en todas sus entradas y la segunda con la variable study_hours. Observen que X*[alpha,beta] nos devuelve alpha + beta*study_hours_i en cada entrada y que entonces el problema se vuelve sat_score ~ X*[alpha,beta]
Can you write Python code for it?

len(x)
# Se crea la columna de 1's
columna1 = [1 for i in range(len(x))]
# Se combina la columan de 1's y la variable study_hours en una matriz
X = np.array([columna1,data_frame["study_hours"]])
X = X.transpose()

#Se crea el vector "x" con alpha y Beta
vector = np.array([alpha,Beta])

np.dot(X,vector)


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Jugar con el sistema Ax=b donde A=[[1,1],[0,0]] y b puede tomar distintos valores.
Can you write Python code for it?


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
La solución es única, ya que el determinante del sistema no es 0, pero los errores de redondeo con esta clase de números dan lugares a errores numéricos.
En este ejercicio usarán la paquetería pandas para trabajar con datos
Deben programar un script que lea el archivo "https://github.com/mauriciogtec/PropedeuticoDataScience2017/blob/master/Tarea/study_vs_sat.csv" y lo almacene como un data frame de pandas.
Can you write Python code for it?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import io
import requests

# Conseguir archivo del raw en github y almacenarlo en un data frame de pandas
url = "https://raw.githubusercontent.com/mauriciogtec/PropedeuticoDataScience2017/master/Tarea/study_vs_sat.csv"
link = requests.get(url).content
data_frame = pd.read_csv(io.StringIO(link.decode('utf-8')))
data_frame

x = data_frame["study_hours"]
y = data_frame["sat_score"]


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
No existe una solución exacta (solo la mejor aproximación) para b = ([[1],[1]]). Cuando existen múltiples soluciones, la pseudoinversa nos brinda la solución de norma más pequeña.
(c) Repetir cambiando A=[[1,1],[0,1e-32]], ¿En este caso la solucíon es única? ¿Cambia el valor devuelto de x en cada posible valor de b del punto anterior?
Can you write Python code for it?


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Para alguna imagen de su elección, elegir distintos valores de aproximación a la imagen original.
Can you write Python code for it?

# Crear matriz vacía con las dimensiones adecuadas para colocar la aproximación
Aproximacion = np.zeros([matriz.shape[0],matriz.shape[1]])

# Grado 1 de aproximación
k = 1

for i in range(k):
    Aproximacion = Aproximacion + S[i]*np.outer(U[:,i],V[i,:])

plt.imshow(Aproximacion, cmap='gray');a = np.outer(U[:,i],V[:,i])

# Crear matriz vacía con las dimensiones adecuadas para colocar la aproximación
Aproximacion = np.zeros([matriz.shape[0],matriz.shape[1]])

# Grado 10 de aproximación
k = 10

for i in range(k):
    Aproximacion = Aproximacion + S[i]*np.outer(U[:,i],V[i,:])

plt.imshow(Aproximacion, cmap='gray');

# Crear matriz vacía con las dimensiones adecuadas para colocar la aproximación
Aproximacion = np.zeros([matriz.shape[0],matriz.shape[1]])

# Grado 100 de aproximación
k = 100

for i in range(k):
    Aproximacion = Aproximacion + S[i]*np.outer(U[:,i],V[i,:])

plt.imshow(Aproximacion, cmap='gray');

# Crear matriz vacía con las dimensiones adecuadas para colocar la aproximación
Aproximacion = np.zeros([matriz.shape[0],matriz.shape[1]])

# Usando todos los valores singulares disponibles
k = matriz.shape[0]

for i in range(k):
    Aproximacion = Aproximacion + S[i]*np.outer(U[:,i],V[i,:])

plt.imshow(Aproximacion, cmap='gray');


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Pleantear como un problema de optimización que intente hacer una aproximación de la forma sat_score ~ alpha + beta*study_hours minimizando la suma de los errores de predicción al cuadrado, ¿Cuál es el gradiente de la función que se quiere optimizar (hint: las variables que queremos optimizar son alpha y beta)?
Se busca encontrar valores para alpha y Beta de manera que se escriba la ecuación sat_score = alpha + Beta*study_hours minimizando lo más posible el error entre los valores observados y las predicciones de la recta, es decir, la suma de los cuadrados de sus diferencias.
Can you write Python code for it?

# Se calculan los componentes necesarios para calcular alpha y Beta
Sx = sum(x)
Sy = sum(y)
Sxy = sum(x*y)
Sxx = sum(x*x)
Syy = sum(y*y)
n = len(x)

# Se calculan Beta y alpha
Beta = (n*Sxy - Sx*Sy)/(n*Sxx - Sx**2)
alpha = Sy/n - (Beta*Sx)/n


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Programar una función que reciba valores de alpha, beta y el vector study_hours y devuelva un vector array de numpy de predicciones alpha + beta*study_hours_i, con un valor por cada individuo
Can you write Python code for it?

# Vector study_hours
study_hours = np.array(x)

# Se define función para encontrar vector de predicciones
def OLS(a, B, x):
    rows = len(x)
    sat_score = np.array([a + B*x[i] for i in range(rows)])

    return(sat_score)

# Vector sat_score de predicciones de acuerdo a la recta
sat_score = OLS(alpha,Beta,study_hours)
sat_score


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Programen el método de descenso gradiente para obtener alpha y beta por vía de un método numérico de optimización. Experimenten con distintos learning rates (tamaños de paso).
Can you write Python code for it?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import io
import requests

# Conseguir archivo del raw en github y almacenarlo en un data frame de pandas
url = "https://raw.githubusercontent.com/mauriciogtec/PropedeuticoDataScience2017/master/Tarea/study_vs_sat.csv"
s = requests.get(url).content
data_frame = pd.read_csv(io.StringIO(s.decode('utf-8')))

# Separar en data frames para cada variable
x = pd.DataFrame(data_frame.study_hours)
y = pd.DataFrame(data_frame.sat_score)
n = len(x)

# Learning rate o tamaño de paso
lr = 0.01

## Agregar columna de 1's
x["1's"] = 1

# Pasar data frames a numpy arrays
x = np.array(x)
y = np.array(y).flatten()

o = np.array([0, 0])

def FuncionCosto(x, y, o):

    ## Calculate the cost with the given parameters
    J = np.sum((x.dot(o)-y)**2)/2/n

    return J

FuncionCosto(x,y,o)

# Realiza el gradiente descendente mientras va a aprendiendo en o, de acuerdo al numero de repeticiones
def Gradiente(x, y, o, lr, repeticiones):
    CostoTotal = [0] * repeticiones

    for repeticion in range(repeticiones):
        hipotesis = x.dot(o)
        perdida = hipotesis-y
        gradiente = x.T.dot(perdida)/n
        o = o - lr*gradiente
        costo = FuncionCosto(x, y, o)
        CostoTotal[repeticion] = costo

    return o, CostoTotal

(t, c) = Gradiente(x,y,o,lr, 1500)

# Valores de Beta y alpha
t


I am working on the file "Alumnos/DiegoAEstradaRivera/Tarea 2.ipynb".
The first task is:
Usar la descomposición para dar una aproximación de grado k de la imagen.
Can you write Python code for it?

matriz.shape

# Crear matriz vacía con las dimensiones adecuadas para colocar la aproximación
Aproximacion = np.zeros([matriz.shape[0],matriz.shape[1]])

# Elegir un grado k de aproximación
k = 50

for i in range(k):
    Aproximacion = Aproximacion + S[i]*np.outer(U[:,i],V[i,:])

plt.imshow(Aproximacion, cmap='gray');


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
3. Indexing and Item assignment
Tomaria varias lineas de codigo hacer un indexing/slicing tan complejo como el de numpy, pero podemos dar una version sencilla....
Queremos que las siguientes expresiones tengan sentido
```python
A = Array([[1,2],[3,4]])
A[0,0]
A[0,0] = 8
````
Por el momento obtenemos errores
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
<span style = "color: red"> EJERCICIO 1 </span>

Escribe los metodos __repr__ y __str__ para la clase Array de forma que se imprima legiblemente como en numpy arrays.

2. Un validador
Ok esta es la parte aburrida... Los voy a ayudar un poco. Pero no deberia ser cualquier cosa un array, pues todas las filas deberian ser del mismo tamano no? Ademas, las filas deben tener entradas solo numericas... Por ultimo, cuando en vez de listas de listas solo hay una lista, conviene pensarlo como un vector (una columna... por eso yo prefiero llenar por columnas, pero esa es la forma python...).
Todo esto se puede lograr mejorando un poco el validador.
 Una nota al margen  Para hacer el validador voy a usar una de las herramientas mas poderosas de Python, listas de comprehension. Son formas faciles y rapidas de iterar en un solo comando. Un ejemplo:
Can you write Python code for it?

some_list = [1,2,3, 4, 5, 6]
[i**2 for i in some_list] # Elevar al cuadrado con listas de comprehension


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
<span style = "color: red"> EJERCICIO 3 </span>

Implementa una funcion de zeros para crear arrays "vacios"
python
def zeros(shape):
    "Implementame por favor"
Hint, encontraras utiles las listas de comprehension, por ejemplo el codigo [0. for x in range(5)] crea una lista de 5 ceros.
Implementa una funcion eye(n) que crea la matriz identidad de $n\times n$ (es decir, la matriz que tiene puros ceros y unos en la diagonal). El nombre eye es tradicional en software de algebra lineal, aunque no es muy intuitivo.

5. Transposicion
Otro ejercicio muy facil! Debe funcionar igual que numpy!
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
El campo data de un Array almacena la lista de listas del array. Necesitamos implementar algunos metodos para que sea funcional como una clase de algebra lineal.

Un metodo para imprimir una matriz de forma mas agradable
Validador. Un metodo para validar que la lista de listas sea valida (columnas del mismo tamano y que las listas interiores sean numericas
Indexing Hacer sentido a expresiones A[i,j]
Iniciar matriz vacia de ceros Este metodos es muy util para preacolar espacio para guardar nuevas matrices
Transposicion B.transpose()
Suma A + B
Multiplicacion escalar y matricial 2 * A y A*B
Vectores (Opcional)

Con esto seria posible hacer algebra lineal
Metodos especiales de clase...
Para hacer esto es posible usar metodos especiales de clase __getitem, __setitem__, __add__, __mul__, __str__. Teoricamente es posible hacer todo sin estos metodos especiales, pero, por ejemplo, es mucho mas agradable escribir A[i,j] que A.get(i,j) o A.setitem(i,j,newval) que A[i,j] = newval.
1. Un metodo para imprimir mejor...
Necesitamos agregar un metodo de impresion. Noten que un array de numpy se imprime bonito comparado con el nuestro
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
En numpy podemos saber la dimension de un array con el campo shape de numpy
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Es posible sumar matrices y multiplicarlas por escalares
Can you write Python code for it?

B + 2*B # Python sabe sumar y multiplicar arrays como algebra lineal


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
HONESTAMENTE NO PODRIA SER MAS COOL!
Ahora veamos el error si las dimensiones no cuadran.
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Lo que el codigo anterior hace es asociar al nombre np todas las herramientas de la libreria numpy. Ahora podremos llamar funciones de numpy como np.<numpy_fun>. El nombre np es opcional, pueden cambiarlo pero necesitaran ese nombre para acceder a las funciones de numpy como <new_name>.<numpy_fun>. Otra opcion es solo inlcuir import numpy, en cuya caso las funciones se llaman como numpy.<numpy_fun>. Para saber mas del sistema de modulos pueden revisar la liga https://docs.python.org/2/tutorial/modules.html
I. Creando una clase Array
Python incluye nativo el uso de listas (e.g. x = [1,2,3]). El problema es que las listas no son herramientas de computo numerico, Python ni siquiera entiende una suma de ellas. De hecho, la suma la entiende como concatenacion:
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Los arrays the numpy pueden accesarse con indices y slices
Una entrada especifica:
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Numpy es listo manejando listas simples como vectores
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Para poder acceder a un index un metodo __getitem__.
Can you write Python code for it?

class Array:
    "Una clase minima para algebra lineal"
    def __init__(self, list_of_rows):
        "Constructor y validador"
        # obtener dimensiones
        self.data = list_of_rows
        nrow = len(list_of_rows)
        #  ___caso vector: redimensionar correctamente
        if not isinstance(list_of_rows[0], list):
            nrow = 1
            self.data = [[x] for x in list_of_rows]
        # ahora las columnas deben estar bien aunque sea un vector
        ncol = len(self.data[0])
        self.shape = (nrow, ncol)
        # validar tamano correcto de filas
        if any([len(r) != ncol for r in self.data]):
            raise Exception("Las filas deben ser del mismo tamano")

    def __getitem__(self, idx):
        return self.data[idx[0]][idx[1]]

A = Array([[1,2],[3,4]])
A[0,1]


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Por que estas diferencias? Python secretamente busca un metodo llamado __repr__ cuando un objeto es llamado sin imprimir explicitamente, y  __str__ cuando se imprime con print explicitamente. Por ejemplo:
Can you write Python code for it?

class TestClass:
    def __init__(self):
        pass # this means do nothing in Python
    def say_hi(self):
        print("Hey, I am just a normal method saying hi!")
    def __repr__(self):
        return "I am the special class method REPRESENTING a TestClass without printing"
    def __str__(self):
        return "I am the special class method for explicitly PRINTING a TestClass object"

x = TestClass()

x.say_hi()

x

print(x)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Un subbloque (notar que un slice n:m es n,n+1,...,m-1
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Una columna entera:
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Una fila entera:
Can you write Python code for it?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 1.ipynb".
The first task is:
Vamos a construir una clase Array que incluye a las matrices y a los vectores. Desde el punto de vista computacional, un vector es una matriz de una columna. En clase vimos que conviene pensar a las matrices como transformacion de vectores, sin embargo, desde el punto de vista computacional, como la regla de suma y multiplicacion es similar, conviene pensarlos ambos como arrays, que es el nombre tradicional en programacion
Computacionalmente, que es un array? Tecnicamente, es una lista de listas, todas del mismo tamano, cada uno representando una fila (fila o columna es optativo, haremos filas porque asi lo hace numpy, pero yo previero columnas). Por ejemplo, la lista de listas
[[1,2,3],[4,5,6]]
Corresponde a la matriz
$$
\begin{bmatrix} 1 & 2 & 3 \ 4 & 5 & 6  \end{bmatrix}
$$
The numpy way
Can you write Python code for it?

B = np.array([[1,2,3], [4,5,6]]) # habiendo corrido import numpy as np


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:

Se comienza por postular a la forma del valor esperado del sat_score $ \mathbf y $ condicional a las study_hours $ \mathbf x $ como una relación lineal (MPL) en el cual si se puede asumir que $ \mathbf E(\vec{u} \mid \vec{x})=0 $ , se tiene:

$$ \vec{y} = \vec{ \beta } \vec{x} + \vec{u} \Rightarrow E( \vec{y} \mid \vec{x} ) = \vec{ \beta} \vec{x} $$

Con:

$$ \vec{ \beta } = (1, \beta_{1}, ... , \beta_{n}) $$

Por lo que, el problema que se desea resolver es el siguiente:

$$ \mathbf min_{ \vec{ \beta }} E(UU_{T}) = min_{ \vec{ \beta }} E(( \vec{y} - E( \vec{y} \mid \vec{x}))^2) $$

Con función objetivo: $ \mathbf E(( \vec{y}- \vec{ \beta } \vec{x})( \vec{y}- \vec{ \beta } \vec{x})^{T}) $

El gradiente de este problema se encuentra al derivar con respecto a $ \vec{ \beta } $ la funcion objetivo:

$$ \bigtriangledown_{ \vec{ \beta } } = \frac{\partial  E(( \vec{y}- \vec{ \beta } \vec{x})( \vec{y}- \vec{ \beta } \vec{x})^{T}) }{\partial \vec{ \beta }} $$

La C.P.O de este problema obligan a que en el optimo se cumpla :

$$ \bigtriangledown_{ \vec{ \beta } } = \vec{0} $$

La libreria sklearn ya contiene el modulo de regresion lineal que permite encontrar los coeficientes buscados a travéz del método fit

Can you write Python code for it?

base_reg = np.matrix(base)
X, Y = base_reg[:,0], base_reg[:,1]
mdl = LinearRegression().fit(X, Y)
m = mdl.coef_[0]
b = mdl.intercept_
print("E(Y|X): E(y|x) = {0}E(x) + {1}".format(m,b))


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Aproximaciones de la SVD con distintos valores de k (iv)...
Can you write Python code for it?

k=1000

u_k = u[:,:k]
S_k = S[:k,:k]
vt_k = vt[:k,:]
img_k = np.matmul(u_k,np.matmul(S_k,vt_k))
plt.imshow(img_k, cmap = cm.gray)
plt.show()


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Caso A NO simetrica
Can you write Python code for it?

u, s, vt = linalg.svd(img2, full_matrices=False) #img2 NO es simetrica
print(u.shape)
S = np.diag(s)
print(S.shape)
print(vt.shape)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Caso A simetrica
Can you write Python code for it?

u, s, vt = linalg.svd(img, full_matrices=True) #img es simetrica
print(u.shape)
S = np.diag(s)
print(S.shape)
print(vt.shape)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Comprobamos que el rango de la aproximacion es el mismo
Can you write Python code for it?

img2_rec = np.matmul(np.matmul(u,S),vt)
print(img2_rec.shape)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Comprobamos que el rango de la aproximación es el mismo
Can you write Python code for it?

S=np.diag(s)
img_rec = np.matmul(np.matmul(u,S),vt)
print(img_rec.shape)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Importar un archivo csv usando la libreria pandas y resolver un modelo de minimos cuadrados
Can you write Python code for it?

import pandas as pd
from sklearn.linear_model import LinearRegression

base = pd.read_csv("study_vs_sat.csv", header=0)
print(base.head())
print(base.dtypes)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Jugar con el sistema $ \mathbf Ax=b $ donde $ \mathbf A = [[1,1],[0,0]] $ y $ \mathbf b $ puede tomar distintos valores. ¿Cúal es la imagen de A?¿Qué pasa con la solución a la ecuación si $ \mathbf b $ no esta en la imagen de A, la solución resultante es única?

$ \mathbf Ax=b \rightarrow Img(A) = \left { {y \in \mathbb{R}^{2} : \exists x : Ax=y} \right }  $
Por lo que la solución al sistema consiste en encontrar los valores de $\mathbf  x_{1}, x_{2} $ para los cuales se cumple que:

$$ \begin{pmatrix}
 a, b \
 c, d
\end{pmatrix} \begin{pmatrix}
 x_{1} \
 x_{2}
\end{pmatrix} =  \begin{pmatrix}
 b_{1} \
 b_{2}
\end{pmatrix} $$
$$ \rightarrow
ax_{1}+bx_{2} = b_{1} \cap  cx_{1}+dx_{2} = b_{2} $$

Por lo que si $ \mathbf c=0,d=0,b_{2}=1 $ $ \mathbf b \notin Img(A) $

Pues tendría suceder:

$$ \mathbf x_{1}+x_{2}=1 $$

 y

$$ 0=1 $$
 $$ \rightarrow \mathbf Img(A) =\left {   {y \in \mathbb{R}^{2} : y_{1} \in \mathbb{R} \cap 1 = 0} \right } $$

 Si $\mathbf b $ no se encuentra en la $\mathbf Img(A) $  es necesario encontrar una proyección de este vector en el espacio generado por las columnas de la matriz $\mathbf A$, generalmente se usa a la matriz de proyección:

$$\mathbf P_{x} = x \left[  xx^{T}  \right]^{-1} x^{T} $$

Lo que implica que:

$$  \widehat{b} \mathbf = AP_{x} = A \left( x \left[  xx^{T}  \right]^{-1} x^{T} \right) $$

Para resolver este sistema se utiliza el método de mínimos cuadrados y la solución del método es única

Matriz A con determinante igual a 0:

En este caso la solución es {$  \mathbf x \in \mathbb{R}^{2} : x_{1}+x_{2}=1 \cap $ ¡$ 1=0 $! $ $}

Que significa que el vector $ \mathbf b \notin Img(A) $
Can you write Python code for it?

# Usemos nuestras funciones para jugar con distintos valores de b
A = np.array([[1,1],[0,0]])
b = np.array([1,1])
x = resuelve_ec(A,b)
print(x)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
La SVD sirve para almacenar de forma mas compacta imagenes ya que la matriz de aproximación de grado k contiene la información necesaria para replicar la imagen original
II) Aplicaciones de la pseudoinversa en resolucion de sistemas de ecuaciones
Programar una funcion que dada cualquier matriz devuelva la pseudoinversa usando la descomposición SVD (i). Hacer otra funcion que resuleva sistemas de ecuaciones de la forma $\mathbf b=A\overrightarrow{x} $ usando la pseudoinversa (ii)
Can you write Python code for it?

#Primero hagamosla para una matriz particular y despues veamos el tema de la generalización. Sea A una matriz cualquiera:
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
Au, As, Avt = linalg.svd(A, full_matrices=True)
#As = np.diag(As)
A_inv = np.linalg.inv(A)
Au_inv = np.linalg.inv(Au)
As_inv = np.diag(np.array([1/x if x != 0 else 0 for x in As]))
Avt_inv = np.linalg.inv(Avt)
print('                 A_inv')
print(A_inv)
print('                 Au_inv')
print(Au_inv)
print('                 As_inv')
print(As_inv)
print('                 Avt_inv')
print(Avt_inv)

#Verificacion del calculo de las inversas
print('         Au y Au inversa')
print(np.dot(Au,Au_inv))
print('         As y As inversa')
print(np.dot(As,As_inv))
print('         Avt y Avt inversa')
print(np.dot(Avt,Avt_inv))


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
La definición de la psuedo inversa es la siguiente. Partiendo de la SVD $ \mathbf A = U \Sigma V^{T} $ por lo que la pseudoinversa de A será $ A^{+}=V \Sigma^{-1} U^{T} $
Can you write Python code for it?

#NO ME DA PREGUNTAR MAÑANA
A_pseudo_inv = np.dot(Avt_inv,np.dot(As_inv,Au_inv))
print("           Metodo propio")
print (A_pseudo_inv)
print("           Metodo numpy ")
print(A_inv)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
La función:
Can you write Python code for it?

def get_pseudoinverse(matriz):
    "Regresa la pseudo inversa de la matriz dada"
    Au, As, Avt = linalg.svd(matriz, full_matrices=True)
    #As = np.diag(As)
    Au_inv = Au.transpose()
    As_inv = np.diag(np.array([1/x if x!=0 else 0 for x in As]))
    Avt_inv = Avt.transpose()

    pseudo_matriz = np.dot(Avt_inv,np.dot(As_inv, Au_inv))

    return pseudo_matriz


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Le cortamos unos pedazos a la matriz y generamos una nueva
Can you write Python code for it?

img2 = img[5:70,0:70]
plt.imshow(img2, cmap = cm.gray)
plt.show()

?imread

img.shape

img2.shape


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Matriz A con determinante distinto de 0:

En este caso la solución es {$  \mathbf x \in \mathbb{R}^{2} : x_{1}+x_{2}=1 \cap  1=e^{-32}x_{2}  $}

Que significa que el vector $ \mathbf b \in Img(A) $
Can you write Python code for it?

A = np.array([[1,1],[0,1e-32]])
b = np.array([1,1])
y = resuelve_ec(A,b)
x = np.linalg.solve(A,b)
print(y)
print(x)


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Realizar y verificar la descomposición SVD (iii)
Can you write Python code for it?

?linalg.svd #Full SVD reconstruction means diagonlization? Reduced SVD reconstruction means SVD?


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Verifiquemos que sirve...
Can you write Python code for it?

A = np.array([[1,2],[2,1]])
b = np.array([3,3])
print('\n  matriz A =\n',A,'\n  b=',b)
x = resuelve_ec(A,b)
print('\n  x = ',x)
y = np.dot(A,x)
print('\n  Ax = ',y)


#Verifiquemos que sirve
A = np.array([[1,2,4],[1,4,6],[2,1,6]])
Ainv = get_pseudoinverse(A)
iden = np.dot(A,Ainv)
print("La matriz A por su pseudoinversa debe ser la identidad")
iden


I am working on the file "Alumnos/EduardoHidalgo/Tarea 2 Ejercicios Phyton.ipynb".
The first task is:
Y, graficamos la aproximación SVD...
Can you write Python code for it?

plt.imshow(img2_rec, cmap = cm.gray)
plt.show()


I am working on the file "Alumnos/FedericoRiveroll/Tarea2_entregable.ipynb".
The first task is:
Definamos la función de minimización lineal como:

Θ = (X(t)*X).inv * X(t)y

 Donde:

X = vector de nx2; "col_unos y study_hours"

y = vector de nx1; "sat_score"

Θ = vector de 1x2 para obtener escalares minimizadores.
Can you write Python code for it?

X = sat[['col_unos', 'study_hours']]
y = sat[['sat_score']]
Th = np.dot(np.dot(linalg.inv(np.dot(X.T,X)),X.T),y)
Th


I am working on the file "Alumnos/FedericoRiveroll/Tarea2_entregable.ipynb".
The first task is:
Descenso de gradiente
<br>
Cálculo de Theta mediante descenso de gradiente.
Can you write Python code for it?

# m es el número de filas
def descensoGradiente(X, y, theta, alpha, m, numIterations):
    xTrans = X.transpose()
    for i in range(0, numIterations):
        hypothesis = np.dot(X, theta)
        loss = hypothesis - y
        # avg cost per example (the 2 in 2*m doesn't really matter here.
        # But to be consistent with the gradient, I include it)
        cost = np.sum(loss ** 2) / (2 * m)
        #print("Iteration %d | Cost: %f" % (i, cost))
        # avg gradient per example
        gradient = np.dot(xTrans, loss) / m
        # update
        theta = theta - alpha * gradient
    return theta

m, n = np.shape(X)
numIterations= 10000
alpha = 0.003
theta = np.ones(n)
theta = descensoGradiente(X, y['sat_score'], theta, alpha, m, numIterations)

print(theta)


I am working on the file "Alumnos/FedericoRiveroll/Tarea2_entregable.ipynb".
The first task is:
El experimento anerior nos da error por ser una matriz singular, ahora intentamos con A=[[1,1],[0,1e-32]]
Can you write Python code for it?

Eq = np.array([[1, 1, 44],[0, 1e-32, 5]])

A = Eq[:,0:2] # As
b = Eq[:,2] #

U,s,V = linalg.svd(A)
pinv_svd = dot(dot(V.T,linalg.inv(diag(s))),U.T)
xPinv = dot(pinv_svd, b) # Resolviendo Ax=b con x = A^-1*b
xPinv.T


I am working on the file "Alumnos/FedericoRiveroll/Tarea2_entregable.ipynb".
The first task is:
Por lo tanto tenemos que θ es una linea solución óptima que se intersecta el orígen en α = 353.16 y que tiene una pendiente de β = 25.326. De tal modo que:

Hipótesis = X * θ
Can you write Python code for it?

sat.insert(2, "hipotesis", np.dot(X,Th))
sat

import matplotlib.pyplot as plt
import matplotlib
from matplotlib import interactive
from sklearn.preprocessing import MinMaxScaler

interactive(True)
matplotlib.style.use('ggplot')

scaler = MinMaxScaler()
sat[['study_hours', 'sat_score', 'hipotesis']] = scaler.fit_transform(sat[['study_hours', 'sat_score', 'hipotesis']])
sat.plot()

sat


I am working on the file "Alumnos/FedericoRiveroll/Tarea2_entregable.ipynb".
The first task is:
Vemos que tampoco funciona por que da el error de "matriz singular".
Gradiente con PANDAS
Can you write Python code for it?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

sat = pd.read_csv("study_vs_sat.csv")
sat.insert(0, "col_unos", 1)
sat


I am working on the file "Alumnos/FranciscoBahena/Tarea1_Francisco_Bahena.ipynb".
The first task is:
Ejercicio 4
La Transpuesta
Can you write Python code for it?

matrix_prueba = Array([[1,2,3],[4,5,6]])
print(matrix_prueba)
print(matrix_prueba.transpose())


I am working on the file "Alumnos/FranciscoBahena/Tarea1_Francisco_Bahena.ipynb".
The first task is:
Ejercicio 5

implementar radd en la suma para que sume 1 + A = A + 1
implementar sub para la resta  de la forma A-B y A-2

Parte 1
Can you write Python code for it?


I am working on the file "Alumnos/FranciscoBahena/Tarea1_Francisco_Bahena.ipynb".
The first task is:
Parte 2 La resta
Can you write Python code for it?


I am working on the file "Alumnos/FranciscoBahena/Tarea2_Técnica.ipynb".
The first task is:
Ahora usaremos la SVD para aproximar un rango menor de m. K será 100.
Can you write Python code for it?

k=10

u_r = u[:,:k]
S_r = S[:k,:k]
vt_r = vt[:k,:]

matrix_k = np.matmul(u_r, np.matmul(S_r,vt_r))
plt.imshow(matrix_k, cmap='gray')
plt.show()


I am working on the file "Alumnos/FranciscoBahena/Tarea2_Técnica.ipynb".
The first task is:
Comparen la solución anterior con la de la fórmula directa de solución exacta (alpha,beta)=(X^tX)^(-1)X^t*sat_score
Resolvamos por partes, queremos
$((X^{t}X))^{-1}X^{t}$ * study_hours
Sea $ J = ((X^{t}X))^{-1}$
Can you write Python code for it?

J = np.linalg.inv(np.dot(X_array.transpose(), X_array))
K = np.dot(J, X_array.transpose())
sol_vector = np.dot(K, sat_score)
print('Alfa óptima con inversa tradicional es :',sol_vector[0])
print('\n'*1)
print('Beta óptima con inversa tradicional es :', sol_vector[1])
print('La solución es la misma que con la pseudoinversa')


I am working on the file "Alumnos/FranciscoBahena/Tarea2_Técnica.ipynb".
The first task is:
El método de la inversa sí encontró una solución, sin embargo, no es el vector (1,1)
Can you write Python code for it?